diff --git a/AUTHORS b/AUTHORS index 146ef5f..b0f0131 100644 --- a/AUTHORS +++ b/AUTHORS
@@ -308,6 +308,7 @@ Julien Brianceau <jbriance@cisco.com> Julien Isorce <j.isorce@samsung.com> Julien Racle <jracle@logitech.com> +Jun Fang <jun_fang@foxitsoftware.com> Jun Jiang <jun.a.jiang@intel.com> Junchao Han <junchao.han@intel.com> JungJik Lee <jungjik.lee@samsung.com> @@ -622,6 +623,7 @@ Will Shackleton <w.shackleton@gmail.com> William Xie <william.xie@intel.com> Xiang Long <xiang.long@intel.com> +Xiangze Zhang <xiangze.zhang@intel.com> Xiaolei Yu <dreifachstein@gmail.com> Xinchao He <hexinchao@gmail.com> Xing Zhang <xzhang@adobe.com>
diff --git a/DEPS b/DEPS index 87f4393..e7d58f2 100644 --- a/DEPS +++ b/DEPS
@@ -39,11 +39,11 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling Skia # and whatever else without interference from each other. - 'skia_revision': '1c971faab7b201dfcd71b2d684c79b6aa5c2fafd', + 'skia_revision': '382f8bdbf0698d80c2cc64112205ab18aafab2dd', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling V8 # and whatever else without interference from each other. - 'v8_revision': 'e85d78f698d3154965152feaf1eac45c50ab6139', + 'v8_revision': 'e77121fbdaaa3cdd9430a8848a8315ec9fdf99ac', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling swarming_client # and whatever else without interference from each other. @@ -55,7 +55,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling build tools # and whatever else without interference from each other. - 'buildtools_revision': '11961c21510b90aa6057064459a1af53f3fff449', + 'buildtools_revision': 'be55b9ad86a4a5f760895984f93f76038e08e29e', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling PDFium # and whatever else without interference from each other. @@ -187,7 +187,7 @@ Var('chromium_git') + '/chromium/third_party/ffmpeg.git' + '@' + '2ab535183e2fca15d37be86bf0edf5aa8c6767cf', 'src/third_party/libjingle/source/talk': - Var('chromium_git') + '/external/webrtc/trunk/talk.git' + '@' + 'b62ca7e76805b8d87795c73fcdd5dd1457c14461', # commit position 11358 + Var('chromium_git') + '/external/webrtc/trunk/talk.git' + '@' + '420a246d446c65c44896c5cdda2c0629a8b506dd', # commit position 11412 'src/third_party/usrsctp/usrsctplib': Var('chromium_git') + '/external/github.com/sctplab/usrsctp' + '@' + 'c60ec8b35c3fe6027d7a3faae89d1c8d7dd3ce98', @@ -211,7 +211,7 @@ Var('chromium_git') + '/native_client/src/third_party/scons-2.0.1.git' + '@' + '1c1550e17fc26355d08627fbdec13d8291227067', 'src/third_party/webrtc': - Var('chromium_git') + '/external/webrtc/trunk/webrtc.git' + '@' + '7e9eaecd39e852d091b33e2d31a1681475fcc85b', # commit position 11357 + Var('chromium_git') + '/external/webrtc/trunk/webrtc.git' + '@' + '6ca529d1b2981662deef6d15c31a31438dde9e15', # commit position 11409 'src/third_party/openmax_dl': Var('chromium_git') + '/external/webrtc/deps/third_party/openmax.git' + '@' + Var('openmax_dl_revision'), @@ -271,7 +271,7 @@ 'src/third_party/catapult': Var('chromium_git') + '/external/github.com/catapult-project/catapult.git' + '@' + - 'e8c9e565cd60296598c1bc64e4fc17a0c90e024e', + '10c9089edd1ceaf197a24f28845f85f3ce338f12', 'src/third_party/openh264/src': Var('chromium_git') + '/external/github.com/cisco/openh264' + '@' + 'b37cda248234162033e3e11b0335f3131cdfe488',
diff --git a/PRESUBMIT.py b/PRESUBMIT.py index c07cb44..c5fb69f1 100644 --- a/PRESUBMIT.py +++ b/PRESUBMIT.py
@@ -1081,6 +1081,7 @@ r"^sandbox[\\\/]linux[\\\/].*", r"^tools[\\\/]", r"^ui[\\\/]aura[\\\/]bench[\\\/]bench_main\.cc$", + r"^ui[\\\/]ozone[\\\/]platform[\\\/]cast[\\\/]", r"^storage[\\\/]browser[\\\/]fileapi[\\\/]" + r"dump_file_system.cc$",)) source_file_filter = lambda x: input_api.FilterSourceFile(
diff --git a/ash/accelerators/key_hold_detector.cc b/ash/accelerators/key_hold_detector.cc index 0c8d1ed..9139150 100644 --- a/ash/accelerators/key_hold_detector.cc +++ b/ash/accelerators/key_hold_detector.cc
@@ -7,7 +7,7 @@ #include <utility> #include "ash/shell.h" -#include "base/message_loop/message_loop.h" +#include "base/thread_task_runner_handle.h" #include "ui/aura/window_tracker.h" #include "ui/aura/window_tree_host.h" #include "ui/events/event_dispatcher.h" @@ -37,7 +37,7 @@ scoped_ptr<aura::WindowTracker> tracker(new aura::WindowTracker); tracker->Add(static_cast<aura::Window*>(event->target())); - base::MessageLoopForUI::current()->PostTask( + base::ThreadTaskRunnerHandle::Get()->PostTask( FROM_HERE, base::Bind(&DispatchPressedEvent, pressed_event, base::Passed(&tracker))); }
diff --git a/ash/display/display_animator_chromeos.cc b/ash/display/display_animator_chromeos.cc index 572c013..0d9636ca 100644 --- a/ash/display/display_animator_chromeos.cc +++ b/ash/display/display_animator_chromeos.cc
@@ -8,6 +8,7 @@ #include "ash/shell_window_ids.h" #include "base/bind.h" #include "base/stl_util.h" +#include "base/thread_task_runner_handle.h" #include "base/time/time.h" #include "ui/aura/window.h" #include "ui/aura/window_event_dispatcher.h" @@ -40,9 +41,9 @@ void OnSingleTaskCompleted() { completed_counter_++; if (completed_counter_ >= observer_list_.size()) { - base::MessageLoopForUI::current()->DeleteSoon(FROM_HERE, this); + base::ThreadTaskRunnerHandle::Get()->DeleteSoon(FROM_HERE, this); if (!animation_aborted_) - base::MessageLoopForUI::current()->PostTask(FROM_HERE, callback_); + base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, callback_); } }
diff --git a/ash/display/display_manager.cc b/ash/display/display_manager.cc index f46fff7..d403857 100644 --- a/ash/display/display_manager.cc +++ b/ash/display/display_manager.cc
@@ -29,6 +29,7 @@ #include "base/strings/string_split.h" #include "base/strings/stringprintf.h" #include "base/strings/utf_string_conversions.h" +#include "base/thread_task_runner_handle.h" #include "grit/ash_strings.h" #include "ui/base/l10n/l10n_util.h" #include "ui/gfx/display.h" @@ -1046,10 +1047,9 @@ // ash::Shell::Init() will call this after the compositor is initialized. if (software_mirroring_display_list_.empty() || !delegate_) return; - base::MessageLoopForUI::current()->PostTask( - FROM_HERE, - base::Bind(&DisplayManager::CreateMirrorWindowIfAny, - weak_ptr_factory_.GetWeakPtr())); + base::ThreadTaskRunnerHandle::Get()->PostTask( + FROM_HERE, base::Bind(&DisplayManager::CreateMirrorWindowIfAny, + weak_ptr_factory_.GetWeakPtr())); } scoped_ptr<MouseWarpController> DisplayManager::CreateMouseWarpController(
diff --git a/ash/display/mirror_window_controller.cc b/ash/display/mirror_window_controller.cc index c93bba0..929b8d7 100644 --- a/ash/display/mirror_window_controller.cc +++ b/ash/display/mirror_window_controller.cc
@@ -26,6 +26,7 @@ #include "ash/root_window_settings.h" #include "ash/shell.h" #include "base/strings/stringprintf.h" +#include "base/thread_task_runner_handle.h" #include "ui/aura/client/capture_client.h" #include "ui/aura/env.h" #include "ui/aura/window_delegate.h" @@ -379,7 +380,7 @@ // was deleted as a result of input event (e.g. shortcut), so don't delete // now. if (delay_host_deletion) - base::MessageLoop::current()->DeleteSoon(FROM_HERE, host_info); + base::ThreadTaskRunnerHandle::Get()->DeleteSoon(FROM_HERE, host_info); else delete host_info; }
diff --git a/ash/display/window_tree_host_manager.cc b/ash/display/window_tree_host_manager.cc index f298e9c..486a40ba 100644 --- a/ash/display/window_tree_host_manager.cc +++ b/ash/display/window_tree_host_manager.cc
@@ -33,6 +33,7 @@ #include "base/stl_util.h" #include "base/strings/stringprintf.h" #include "base/strings/utf_string_conversions.h" +#include "base/thread_task_runner_handle.h" #include "ui/aura/client/capture_client.h" #include "ui/aura/client/focus_client.h" #include "ui/aura/client/screen_position_client.h" @@ -643,7 +644,7 @@ // Delete most of root window related objects, but don't delete // root window itself yet because the stack may be using it. controller->Shutdown(); - base::MessageLoop::current()->DeleteSoon(FROM_HERE, controller); + base::ThreadTaskRunnerHandle::Get()->DeleteSoon(FROM_HERE, controller); } void WindowTreeHostManager::OnDisplayRemoved(const gfx::Display& display) {
diff --git a/ash/drag_drop/drag_drop_controller.cc b/ash/drag_drop/drag_drop_controller.cc index ad87b7c5..1ec53aa 100644 --- a/ash/drag_drop/drag_drop_controller.cc +++ b/ash/drag_drop/drag_drop_controller.cc
@@ -13,6 +13,7 @@ #include "base/message_loop/message_loop.h" #include "base/metrics/histogram_macros.h" #include "base/run_loop.h" +#include "base/thread_task_runner_handle.h" #include "ui/aura/client/capture_client.h" #include "ui/aura/env.h" #include "ui/aura/window.h" @@ -222,7 +223,7 @@ if (should_block_during_drag_drop_) { base::RunLoop run_loop; quit_closure_ = run_loop.QuitClosure(); - base::MessageLoopForUI* loop = base::MessageLoopForUI::current(); + base::MessageLoop* loop = base::MessageLoop::current(); base::MessageLoop::ScopedNestableTaskAllower allow_nested(loop); run_loop.Run(); } @@ -501,10 +502,9 @@ ForwardPendingLongTap(); } else { // See comment about this in OnGestureEvent(). - base::MessageLoopForUI::current()->PostTask( - FROM_HERE, - base::Bind(&DragDropController::ForwardPendingLongTap, - weak_factory_.GetWeakPtr())); + base::ThreadTaskRunnerHandle::Get()->PostTask( + FROM_HERE, base::Bind(&DragDropController::ForwardPendingLongTap, + weak_factory_.GetWeakPtr())); } } }
diff --git a/ash/shelf/shelf_tooltip_manager.cc b/ash/shelf/shelf_tooltip_manager.cc index 0f65ee6..66f583f8d 100644 --- a/ash/shelf/shelf_tooltip_manager.cc +++ b/ash/shelf/shelf_tooltip_manager.cc
@@ -10,7 +10,7 @@ #include "ash/shell_window_ids.h" #include "ash/wm/window_animations.h" #include "base/bind.h" -#include "base/message_loop/message_loop.h" +#include "base/thread_task_runner_handle.h" #include "base/time/time.h" #include "base/timer/timer.h" #include "ui/aura/window.h" @@ -326,7 +326,7 @@ } void ShelfTooltipManager::CloseSoon() { - base::MessageLoopForUI::current()->PostTask( + base::ThreadTaskRunnerHandle::Get()->PostTask( FROM_HERE, base::Bind(&ShelfTooltipManager::Close, weak_factory_.GetWeakPtr())); }
diff --git a/ash/shell/content/client/shell_browser_main_parts.cc b/ash/shell/content/client/shell_browser_main_parts.cc index 73bde55..aa13b3b 100644 --- a/ash/shell/content/client/shell_browser_main_parts.cc +++ b/ash/shell/content/client/shell_browser_main_parts.cc
@@ -168,7 +168,7 @@ } bool ShellBrowserMainParts::MainMessageLoopRun(int* result_code) { - base::MessageLoopForUI::current()->Run(); + base::MessageLoop::current()->Run(); return true; }
diff --git a/ash/shell/shell_delegate_impl.cc b/ash/shell/shell_delegate_impl.cc index b7a1858..c750ae4 100644 --- a/ash/shell/shell_delegate_impl.cc +++ b/ash/shell/shell_delegate_impl.cc
@@ -172,7 +172,7 @@ } void ShellDelegateImpl::Exit() { - base::MessageLoopForUI::current()->QuitWhenIdle(); + base::MessageLoop::current()->QuitWhenIdle(); } keyboard::KeyboardUI* ShellDelegateImpl::CreateKeyboardUI() {
diff --git a/ash/shell_unittest.cc b/ash/shell_unittest.cc index f74fdb0..74d29bf 100644 --- a/ash/shell_unittest.cc +++ b/ash/shell_unittest.cc
@@ -23,6 +23,7 @@ #include "ash/wm/root_window_layout_manager.h" #include "ash/wm/window_util.h" #include "base/strings/utf_string_conversions.h" +#include "base/thread_task_runner_handle.h" #include "ui/aura/client/aura_constants.h" #include "ui/aura/env.h" #include "ui/aura/window.h" @@ -361,9 +362,9 @@ // When MenuRunner runs a nested loop the LockScreenAndVerifyMenuClosed // command will fire, check the menu state and ensure the nested menu loop // is exited so that the test will terminate. - base::MessageLoopForUI::current()->PostTask(FROM_HERE, - base::Bind(&ShellTest::LockScreenAndVerifyMenuClosed, - base::Unretained(this))); + base::ThreadTaskRunnerHandle::Get()->PostTask( + FROM_HERE, base::Bind(&ShellTest::LockScreenAndVerifyMenuClosed, + base::Unretained(this))); EXPECT_EQ(views::MenuRunner::NORMAL_EXIT, menu_runner->RunMenuAt(widget,
diff --git a/ash/system/chromeos/brightness/tray_brightness.cc b/ash/system/chromeos/brightness/tray_brightness.cc index 3e8b3309..2a8e621 100644 --- a/ash/system/chromeos/brightness/tray_brightness.cc +++ b/ash/system/chromeos/brightness/tray_brightness.cc
@@ -18,8 +18,8 @@ #include "ash/system/tray/tray_constants.h" #include "ash/wm/maximize_mode/maximize_mode_controller.h" #include "base/bind.h" -#include "base/message_loop/message_loop.h" #include "base/strings/utf_string_conversions.h" +#include "base/thread_task_runner_handle.h" #include "chromeos/dbus/dbus_thread_manager.h" #include "chromeos/dbus/power_manager_client.h" #include "grit/ash_resources.h" @@ -180,10 +180,9 @@ weak_ptr_factory_(this) { // Post a task to get the initial brightness; the BrightnessControlDelegate // isn't created yet. - base::MessageLoopForUI::current()->PostTask( - FROM_HERE, - base::Bind(&TrayBrightness::GetInitialBrightness, - weak_ptr_factory_.GetWeakPtr())); + base::ThreadTaskRunnerHandle::Get()->PostTask( + FROM_HERE, base::Bind(&TrayBrightness::GetInitialBrightness, + weak_ptr_factory_.GetWeakPtr())); chromeos::DBusThreadManager::Get()->GetPowerManagerClient()-> AddObserver(this); }
diff --git a/ash/system/chromeos/network/network_state_list_detailed_view.cc b/ash/system/chromeos/network/network_state_list_detailed_view.cc index ff68bac..f45ce15 100644 --- a/ash/system/chromeos/network/network_state_list_detailed_view.cc +++ b/ash/system/chromeos/network/network_state_list_detailed_view.cc
@@ -27,9 +27,9 @@ #include "ash/system/tray/tray_popup_header_button.h" #include "ash/system/tray/tray_popup_label_button.h" #include "base/command_line.h" -#include "base/message_loop/message_loop.h" #include "base/strings/string_number_conversions.h" #include "base/strings/utf_string_conversions.h" +#include "base/thread_task_runner_handle.h" #include "base/time/time.h" #include "chromeos/chromeos_switches.h" #include "chromeos/login/login_state.h" @@ -820,7 +820,7 @@ VLOG(1) << "Requesting Network Scan."; NetworkHandler::Get()->network_state_handler()->RequestScan(); // Periodically request a scan while this UI is open. - base::MessageLoopForUI::current()->PostDelayedTask( + base::ThreadTaskRunnerHandle::Get()->PostDelayedTask( FROM_HERE, base::Bind(&NetworkStateListDetailedView::CallRequestScan, AsWeakPtr()), base::TimeDelta::FromSeconds(kRequestScanDelaySeconds));
diff --git a/ash/system/tray/system_tray_bubble.cc b/ash/system/tray/system_tray_bubble.cc index 6f95ba2..eab4b1c 100644 --- a/ash/system/tray/system_tray_bubble.cc +++ b/ash/system/tray/system_tray_bubble.cc
@@ -11,7 +11,7 @@ #include "ash/system/tray/tray_bubble_wrapper.h" #include "ash/system/tray/tray_constants.h" #include "ash/system/tray/tray_popup_item_container.h" -#include "base/message_loop/message_loop.h" +#include "base/thread_task_runner_handle.h" #include "ui/aura/window.h" #include "ui/compositor/layer.h" #include "ui/compositor/layer_animation_observer.h" @@ -49,7 +49,7 @@ ~AnimationObserverDeleteLayer() override {} void OnImplicitAnimationsCompleted() override { - base::MessageLoopForUI::current()->DeleteSoon(FROM_HERE, this); + base::ThreadTaskRunnerHandle::Get()->DeleteSoon(FROM_HERE, this); } private:
diff --git a/ash/system/web_notification/web_notification_tray.cc b/ash/system/web_notification/web_notification_tray.cc index 4b3c0b5..b6fe9444 100644 --- a/ash/system/web_notification/web_notification_tray.cc +++ b/ash/system/web_notification/web_notification_tray.cc
@@ -22,6 +22,7 @@ #include "base/i18n/number_formatting.h" #include "base/i18n/rtl.h" #include "base/strings/utf_string_conversions.h" +#include "base/thread_task_runner_handle.h" #include "grit/ash_strings.h" #include "ui/aura/window.h" #include "ui/aura/window_event_dispatcher.h" @@ -445,7 +446,7 @@ // consecutively, and calling Update in the middle of those events will show // intermediate unread counts for a moment. should_update_tray_content_ = true; - base::MessageLoop::current()->PostTask( + base::ThreadTaskRunnerHandle::Get()->PostTask( FROM_HERE, base::Bind(&WebNotificationTray::UpdateTrayContent, AsWeakPtr())); }
diff --git a/ash/wm/overview/window_selector_unittest.cc b/ash/wm/overview/window_selector_unittest.cc index 54cbb9da..a72c77eb 100644 --- a/ash/wm/overview/window_selector_unittest.cc +++ b/ash/wm/overview/window_selector_unittest.cc
@@ -37,6 +37,7 @@ #include "base/strings/string_piece.h" #include "base/strings/utf_string_conversions.h" #include "base/test/user_action_tester.h" +#include "base/thread_task_runner_handle.h" #include "ui/aura/client/aura_constants.h" #include "ui/aura/client/cursor_client.h" #include "ui/aura/client/focus_client.h" @@ -1192,10 +1193,11 @@ ash::DragDropController* drag_drop_controller = shell_test_api.drag_drop_controller(); ui::OSExchangeData data; - base::MessageLoopForUI::current()->PostTask(FROM_HERE, - base::Bind(&WindowSelectorTest::ToggleOverview, - base::Unretained(this))); - base::MessageLoopForUI::current()->PostTask(FROM_HERE, + base::ThreadTaskRunnerHandle::Get()->PostTask( + FROM_HERE, + base::Bind(&WindowSelectorTest::ToggleOverview, base::Unretained(this))); + base::ThreadTaskRunnerHandle::Get()->PostTask( + FROM_HERE, base::Bind(&CancelDrag, drag_drop_controller, &drag_canceled_by_test)); data.SetString(base::UTF8ToUTF16("I am being dragged")); drag_drop_controller->StartDragAndDrop(data, window->GetRootWindow(),
diff --git a/ash/wm/toplevel_window_event_handler.cc b/ash/wm/toplevel_window_event_handler.cc index 1b7ae90..c7a00c27 100644 --- a/ash/wm/toplevel_window_event_handler.cc +++ b/ash/wm/toplevel_window_event_handler.cc
@@ -421,7 +421,7 @@ in_move_loop_ = true; bool destroyed = false; destroyed_ = &destroyed; - base::MessageLoopForUI* loop = base::MessageLoopForUI::current(); + base::MessageLoop* loop = base::MessageLoop::current(); base::MessageLoop::ScopedNestableTaskAllower allow_nested(loop); base::RunLoop run_loop; quit_closure_ = run_loop.QuitClosure();
diff --git a/ash/wm/toplevel_window_event_handler_unittest.cc b/ash/wm/toplevel_window_event_handler_unittest.cc index 749d5fc..55129eb 100644 --- a/ash/wm/toplevel_window_event_handler_unittest.cc +++ b/ash/wm/toplevel_window_event_handler_unittest.cc
@@ -14,7 +14,6 @@ #include "ash/wm/window_util.h" #include "ash/wm/workspace_controller.h" #include "base/compiler_specific.h" -#include "base/message_loop/message_loop.h" #include "base/thread_task_runner_handle.h" #include "testing/gtest/include/gtest/gtest.h" #include "ui/aura/client/aura_constants.h" @@ -718,11 +717,10 @@ aura::client::WindowMoveClient* move_client = aura::client::GetWindowMoveClient(window->GetRootWindow()); - base::MessageLoopForUI::current()->PostTask( + base::ThreadTaskRunnerHandle::Get()->PostTask( FROM_HERE, base::Bind(&SendMouseReleaseAndReleaseCapture, - base::Unretained(&generator), - base::Unretained(window.get()))); + base::Unretained(&generator), base::Unretained(window.get()))); EXPECT_EQ(aura::client::MOVE_SUCCESSFUL, move_client->RunMoveLoop(window.get(), gfx::Vector2d(), aura::client::WINDOW_MOVE_SOURCE_MOUSE));
diff --git a/ash/wm/workspace/workspace_event_handler_unittest.cc b/ash/wm/workspace/workspace_event_handler_unittest.cc index 2d9ecc3..5c5e6a8 100644 --- a/ash/wm/workspace/workspace_event_handler_unittest.cc +++ b/ash/wm/workspace/workspace_event_handler_unittest.cc
@@ -12,6 +12,7 @@ #include "ash/wm/wm_event.h" #include "ash/wm/workspace_controller.h" #include "ash/wm/workspace_controller_test_helper.h" +#include "base/thread_task_runner_handle.h" #include "ui/aura/client/aura_constants.h" #include "ui/aura/test/test_window_delegate.h" #include "ui/aura/window.h" @@ -457,7 +458,7 @@ delegate.set_window_component(HTCAPTION); ASSERT_TRUE(aura::client::GetWindowMoveClient(window->GetRootWindow())); - base::MessageLoop::current()->DeleteSoon(FROM_HERE, window.get()); + base::ThreadTaskRunnerHandle::Get()->DeleteSoon(FROM_HERE, window.get()); aura::client::GetWindowMoveClient(window->GetRootWindow()) ->RunMoveLoop(window.release(), gfx::Vector2d(),
diff --git a/build/android/pylib/utils/emulator.py b/build/android/pylib/utils/emulator.py index 4007f1a2..089fcb6 100644 --- a/build/android/pylib/utils/emulator.py +++ b/build/android/pylib/utils/emulator.py
@@ -39,7 +39,7 @@ hw.device.hash=-708107041 hw.camera.back=none disk.dataPartition.size=800M -hw.gpu.enabled=yes +hw.gpu.enabled={gpu} skin.path=720x1280 skin.dynamic=yes hw.keyboard=yes @@ -331,6 +331,7 @@ custom_config = custom_config.replace(key, replacements[key]) custom_config = custom_config.replace('{api.level}', str(api_level)) custom_config = custom_config.replace('{sdcard.size}', self.sdcard_size) + custom_config.replace('{gpu}', 'no' if self.headless else 'yes') with open(new_config_ini, 'w') as new_config_ini: new_config_ini.write(custom_config) @@ -388,12 +389,14 @@ '-no-audio', '-no-window' ]) + else: + emulator_command.extend([ + '-gpu', 'on' + ]) emulator_command.extend([ # Use a familiar name and port. '-avd', self.avd_name, '-port', str(port), - # Enable GPU by default. - '-gpu', 'on', # all the argument after qemu are sub arguments for qemu '-qemu', '-m', '1024', ])
diff --git a/cc/trees/layer_tree_host.cc b/cc/trees/layer_tree_host.cc index bff00c01..1b68c46 100644 --- a/cc/trees/layer_tree_host.cc +++ b/cc/trees/layer_tree_host.cc
@@ -820,17 +820,14 @@ device_scale_factor_); } - - TRACE_EVENT0("cc", "LayerTreeHost::UpdateLayers::CalcDrawProps"); - - LayerTreeHostCommon::PreCalculateMetaInformation(root_layer); - gfx::Transform identity_transform; LayerList update_layer_list; { + TRACE_EVENT0("cc", "LayerTreeHost::UpdateLayers::BuildPropertyTrees"); TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("cc.debug.cdp-perf"), "LayerTreeHostCommon::ComputeVisibleRectsWithPropertyTrees"); + LayerTreeHostCommon::PreCalculateMetaInformation(root_layer); bool can_render_to_separate_surface = true; BuildPropertyTreesAndComputeVisibleRects( root_layer, page_scale_layer, inner_viewport_scroll_layer_.get(),
diff --git a/chrome/VERSION b/chrome/VERSION index b4218253b..ab9291c 100644 --- a/chrome/VERSION +++ b/chrome/VERSION
@@ -1,4 +1,4 @@ MAJOR=50 MINOR=0 -BUILD=2633 +BUILD=2634 PATCH=0
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/SwipeRefreshHandler.java b/chrome/android/java/src/org/chromium/chrome/browser/SwipeRefreshHandler.java index 2e852f2..1f030db 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/SwipeRefreshHandler.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/SwipeRefreshHandler.java
@@ -97,6 +97,13 @@ RecordUserAction.record("MobilePullGestureReload"); } }); + mSwipeRefreshLayout.setOnResetListener(new SwipeRefreshLayout.OnResetListener() { + @Override + public void onReset() { + detachSwipeRefreshLayoutIfNecessary(); + } + }); + contentViewCore.setOverscrollRefreshHandler(this); } @@ -136,7 +143,6 @@ public void reset() { cancelStopRefreshingRunnable(); mSwipeRefreshLayout.reset(); - detachSwipeRefreshLayoutIfNecessary(); } @Override @@ -173,7 +179,6 @@ } private void detachSwipeRefreshLayoutIfNecessary() { - // TODO(jdduke): Also detach the effect when its animation ends. if (mContentViewCore == null) return; if (mSwipeRefreshLayout.getParent() != null) { mContentViewCore.getContainerView().removeView(mSwipeRefreshLayout);
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd index 77504ae2..341d731 100644 --- a/chrome/app/generated_resources.grd +++ b/chrome/app/generated_resources.grd
@@ -7738,7 +7738,7 @@ Blocked </message> <message name="IDS_BLOCK_INTERSTITIAL_SEND_FEEDBACK" desc="The text for a link to submit feedback about a blocked site."> - Was this unexpected? Tell us about it! + Was this unexpected? <ph name="BEGIN_LINK"><a is="action-link" id="feedback-link"></ph>Let us know<ph name="END_LINK"></a></ph> </message> <message name="IDS_BLOCK_INTERSTITIAL_SHOW_DETAILS" desc="The text for the link to show details about the interstitial."> Details
diff --git a/chrome/app/settings_strings.grdp b/chrome/app/settings_strings.grdp index 004eed4..75fcfe04 100644 --- a/chrome/app/settings_strings.grdp +++ b/chrome/app/settings_strings.grdp
@@ -279,7 +279,7 @@ Downloads </message> <message name="IDS_SETTINGS_DOWNLOAD_LOCATION" desc="Label for the input which allows the user to specify the default download directory."> - Download location: + Location </message> <message name="IDS_SETTINGS_CHANGE_DOWNLOAD_LOCATION" desc="Text for the button which allows the user to change the default download directory."> Change @@ -287,6 +287,9 @@ <message name="IDS_SETTINGS_PROMPT_FOR_DOWNLOAD" desc="Label for the checkbox which enables a prompt for the user to choose a download location for each download instead of using the default."> Ask where to save each file before downloading </message> + <message name="IDS_SETTINGS_DISCONNECT_GOOGLE_DRIVE" desc="Label for the checkbox which enables disconnecting from Google Drive account."> + Disconnect Google Drive account + </message> <!-- Date/time Page --> <message name="IDS_SETTINGS_DATE_TIME" desc="Name of the settings page which displays date and time preferences.">
diff --git a/chrome/browser/autofill/autofill_server_browsertest.cc b/chrome/browser/autofill/autofill_server_browsertest.cc index b456ec7..a0d9696 100644 --- a/chrome/browser/autofill/autofill_server_browsertest.cc +++ b/chrome/browser/autofill/autofill_server_browsertest.cc
@@ -22,7 +22,6 @@ #include "content/public/test/test_utils.h" #include "net/url_request/test_url_fetcher_factory.h" #include "testing/gtest/include/gtest/gtest.h" -#include "third_party/zlib/google/compression_utils.h" namespace autofill { namespace { @@ -90,13 +89,6 @@ DISALLOW_COPY_AND_ASSIGN(WindowedNetworkObserver); }; -// Compresses |data| and returns the result. -std::string Compress(const std::string& data) { - std::string compressed_data; - EXPECT_TRUE(compression::GzipCompress(data, &compressed_data)); - return compressed_data; -} - } // namespace class AutofillServerTest : public InProcessBrowserTest { @@ -152,8 +144,7 @@ std::string expected_query_string; ASSERT_TRUE(query.SerializeToString(&expected_query_string)); - WindowedNetworkObserver query_network_observer( - Compress(expected_query_string)); + WindowedNetworkObserver query_network_observer(expected_query_string); ui_test_utils::NavigateToURL( browser(), GURL(std::string(kDataURIPrefix) + kFormHtml)); @@ -183,8 +174,7 @@ std::string expected_upload_string; ASSERT_TRUE(upload.SerializeToString(&expected_upload_string)); - WindowedNetworkObserver upload_network_observer( - Compress(expected_upload_string)); + WindowedNetworkObserver upload_network_observer(expected_upload_string); content::WebContents* web_contents = browser()->tab_strip_model()->GetActiveWebContents(); content::SimulateMouseClick( @@ -221,8 +211,7 @@ std::string expected_query_string; ASSERT_TRUE(query.SerializeToString(&expected_query_string)); - WindowedNetworkObserver query_network_observer( - Compress(expected_query_string)); + WindowedNetworkObserver query_network_observer(expected_query_string); ui_test_utils::NavigateToURL( browser(), GURL(std::string(kDataURIPrefix) + kFormHtml)); query_network_observer.Wait();
diff --git a/chrome/browser/chromeos/login/saml/saml_browsertest.cc b/chrome/browser/chromeos/login/saml/saml_browsertest.cc index f4d855d..0e96325 100644 --- a/chrome/browser/chromeos/login/saml/saml_browsertest.cc +++ b/chrome/browser/chromeos/login/saml/saml_browsertest.cc
@@ -42,7 +42,7 @@ #include "chrome/browser/chromeos/settings/cros_settings.h" #include "chrome/browser/policy/test/local_policy_test_server.h" #include "chrome/browser/profiles/profile.h" -#include "chrome/browser/ui/webui/signin/inline_login_ui.h" +#include "chrome/browser/ui/webui/signin/get_auth_frame.h" #include "chrome/common/chrome_constants.h" #include "chrome/common/chrome_paths.h" #include "chrome/common/chrome_switches.h" @@ -866,8 +866,8 @@ } content::WebContents* SAMLEnrollmentTest::GetEnrollmentContents() { - content::RenderFrameHost* frame_host = InlineLoginUI::GetAuthFrame( - GetLoginUI()->GetWebContents(), GURL(), gaia_frame_parent_); + content::RenderFrameHost* frame_host = + signin::GetAuthFrame(GetLoginUI()->GetWebContents(), gaia_frame_parent_); if (!frame_host) return nullptr; return content::WebContents::FromRenderFrameHost(frame_host);
diff --git a/chrome/browser/chromeos/login/test/oobe_base_test.cc b/chrome/browser/chromeos/login/test/oobe_base_test.cc index 8f480f6..5d5a527 100644 --- a/chrome/browser/chromeos/login/test/oobe_base_test.cc +++ b/chrome/browser/chromeos/login/test/oobe_base_test.cc
@@ -15,7 +15,7 @@ #include "chrome/browser/chromeos/login/ui/webui_login_view.h" #include "chrome/browser/chromeos/net/network_portal_detector_test_impl.h" #include "chrome/browser/lifetime/application_lifetime.h" -#include "chrome/browser/ui/webui/signin/inline_login_ui.h" +#include "chrome/browser/ui/webui/signin/get_auth_frame.h" #include "chrome/common/chrome_paths.h" #include "chrome/common/chrome_switches.h" #include "chromeos/chromeos_switches.h" @@ -245,8 +245,8 @@ } void OobeBaseTest::ExecuteJsInSigninFrame(const std::string& js) { - content::RenderFrameHost* frame = InlineLoginUI::GetAuthFrame( - GetLoginUI()->GetWebContents(), GURL(), gaia_frame_parent_); + content::RenderFrameHost* frame = + signin::GetAuthFrame(GetLoginUI()->GetWebContents(), gaia_frame_parent_); ASSERT_TRUE(content::ExecuteScript(frame, js)); }
diff --git a/chrome/browser/content_settings/content_settings_default_provider_unittest.cc b/chrome/browser/content_settings/content_settings_default_provider_unittest.cc index dbf2c1b..a107c2c6 100644 --- a/chrome/browser/content_settings/content_settings_default_provider_unittest.cc +++ b/chrome/browser/content_settings/content_settings_default_provider_unittest.cc
@@ -189,8 +189,8 @@ ContentSettingsPattern::Wildcard(), CONTENT_SETTINGS_TYPE_COOKIES, std::string(), - value.get()); - EXPECT_FALSE(owned); + value.release()); + EXPECT_TRUE(owned); EXPECT_EQ(CONTENT_SETTING_BLOCK, TestUtils::GetContentSetting( &provider_, GURL(), GURL(), CONTENT_SETTINGS_TYPE_COOKIES,
diff --git a/chrome/browser/content_settings/host_content_settings_map_factory.cc b/chrome/browser/content_settings/host_content_settings_map_factory.cc index 386c277d..c95b1049 100644 --- a/chrome/browser/content_settings/host_content_settings_map_factory.cc +++ b/chrome/browser/content_settings/host_content_settings_map_factory.cc
@@ -61,15 +61,16 @@ DCHECK_CURRENTLY_ON(content::BrowserThread::UI); Profile* profile = static_cast<Profile*>(context); - bool off_the_record = profile->GetProfileType() == Profile::INCOGNITO_PROFILE; // If off the record, retrieve the host content settings map of the parent // profile in order to ensure the preferences have been migrated. - if (off_the_record) + if (profile->GetProfileType() == Profile::INCOGNITO_PROFILE) GetForProfile(profile->GetOriginalProfile()); - scoped_refptr<HostContentSettingsMap> settings_map( - new HostContentSettingsMap(profile->GetPrefs(), off_the_record)); + scoped_refptr<HostContentSettingsMap> settings_map(new HostContentSettingsMap( + profile->GetPrefs(), + profile->GetProfileType() == Profile::INCOGNITO_PROFILE, + profile->GetProfileType() == Profile::GUEST_PROFILE)); #if defined(ENABLE_EXTENSIONS) ExtensionService *ext_service =
diff --git a/chrome/browser/content_settings/host_content_settings_map_unittest.cc b/chrome/browser/content_settings/host_content_settings_map_unittest.cc index 0be5dea..9036309 100644 --- a/chrome/browser/content_settings/host_content_settings_map_unittest.cc +++ b/chrome/browser/content_settings/host_content_settings_map_unittest.cc
@@ -1162,3 +1162,75 @@ std::string(), CONTENT_SETTING_DEFAULT); } + +TEST_F(HostContentSettingsMapTest, GuestProfile) { + TestingProfile profile; + profile.SetGuestSession(true); + HostContentSettingsMap* host_content_settings_map = + HostContentSettingsMapFactory::GetForProfile(&profile); + + GURL host("http://example.com/"); + ContentSettingsPattern pattern = + ContentSettingsPattern::FromString("[*.]example.com"); + + EXPECT_EQ(CONTENT_SETTING_ALLOW, + host_content_settings_map->GetContentSetting( + host, host, CONTENT_SETTINGS_TYPE_IMAGES, std::string())); + + // Changing content settings should not result in any prefs being stored + // however the value should be set in memory. + host_content_settings_map->SetContentSetting( + pattern, ContentSettingsPattern::Wildcard(), CONTENT_SETTINGS_TYPE_IMAGES, + std::string(), CONTENT_SETTING_BLOCK); + EXPECT_EQ(CONTENT_SETTING_BLOCK, + host_content_settings_map->GetContentSetting( + host, host, CONTENT_SETTINGS_TYPE_IMAGES, std::string())); + + const base::DictionaryValue* all_settings_dictionary = + profile.GetPrefs()->GetDictionary( + GetPrefName(CONTENT_SETTINGS_TYPE_IMAGES)); + EXPECT_TRUE(all_settings_dictionary->empty()); +} + +// Default settings should not be modifiable for the guest profile (there is no +// UI to do this). +TEST_F(HostContentSettingsMapTest, GuestProfileDefaultSetting) { + TestingProfile profile; + profile.SetGuestSession(true); + HostContentSettingsMap* host_content_settings_map = + HostContentSettingsMapFactory::GetForProfile(&profile); + + GURL host("http://example.com/"); + + // There are no custom rules, so this should be the default. + EXPECT_EQ(CONTENT_SETTING_ALLOW, + host_content_settings_map->GetContentSetting( + host, host, CONTENT_SETTINGS_TYPE_IMAGES, std::string())); + + host_content_settings_map->SetDefaultContentSetting( + CONTENT_SETTINGS_TYPE_IMAGES, CONTENT_SETTING_BLOCK); + + EXPECT_EQ(CONTENT_SETTING_ALLOW, + host_content_settings_map->GetContentSetting( + host, host, CONTENT_SETTINGS_TYPE_IMAGES, std::string())); +} + +// We used to incorrectly store content settings in prefs for the guest profile. +// We need to ensure these get deleted appropriately. +TEST_F(HostContentSettingsMapTest, GuestProfileMigration) { + TestingProfile profile; + profile.SetGuestSession(true); + + // Set a pref manually in the guest profile. + scoped_ptr<base::Value> value = + base::JSONReader::Read("{\"[*.]\\xC4\\x87ira.com,*\":{\"setting\":1}}"); + profile.GetPrefs()->Set(GetPrefName(CONTENT_SETTINGS_TYPE_IMAGES), *value); + + // Test that during construction all the prefs get cleared. + HostContentSettingsMapFactory::GetForProfile(&profile); + + const base::DictionaryValue* all_settings_dictionary = + profile.GetPrefs()->GetDictionary( + GetPrefName(CONTENT_SETTINGS_TYPE_IMAGES)); + EXPECT_TRUE(all_settings_dictionary->empty()); +}
diff --git a/chrome/browser/download/download_request_limiter_unittest.cc b/chrome/browser/download/download_request_limiter_unittest.cc index 113caca3..3f2514a 100644 --- a/chrome/browser/download/download_request_limiter_unittest.cc +++ b/chrome/browser/download/download_request_limiter_unittest.cc
@@ -112,7 +112,9 @@ &fake_create_callback_); #endif - content_settings_ = new HostContentSettingsMap(profile_->GetPrefs(), false); + content_settings_ = new HostContentSettingsMap( + profile_->GetPrefs(), false /* incognito_profile */, + false /* guest_profile */); DownloadRequestLimiter::SetContentSettingsForTesting( content_settings_.get()); }
diff --git a/chrome/browser/extensions/BUILD.gn b/chrome/browser/extensions/BUILD.gn index 0151136..f05421c 100644 --- a/chrome/browser/extensions/BUILD.gn +++ b/chrome/browser/extensions/BUILD.gn
@@ -105,9 +105,6 @@ rebase_path(gypi_values.chrome_browser_extensions_non_chromeos_sources, ".", "//chrome") - if (is_android) { - sources -= [ "api/messaging/native_process_launcher_posix.cc" ] - } } if (enable_service_discovery) {
diff --git a/chrome/browser/extensions/api/messaging/native_process_launcher_android.cc b/chrome/browser/extensions/api/messaging/native_process_launcher_android.cc deleted file mode 100644 index d6c1b17..0000000 --- a/chrome/browser/extensions/api/messaging/native_process_launcher_android.cc +++ /dev/null
@@ -1,26 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/extensions/api/messaging/native_process_launcher.h" - -namespace extensions { - -// static -base::FilePath NativeProcessLauncher::FindManifest( - const std::string& host_name, - bool allow_user_level_hosts, - std::string* error_message) { - return base::FilePath(); -} - -// static -bool NativeProcessLauncher::LaunchNativeProcess( - const base::CommandLine& command_line, - base::Process* process, - base::File* read_file, - base::File* write_file) { - return false; -} - -} // namespace extensions
diff --git a/chrome/browser/extensions/api/settings_private/prefs_util.cc b/chrome/browser/extensions/api/settings_private/prefs_util.cc index ec10184..7875d716 100644 --- a/chrome/browser/extensions/api/settings_private/prefs_util.cc +++ b/chrome/browser/extensions/api/settings_private/prefs_util.cc
@@ -68,10 +68,15 @@ settings_private::PrefType::PREF_TYPE_BOOLEAN; (*s_whitelist)["browser.show_home_button"] = settings_private::PrefType::PREF_TYPE_BOOLEAN; + + // Downloads settings. (*s_whitelist)["download.default_directory"] = settings_private::PrefType::PREF_TYPE_STRING; (*s_whitelist)["download.prompt_for_download"] = settings_private::PrefType::PREF_TYPE_BOOLEAN; + (*s_whitelist)["gdata.disabled"] = + settings_private::PrefType::PREF_TYPE_BOOLEAN; + (*s_whitelist)["enable_do_not_track"] = settings_private::PrefType::PREF_TYPE_BOOLEAN; (*s_whitelist)["homepage"] = settings_private::PrefType::PREF_TYPE_URL;
diff --git a/chrome/browser/extensions/api/web_view/OWNERS b/chrome/browser/extensions/api/web_view/OWNERS index 0521a45..6ef8aa2 100644 --- a/chrome/browser/extensions/api/web_view/OWNERS +++ b/chrome/browser/extensions/api/web_view/OWNERS
@@ -1,3 +1,4 @@ fsamuel@chromium.org lazyboy@chromium.org wjmaclean@chromium.org +paulmeyer@chromium.org
diff --git a/chrome/browser/file_select_helper.cc b/chrome/browser/file_select_helper.cc index ff1b943..3be51789 100644 --- a/chrome/browser/file_select_helper.cc +++ b/chrome/browser/file_select_helper.cc
@@ -457,13 +457,21 @@ GetSanitizedFileName(params->default_file_name)); #if defined(FULL_SAFE_BROWSING) + std::vector<base::FilePath::StringType> alternate_extensions; + if (select_file_types_) { + for (const auto& extensions : select_file_types_->extensions) { + alternate_extensions.insert(alternate_extensions.end(), + extensions.begin(), extensions.end()); + } + } + // Note that FileChooserParams::requestor is not considered a trusted field // since it's provided by the renderer and not validated browserside. if (params->mode == FileChooserParams::Save && - !params->default_file_name.empty()) { + (!params->default_file_name.empty() || !alternate_extensions.empty())) { GURL requestor = params->requestor; safe_browsing::CheckUnverifiedDownloadPolicy( - requestor, default_file_path, + requestor, default_file_path, alternate_extensions, base::Bind(&FileSelectHelper::ApplyUnverifiedDownloadPolicy, this, default_file_path, base::Passed(¶ms))); return;
diff --git a/chrome/browser/predictors/OWNERS b/chrome/browser/predictors/OWNERS new file mode 100644 index 0000000..7dff4349 --- /dev/null +++ b/chrome/browser/predictors/OWNERS
@@ -0,0 +1,4 @@ +pasko@chromium.org +zhenw@chromium.org +# Not a committer yet, knowledgeable nevertheless: +# gabadie@chromium.org
diff --git a/chrome/browser/resources/device_log_ui/device_log_ui.js b/chrome/browser/resources/device_log_ui/device_log_ui.js index a562ed7e..acee79a 100644 --- a/chrome/browser/resources/device_log_ui/device_log_ui.js +++ b/chrome/browser/resources/device_log_ui/device_log_ui.js
@@ -95,7 +95,12 @@ * @param {Object} data A JSON structure of event log entries. */ var getLogCallback = function(data) { - createEventLog(JSON.parse(data)); + try { + createEventLog(JSON.parse(data)); + } catch(e) { + var container = $('log-container'); + container.textContent = 'No log entries'; + } }; /**
diff --git a/chrome/browser/resources/settings/downloads_page/downloads_page.html b/chrome/browser/resources/settings/downloads_page/downloads_page.html index 2237bebf..44968d75 100644 --- a/chrome/browser/resources/settings/downloads_page/downloads_page.html +++ b/chrome/browser/resources/settings/downloads_page/downloads_page.html
@@ -10,9 +10,9 @@ <link rel="import" type="css" href="downloads_page.css"> <template> <div class="settings-box split first"> - <div class="start layout horizontal center"> - <div id="locationLabel" i18n-content="downloadLocation"></div> - <settings-input id="downloadsPath" no-label-float readonly + <div class="start"> + <settings-input id="downloadsPath" always-flow-label readonly + i18n-values="label:downloadLocation" pref="{{prefs.download.default_directory}}" aria-labelledby="locationLabel"> </settings-input> @@ -25,6 +25,11 @@ <settings-checkbox pref="{{prefs.download.prompt_for_download}}" i18n-values="label:promptForDownload"> </settings-checkbox> +<if expr="chromeos"> + <settings-checkbox pref="{{prefs.gdata.disabled}}" + i18n-values="label:disconnectGoogleDriveAccount"> + </settings-checkbox> +</if> </div> </template> <script src="downloads_page.js"></script>
diff --git a/chrome/browser/resources/settings/settings_resources.grd b/chrome/browser/resources/settings/settings_resources.grd index b33df75..dcbfff1 100644 --- a/chrome/browser/resources/settings/settings_resources.grd +++ b/chrome/browser/resources/settings/settings_resources.grd
@@ -222,7 +222,9 @@ type="chrome_html" /> <structure name="IDR_SETTINGS_DOWNLOADS_PAGE_HTML" file="downloads_page/downloads_page.html" - type="chrome_html" /> + type="chrome_html" + flattenhtml="true" + allowexternalscript="true" /> <structure name="IDR_SETTINGS_DOWNLOADS_PAGE_JS" file="downloads_page/downloads_page.js" type="chrome_html" /> @@ -436,10 +438,10 @@ <structure name="IDR_SETTINGS_SITE_SETTINGS_CATEGORY_JS" file="site_settings/site_settings_category.js" type="chrome_html" /> - <structure name="IDR_SETTINGS_SITE_SETTINGS_CONSTANTS_JS" + <structure name="IDR_SETTINGS_CONSTANTS_JS" file="site_settings/constants.js" type="chrome_html" /> - <structure name="IDR_SETTINGS_SITE_SETTINGS_CONSTANTS_HTML" + <structure name="IDR_SETTINGS_CONSTANTS_HTML" file="site_settings/constants.html" type="chrome_html" /> <structure name="IDR_SETTINGS_SITE_SETTINGS_PAGE_CSS" @@ -451,22 +453,22 @@ <structure name="IDR_SETTINGS_SITE_SETTINGS_PAGE_JS" file="site_settings_page/site_settings_page.js" type="chrome_html" /> - <structure name="IDR_SETTINGS_SITE_SETTINGS_SITE_DETAILS_CSS" + <structure name="IDR_SETTINGS_SITE_DETAILS_CSS" file="site_settings/site_details.css" type="chrome_html" /> - <structure name="IDR_SETTINGS_SITE_SETTINGS_SITE_DETAILS_HTML" + <structure name="IDR_SETTINGS_SITE_DETAILS_HTML" file="site_settings/site_details.html" type="chrome_html" /> - <structure name="IDR_SETTINGS_SITE_SETTINGS_SITE_DETAILS_JS" + <structure name="IDR_SETTINGS_SITE_DETAILS_JS" file="site_settings/site_details.js" type="chrome_html" /> - <structure name="IDR_SETTINGS_SITE_SETTINGS_SITE_DETAILS_PERMISSION_CSS" + <structure name="IDR_SETTINGS_SITE_DETAILS_PERMISSION_CSS" file="site_settings/site_details_permission.css" type="chrome_html" /> - <structure name="IDR_SETTINGS_SITE_SETTINGS_SITE_DETAILS_PERMISSION_HTML" + <structure name="IDR_SETTINGS_SITE_DETAILS_PERMISSION_HTML" file="site_settings/site_details_permission.html" type="chrome_html" /> - <structure name="IDR_SETTINGS_SITE_SETTINGS_SITE_DETAILS_PERMISSION_JS" + <structure name="IDR_SETTINGS_SITE_DETAILS_PERMISSION_JS" file="site_settings/site_details_permission.js" type="chrome_html" /> <structure name="IDR_SETTINGS_SEARCH_ENGINES_PAGE_SEARCH_ENGINE_ADDER_JS" @@ -548,6 +550,12 @@ <structure name="IDR_SETTINGS_SETTINGS_JS" file="settings.js" type="chrome_html" /> + <structure name="IDR_SETTINGS_WEBSITE_USAGE_PRIVATE_API_HTML" + file="site_settings/website_usage_private_api.html" + type="chrome_html" /> + <structure name="IDR_SETTINGS_WEBSITE_USAGE_PRIVATE_API_JS" + file="site_settings/website_usage_private_api.js" + type="chrome_html" /> <if expr="chromeos"> <structure name="IDR_SETTINGS_BLUETOOTH_DEVICE_LIST_ITEM_CSS" file="bluetooth_page/bluetooth_device_list_item.css"
diff --git a/chrome/browser/resources/settings/site_settings/compiled_resources.gyp b/chrome/browser/resources/settings/site_settings/compiled_resources.gyp index 16fa38a..be3c648 100644 --- a/chrome/browser/resources/settings/site_settings/compiled_resources.gyp +++ b/chrome/browser/resources/settings/site_settings/compiled_resources.gyp
@@ -14,6 +14,7 @@ 'constants.js', 'site_settings_behavior.js', 'site_details_permission.js', + 'website_usage_private_api.js', ], 'externs': [ '../../../../../third_party/closure_compiler/externs/settings_private.js',
diff --git a/chrome/browser/resources/settings/site_settings/site_details.html b/chrome/browser/resources/settings/site_settings/site_details.html index 33d96f7..51980000d 100644 --- a/chrome/browser/resources/settings/site_settings/site_details.html +++ b/chrome/browser/resources/settings/site_settings/site_details.html
@@ -3,6 +3,7 @@ <link rel="import" href="chrome://resources/polymer/v1_0/paper-button/paper-button.html"> <link rel="import" href="chrome://resources/polymer/v1_0/paper-icon-button/paper-icon-button.html"> <link rel="import" href="chrome://md-settings/site_settings/site_details_permission.html"> +<link rel="import" href="chrome://md-settings/site_settings/website_usage_private_api.html"> <dom-module id="site-details"> <link rel="import" type="css" @@ -11,8 +12,9 @@ <template> <div class="settings-box"> <div class="origin">[[origin]]</div> - <h2 i18n-content="siteSettingsUsage" id="usage" hidden></h2> - <paper-item id="storage" hidden> + <h2 i18n-content="siteSettingsUsage" id="usage" + hidden$="[[!storedData_]]"></h2> + <paper-item id="storage" hidden$="[[!storedData_]]"> <div class="flex">[[storedData_]]</div> <paper-icon-button icon="delete" on-tap="onClearStorage_" @@ -48,6 +50,9 @@ raised i18n-content="siteSettingsClearAndReset" class="reset-button"></paper-button> </div> + <website-usage-private-api id="usageApi" + website-data-usage="{{storedData_}}"> + </website-usage-private-api> </template> <script src="site_details.js"></script> </dom-module>
diff --git a/chrome/browser/resources/settings/site_settings/site_details.js b/chrome/browser/resources/settings/site_settings/site_details.js index a6a8db7..18b706d 100644 --- a/chrome/browser/resources/settings/site_settings/site_details.js +++ b/chrome/browser/resources/settings/site_settings/site_details.js
@@ -31,14 +31,17 @@ /** * The origin that this widget is showing details for. */ - origin: String, + origin: { + type: String, + observer: 'onOriginChanged_', + }, /** * The amount of data stored for the origin. */ storedData_: { type: String, - observer: 'onStoredDataChanged_', + value: '', }, }, @@ -51,19 +54,26 @@ this.$.fullscreen.category = settings.ContentSettingsTypes.FULLSCREEN; this.$.camera.category = settings.ContentSettingsTypes.CAMERA; this.$.mic.category = settings.ContentSettingsTypes.MIC; - - this.storedData_ = '1337 MB'; // TODO(finnur): Fetch actual data. }, - onStoredDataChanged_: function() { - this.$.usage.hidden = false; - this.$.storage.hidden = false; + /** + * Handler for when the origin changes. + */ + onOriginChanged_: function() { + var url = /** @type {{hostname: string}} */(new URL(this.origin)); + this.$.usageApi.fetchUsageTotal(url.hostname); }, + /** + * Clears all data stored for the current origin. + */ onClearStorage_: function() { // TODO(finnur): Implement. }, + /** + * Resets all permissions and clears all data stored for the current origin. + */ onClearAndReset_: function() { Array.prototype.forEach.call( this.root.querySelectorAll('site-details-permission'),
diff --git a/chrome/browser/resources/settings/site_settings/website_usage_private_api.html b/chrome/browser/resources/settings/site_settings/website_usage_private_api.html new file mode 100644 index 0000000..3b756653 --- /dev/null +++ b/chrome/browser/resources/settings/site_settings/website_usage_private_api.html
@@ -0,0 +1,3 @@ +<link rel="import" href="chrome://resources/polymer/v1_0/polymer/polymer.html"> +<link rel="import" href="chrome://resources/html/cr.html"> +<script src="chrome://md-settings/site_settings/website_usage_private_api.js"></script> \ No newline at end of file
diff --git a/chrome/browser/resources/settings/site_settings/website_usage_private_api.js b/chrome/browser/resources/settings/site_settings/website_usage_private_api.js new file mode 100644 index 0000000..99f8858b --- /dev/null +++ b/chrome/browser/resources/settings/site_settings/website_usage_private_api.js
@@ -0,0 +1,76 @@ +// 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. + +(function() { +'use strict'; + +Polymer({ + is: 'website-usage-private-api', + + properties: { + /** + * The amount of data used by the given website. + */ + websiteDataUsage: { + type: String, + notify: true, + }, + }, + + attached: function() { + settings.WebsiteUsagePrivateApi.websiteUsagePolymerInstance = this; + }, + + /** @param {string} host */ + fetchUsageTotal: function(host) { + settings.WebsiteUsagePrivateApi.fetchUsageTotal(host); + }, +}); +})(); + +cr.define('settings.WebsiteUsagePrivateApi', function() { + /** + * @type {Object} An instance of the polymer object defined above. + * All data will be set here. + */ + var websiteUsagePolymerInstance = null; + + /** + * @type {string} The host for which the usage total is being fetched. + */ + var hostName_; + + /** + * Encapsulates the calls between JS and C++ to fetch how much storage the + * host is using. + * Will update the data in |websiteUsagePolymerInstance|. + */ + var fetchUsageTotal = function(host) { + var instance = settings.WebsiteUsagePrivateApi.websiteUsagePolymerInstance; + if (instance != null) + instance.websiteDataUsage = ''; + + hostName_ = host; + chrome.send('fetchUsageTotal', [host]); + }; + + /** + * Callback for when the usage total is known. + * @param {string} host The host that the usage was fetched for. + * @param {string} usage The string showing how much data the given host + * is using. + */ + var returnUsageTotal = function(host, usage) { + var instance = settings.WebsiteUsagePrivateApi.websiteUsagePolymerInstance; + if (instance == null) + return; + + if (hostName_ == host) + instance.websiteDataUsage = usage; + }; + + return { websiteUsagePolymerInstance: websiteUsagePolymerInstance, + fetchUsageTotal: fetchUsageTotal, + returnUsageTotal: returnUsageTotal }; +});
diff --git a/chrome/browser/resources/supervised_user_block_interstitial.css b/chrome/browser/resources/supervised_user_block_interstitial.css index 0c666f0..bd37186f 100644 --- a/chrome/browser/resources/supervised_user_block_interstitial.css +++ b/chrome/browser/resources/supervised_user_block_interstitial.css
@@ -33,9 +33,12 @@ position: relative; } +#feedback { + margin-top: 50px; +} + #feedback-link { - font-size: 80%; - margin-top: 10px; + color: rgb(66, 133, 244); } #request-access-button { @@ -138,4 +141,8 @@ display: flex; flex-flow: column; } + + #feedback { + margin-top: 35px; + } }
diff --git a/chrome/browser/resources/supervised_user_block_interstitial.html b/chrome/browser/resources/supervised_user_block_interstitial.html index 45946ee..b2ed783 100644 --- a/chrome/browser/resources/supervised_user_block_interstitial.html +++ b/chrome/browser/resources/supervised_user_block_interstitial.html
@@ -52,12 +52,10 @@ i18n-content="requestAccessButton"> </div> </div> - <h1> - <a id="feedback-link" is="action-link" i18n-content="feedbackLink"></a> - </h1> <div id="details" hidden> <p id="details-header" i18n-content="blockReasonHeader"></p> <p id="details-message" i18n-content="blockReasonMessage"></p> + <p id="feedback" i18n-values=".innerHTML:feedbackLink"></p> </div> </div> </body>
diff --git a/chrome/browser/resources/supervised_user_block_interstitial.js b/chrome/browser/resources/supervised_user_block_interstitial.js index e41ab19..ca0bbec 100644 --- a/chrome/browser/resources/supervised_user_block_interstitial.js +++ b/chrome/browser/resources/supervised_user_block_interstitial.js
@@ -71,7 +71,7 @@ sendCommand('feedback'); }; } else { - $('feedback-link').style.display = 'none'; + $('feedback').hidden = true; } }
diff --git a/chrome/browser/safe_browsing/unverified_download_field_trial.cc b/chrome/browser/safe_browsing/unverified_download_field_trial.cc index c733eae..bc3fb41 100644 --- a/chrome/browser/safe_browsing/unverified_download_field_trial.cc +++ b/chrome/browser/safe_browsing/unverified_download_field_trial.cc
@@ -7,7 +7,6 @@ #include "base/command_line.h" #include "base/files/file_path.h" #include "base/metrics/field_trial.h" -#include "base/metrics/histogram.h" #include "base/strings/string_split.h" #include "base/strings/string_util.h" #include "base/strings/utf_string_conversions.h"
diff --git a/chrome/browser/safe_browsing/unverified_download_policy.cc b/chrome/browser/safe_browsing/unverified_download_policy.cc index f13752b..d24a5ac 100644 --- a/chrome/browser/safe_browsing/unverified_download_policy.cc +++ b/chrome/browser/safe_browsing/unverified_download_policy.cc
@@ -4,6 +4,8 @@ #include "chrome/browser/safe_browsing/unverified_download_policy.h" +#include <algorithm> + #include "base/bind.h" #include "base/callback.h" #include "base/files/file_path.h" @@ -60,23 +62,38 @@ uma_file_type, requestor); } BrowserThread::PostTask(BrowserThread::UI, FROM_HERE, - base::Bind(callback, policy)); + base::Bind(callback, policy)); } void CheckFieldTrialOnAnyThread( const base::FilePath& file, + const std::vector<base::FilePath::StringType>& alternate_extensions, const GURL& requestor, const UnverifiedDownloadCheckCompletionCallback& callback) { - bool is_allowed = IsUnverifiedDownloadAllowedByFieldTrial(file); - RespondWithPolicy(file, callback, requestor, is_allowed - ? UnverifiedDownloadPolicy::ALLOWED - : UnverifiedDownloadPolicy::DISALLOWED); + if (!IsUnverifiedDownloadAllowedByFieldTrial(file)) { + RespondWithPolicy(file, callback, requestor, + UnverifiedDownloadPolicy::DISALLOWED); + return; + } + + for (const auto& extension : alternate_extensions) { + base::FilePath alternate_filename = file.AddExtension(extension); + if (!IsUnverifiedDownloadAllowedByFieldTrial(alternate_filename)) { + RespondWithPolicy(alternate_filename, callback, requestor, + UnverifiedDownloadPolicy::DISALLOWED); + return; + } + } + + RespondWithPolicy(file, callback, requestor, + UnverifiedDownloadPolicy::ALLOWED); } void CheckWhitelistOnIOThread( scoped_refptr<SafeBrowsingService> service, const GURL& requestor, const base::FilePath& file, + const std::vector<base::FilePath::StringType>& alternate_extensions, const UnverifiedDownloadCheckCompletionCallback& callback) { DCHECK_CURRENTLY_ON(BrowserThread::IO); int uma_file_type = @@ -104,7 +121,7 @@ return; } - CheckFieldTrialOnAnyThread(file, requestor, callback); + CheckFieldTrialOnAnyThread(file, alternate_extensions, requestor, callback); } } // namespace @@ -112,18 +129,27 @@ void CheckUnverifiedDownloadPolicy( const GURL& requestor, const base::FilePath& file, + const std::vector<base::FilePath::StringType>& alternate_extensions, const UnverifiedDownloadCheckCompletionCallback& callback) { + // Record a count of alternate extensions. The count is capped so that it + // won't be unbounded. In practice, it's expected that numbers above 3 are + // rare. + int alternate_extension_count = + std::min<int>(alternate_extensions.size(), 16); + UMA_HISTOGRAM_SPARSE_SLOWLY( + "SafeBrowsing.UnverifiedDownloads.AlternateExtensionCount", + alternate_extension_count); if (requestor.is_valid()) { scoped_refptr<SafeBrowsingService> service = g_browser_process->safe_browsing_service(); BrowserThread::PostTask( BrowserThread::IO, FROM_HERE, base::Bind(&CheckWhitelistOnIOThread, service, requestor, file, - callback)); + alternate_extensions, callback)); return; } - CheckFieldTrialOnAnyThread(file, GURL(), callback); + CheckFieldTrialOnAnyThread(file, alternate_extensions, GURL(), callback); } } // namespace safe_browsing
diff --git a/chrome/browser/safe_browsing/unverified_download_policy.h b/chrome/browser/safe_browsing/unverified_download_policy.h index 170e92bf..e5001db5 100644 --- a/chrome/browser/safe_browsing/unverified_download_policy.h +++ b/chrome/browser/safe_browsing/unverified_download_policy.h
@@ -5,14 +5,13 @@ #ifndef CHROME_BROWSER_SAFE_BROWSING_UNVERIFIED_DOWNLOAD_POLICY_H_ #define CHROME_BROWSER_SAFE_BROWSING_UNVERIFIED_DOWNLOAD_POLICY_H_ +#include <vector> + #include "base/callback_forward.h" +#include "base/files/file_path.h" class GURL; -namespace base { -class FilePath; -} - namespace safe_browsing { enum class UnverifiedDownloadPolicy { ALLOWED, DISALLOWED }; @@ -21,10 +20,13 @@ base::Callback<void(UnverifiedDownloadPolicy)>; // Invokes |callback| on the current thread with the effective download policy -// for an unverified download of |file| by |requestor|. +// for an unverified download of |file| by |requestor|. If it is possible for +// the file to be downloaded with alternate file extensions, they should be +// specified in |alternate_extensions|. void CheckUnverifiedDownloadPolicy( const GURL& requestor, const base::FilePath& file, + const std::vector<base::FilePath::StringType>& alternate_extensions, const UnverifiedDownloadCheckCompletionCallback& callback); } // namespace safe_browsing
diff --git a/chrome/browser/safe_browsing/unverified_download_policy_unittest.cc b/chrome/browser/safe_browsing/unverified_download_policy_unittest.cc index 9167d75..3b794b8 100644 --- a/chrome/browser/safe_browsing/unverified_download_policy_unittest.cc +++ b/chrome/browser/safe_browsing/unverified_download_policy_unittest.cc
@@ -137,34 +137,70 @@ switches::kDisallowUncheckedDangerousDownloads); base::FilePath test_file_path(FILE_PATH_LITERAL("foo.exe")); + std::vector<base::FilePath::StringType> test_extensions; CompletionCallback completion_callback; - CheckUnverifiedDownloadPolicy(GURL(), test_file_path, + CheckUnverifiedDownloadPolicy(GURL(), test_file_path, test_extensions, completion_callback.GetCallback()); EXPECT_EQ(UnverifiedDownloadPolicy::DISALLOWED, completion_callback.WaitForResult()); // Not http/s and hence isn't covered by the whitelist. CheckUnverifiedDownloadPolicy(GURL("ftp://supported.example.com/foo/bar"), - test_file_path, + test_file_path, test_extensions, completion_callback.GetCallback()); EXPECT_EQ(UnverifiedDownloadPolicy::DISALLOWED, completion_callback.WaitForResult()); CheckUnverifiedDownloadPolicy(GURL("http://supported.example.com/foo/bar"), - test_file_path, + test_file_path, test_extensions, completion_callback.GetCallback()); EXPECT_EQ(UnverifiedDownloadPolicy::ALLOWED, completion_callback.WaitForResult()); CheckUnverifiedDownloadPolicy(GURL("http://unsupported.example.com/foo/bar"), - test_file_path, + test_file_path, test_extensions, completion_callback.GetCallback()); EXPECT_EQ(UnverifiedDownloadPolicy::DISALLOWED, completion_callback.WaitForResult()); CheckUnverifiedDownloadPolicy(GURL("https://supported.example.com/foo/bar"), - test_file_path, + test_file_path, test_extensions, + completion_callback.GetCallback()); + EXPECT_EQ(UnverifiedDownloadPolicy::ALLOWED, + completion_callback.WaitForResult()); +} + +TEST_F(UnverifiedDownloadPolicyTest, AlternateExtensions) { + base::CommandLine::ForCurrentProcess()->AppendSwitch( + switches::kDisallowUncheckedDangerousDownloads); + CompletionCallback completion_callback; + + base::FilePath test_file_path(FILE_PATH_LITERAL("foo.txt")); + std::vector<base::FilePath::StringType> test_extensions; + + CheckUnverifiedDownloadPolicy(GURL(), test_file_path, test_extensions, + completion_callback.GetCallback()); + EXPECT_EQ(UnverifiedDownloadPolicy::ALLOWED, + completion_callback.WaitForResult()); + + test_extensions.push_back(FILE_PATH_LITERAL(".exe")); + CheckUnverifiedDownloadPolicy(GURL(), test_file_path, test_extensions, + completion_callback.GetCallback()); + EXPECT_EQ(UnverifiedDownloadPolicy::DISALLOWED, + completion_callback.WaitForResult()); + + test_extensions.clear(); + test_extensions.push_back(FILE_PATH_LITERAL(".txt")); + test_extensions.push_back(FILE_PATH_LITERAL(".exe")); + CheckUnverifiedDownloadPolicy(GURL(), test_file_path, test_extensions, + completion_callback.GetCallback()); + EXPECT_EQ(UnverifiedDownloadPolicy::DISALLOWED, + completion_callback.WaitForResult()); + + test_extensions.clear(); + test_extensions.push_back(FILE_PATH_LITERAL("e")); + CheckUnverifiedDownloadPolicy(GURL(), test_file_path, test_extensions, completion_callback.GetCallback()); EXPECT_EQ(UnverifiedDownloadPolicy::ALLOWED, completion_callback.WaitForResult()); @@ -179,10 +215,11 @@ base::RunLoop().RunUntilIdle(); base::FilePath test_file_path(FILE_PATH_LITERAL("foo.exe")); + std::vector<base::FilePath::StringType> test_extensions; CompletionCallback completion_callback; CheckUnverifiedDownloadPolicy(GURL("http://supported.example.com/foo/bar"), - test_file_path, + test_file_path, test_extensions, completion_callback.GetCallback()); EXPECT_EQ(UnverifiedDownloadPolicy::ALLOWED, completion_callback.WaitForResult());
diff --git a/chrome/browser/storage/OWNERS b/chrome/browser/storage/OWNERS index 55e9be9..3436005a 100644 --- a/chrome/browser/storage/OWNERS +++ b/chrome/browser/storage/OWNERS
@@ -2,3 +2,5 @@ jsbell@chromium.org kinuko@chromium.org michaeln@chromium.org + +per-file storage_info_fetcher.*=finnur@chromium.org \ No newline at end of file
diff --git a/chrome/browser/storage/storage_info_fetcher.cc b/chrome/browser/storage/storage_info_fetcher.cc new file mode 100644 index 0000000..adc1d7d --- /dev/null +++ b/chrome/browser/storage/storage_info_fetcher.cc
@@ -0,0 +1,55 @@ +// 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. + +#include "chrome/browser/storage/storage_info_fetcher.h" + +#include "content/public/browser/browser_thread.h" + +using content::BrowserThread; + +StorageInfoFetcher::StorageInfoFetcher(storage::QuotaManager* quota_manager) + : quota_manager_(quota_manager) { +} + +StorageInfoFetcher::~StorageInfoFetcher() { +} + +void StorageInfoFetcher::Run() { + // QuotaManager must be called on IO thread, but the callback must then be + // called on the UI thread. + BrowserThread::PostTask( + BrowserThread::IO, FROM_HERE, + base::Bind(&StorageInfoFetcher::GetUsageInfo, this, + base::Bind(&StorageInfoFetcher::OnGetUsageInfoInternal, this))); +} + +void StorageInfoFetcher::AddObserver(Observer* observer) { + observers_.AddObserver(observer); +} + +void StorageInfoFetcher::RemoveObserver(Observer* observer) { + observers_.RemoveObserver(observer); +} + +void StorageInfoFetcher::GetUsageInfo( + const storage::GetUsageInfoCallback& callback) { + DCHECK_CURRENTLY_ON(content::BrowserThread::IO); + quota_manager_->GetUsageInfo(callback); +} + +void StorageInfoFetcher::OnGetUsageInfoInternal( + const storage::UsageInfoEntries& entries) { + DCHECK_CURRENTLY_ON(content::BrowserThread::IO); + + entries_.insert(entries_.begin(), entries.begin(), entries.end()); + BrowserThread::PostTask( + BrowserThread::UI, FROM_HERE, + base::Bind(&StorageInfoFetcher::InvokeCallback, this)); +} + +void StorageInfoFetcher::InvokeCallback() { + DCHECK_CURRENTLY_ON(content::BrowserThread::UI); + + FOR_EACH_OBSERVER(Observer, observers_, OnGetUsageInfo(entries_)); +}
diff --git a/chrome/browser/storage/storage_info_fetcher.h b/chrome/browser/storage/storage_info_fetcher.h new file mode 100644 index 0000000..1f348bd --- /dev/null +++ b/chrome/browser/storage/storage_info_fetcher.h
@@ -0,0 +1,59 @@ +// 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. + +#ifndef CHROME_BROWSER_STORAGE_STORAGE_INFO_FETCHER_H_ +#define CHROME_BROWSER_STORAGE_STORAGE_INFO_FETCHER_H_ + +#include "base/memory/ref_counted.h" +#include "storage/browser/quota/quota_manager.h" + +// Asynchronously fetches the amount of storage used by websites. +class StorageInfoFetcher : + public base::RefCountedThreadSafe<StorageInfoFetcher> { + public: + // Observer interface for monitoring StorageInfoFetcher. + class Observer { + public: + // Called when the storage has been calculated. + virtual void OnGetUsageInfo(const storage::UsageInfoEntries& entries) = 0; + + protected: + virtual ~Observer() {} + }; + + explicit StorageInfoFetcher(storage::QuotaManager* quota_manager); + + // Asynchronously fetches the StorageInfo. + void Run(); + + void AddObserver(Observer* observer); + void RemoveObserver(Observer* observer); + + private: + virtual ~StorageInfoFetcher(); + + friend class base::RefCountedThreadSafe<StorageInfoFetcher>; + + // Fetches the usage information. + void GetUsageInfo(const storage::GetUsageInfoCallback& callback); + + // Called when usage information is available. + void OnGetUsageInfoInternal(const storage::UsageInfoEntries& entries); + + // Reports back to all observers that information is available. + void InvokeCallback(); + + // All clients observing this class. + base::ObserverList<Observer> observers_; + + // The quota manager to use to calculate the storage usage. + storage::QuotaManager* quota_manager_; + + // Hosts and their usage. + storage::UsageInfoEntries entries_; + + DISALLOW_COPY_AND_ASSIGN(StorageInfoFetcher); +}; + +#endif // CHROME_BROWSER_STORAGE_STORAGE_INFO_FETCHER_H_
diff --git a/chrome/browser/ui/aura/chrome_browser_main_extra_parts_aura.cc b/chrome/browser/ui/aura/chrome_browser_main_extra_parts_aura.cc index b16e886b..9c3b040 100644 --- a/chrome/browser/ui/aura/chrome_browser_main_extra_parts_aura.cc +++ b/chrome/browser/ui/aura/chrome_browser_main_extra_parts_aura.cc
@@ -23,6 +23,8 @@ #if defined(OS_LINUX) && !defined(OS_CHROMEOS) #include "base/prefs/pref_service.h" #include "chrome/browser/profiles/profile.h" +#include "chrome/browser/themes/theme_service.h" +#include "chrome/browser/themes/theme_service_factory.h" #include "chrome/browser/ui/views/frame/browser_view.h" #include "chrome/common/pref_names.h" #include "ui/aura/window.h" @@ -55,25 +57,25 @@ // Window types not listed here (such as tooltips) will never use Chrome // theming. if (window->type() == ui::wm::WINDOW_TYPE_NORMAL || - window->type() == ui::wm::WINDOW_TYPE_POPUP || - window->type() == ui::wm::WINDOW_TYPE_CONTROL) { + window->type() == ui::wm::WINDOW_TYPE_POPUP) { profile = reinterpret_cast<Profile*>( window->GetNativeWindowProperty(Profile::kProfileKey)); } - if (profile && !profile->GetPrefs()->GetBoolean(prefs::kUsesSystemTheme)) { - // Only toplevel browser windows and CONTROL type windows (such as the find - // in page bar) should use special theming for off the record mode. - // WINDOW_TYPE_NORMAL is not enough to distinguish browser windows because - // it also encompasses dialogs. - bool eligible_for_otr = window->type() == ui::wm::WINDOW_TYPE_CONTROL || - BrowserView::GetBrowserViewForNativeWindow(window); - if (eligible_for_otr && - profile->GetProfileType() == Profile::INCOGNITO_PROFILE) { - return ui::NativeThemeDarkAura::instance(); - } + if (profile) { + ThemeService* ts = ThemeServiceFactory::GetForProfile(profile); + // If using the system (GTK) theme, don't use an Aura NativeTheme at all. + if (!ts->UsingSystemTheme()) { + // Use a dark theme for incognito browser windows that aren't + // custom-themed. Otherwise, normal Aura theme. + if (profile->GetProfileType() == Profile::INCOGNITO_PROFILE && + ts->UsingDefaultTheme() && + BrowserView::GetBrowserViewForNativeWindow(window)) { + return ui::NativeThemeDarkAura::instance(); + } - return ui::NativeThemeAura::instance(); + return ui::NativeThemeAura::instance(); + } } return nullptr;
diff --git a/chrome/browser/ui/cocoa/location_bar/zoom_decoration_browsertest.mm b/chrome/browser/ui/cocoa/location_bar/zoom_decoration_browsertest.mm index 69cde08..185c8c8 100644 --- a/chrome/browser/ui/cocoa/location_bar/zoom_decoration_browsertest.mm +++ b/chrome/browser/ui/cocoa/location_bar/zoom_decoration_browsertest.mm
@@ -13,8 +13,8 @@ #import "chrome/browser/ui/cocoa/location_bar/location_bar_view_mac.h" #include "chrome/browser/ui/cocoa/run_loop_testing.h" #include "chrome/browser/ui/tabs/tab_strip_model.h" -#include "chrome/browser/ui/toolbar/test_toolbar_model.h" #include "chrome/test/base/in_process_browser_test.h" +#include "components/toolbar/test_toolbar_model.h" #include "components/ui/zoom/page_zoom.h" #include "components/ui/zoom/zoom_controller.h" #include "content/public/browser/host_zoom_map.h"
diff --git a/chrome/browser/ui/omnibox/omnibox_edit_unittest.cc b/chrome/browser/ui/omnibox/omnibox_edit_unittest.cc index 579559b..9da61d6 100644 --- a/chrome/browser/ui/omnibox/omnibox_edit_unittest.cc +++ b/chrome/browser/ui/omnibox/omnibox_edit_unittest.cc
@@ -10,10 +10,10 @@ #include "chrome/browser/search_engines/template_url_service_factory.h" #include "chrome/browser/ui/omnibox/chrome_omnibox_client.h" #include "chrome/browser/ui/omnibox/chrome_omnibox_edit_controller.h" -#include "chrome/browser/ui/toolbar/test_toolbar_model.h" #include "chrome/test/base/testing_profile.h" #include "components/omnibox/browser/omnibox_edit_model.h" #include "components/omnibox/browser/omnibox_view.h" +#include "components/toolbar/test_toolbar_model.h" #include "content/public/test/test_browser_thread_bundle.h" #include "testing/gtest/include/gtest/gtest.h"
diff --git a/chrome/browser/ui/omnibox/omnibox_view_browsertest.cc b/chrome/browser/ui/omnibox/omnibox_view_browsertest.cc index 1bf4cf2..e024186 100644 --- a/chrome/browser/ui/omnibox/omnibox_view_browsertest.cc +++ b/chrome/browser/ui/omnibox/omnibox_view_browsertest.cc
@@ -25,7 +25,6 @@ #include "chrome/browser/ui/browser_window.h" #include "chrome/browser/ui/location_bar/location_bar.h" #include "chrome/browser/ui/tabs/tab_strip_model.h" -#include "chrome/browser/ui/toolbar/test_toolbar_model.h" #include "chrome/common/chrome_paths.h" #include "chrome/common/chrome_switches.h" #include "chrome/common/url_constants.h" @@ -45,6 +44,7 @@ #include "components/omnibox/browser/omnibox_view.h" #include "components/search_engines/template_url.h" #include "components/search_engines/template_url_service.h" +#include "components/toolbar/test_toolbar_model.h" #include "content/public/browser/notification_service.h" #include "content/public/browser/web_contents.h" #include "net/dns/mock_host_resolver.h"
diff --git a/chrome/browser/ui/views/dropdown_bar_host.cc b/chrome/browser/ui/views/dropdown_bar_host.cc index e2c4088..6cbc054 100644 --- a/chrome/browser/ui/views/dropdown_bar_host.cc +++ b/chrome/browser/ui/views/dropdown_bar_host.cc
@@ -10,6 +10,7 @@ #include "chrome/browser/ui/views/dropdown_bar_host_delegate.h" #include "chrome/browser/ui/views/dropdown_bar_view.h" #include "chrome/browser/ui/views/frame/browser_view.h" +#include "chrome/browser/ui/views/theme_copying_widget.h" #include "ui/events/keycodes/keyboard_codes.h" #include "ui/gfx/animation/slide_animation.h" #include "ui/gfx/scrollbar_size.h" @@ -48,7 +49,7 @@ delegate_ = delegate; // Initialize the host. - host_.reset(new views::Widget); + host_.reset(new ThemeCopyingWidget(browser_view_->GetWidget())); views::Widget::InitParams params(views::Widget::InitParams::TYPE_CONTROL); params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; params.parent = browser_view_->GetWidget()->GetNativeView();
diff --git a/chrome/browser/ui/views/frame/browser_frame.cc b/chrome/browser/ui/views/frame/browser_frame.cc index c14948c..2d40993 100644 --- a/chrome/browser/ui/views/frame/browser_frame.cc +++ b/chrome/browser/ui/views/frame/browser_frame.cc
@@ -24,7 +24,6 @@ #include "chrome/browser/ui/views/frame/system_menu_model_builder.h" #include "chrome/browser/ui/views/frame/top_container_view.h" #include "ui/base/hit_test.h" -#include "ui/base/theme_provider.h" #include "ui/events/event_handler.h" #include "ui/gfx/font_list.h" #include "ui/gfx/screen.h" @@ -52,10 +51,7 @@ : native_browser_frame_(nullptr), root_view_(nullptr), browser_frame_view_(nullptr), - browser_view_(browser_view), - theme_provider_( - &ThemeService::GetThemeProviderForProfile(browser_view_->browser() - ->profile())) { + browser_view_(browser_view) { browser_view_->set_frame(this); set_is_secondary_widget(false); // Don't focus anything on creation, selecting a tab will set the focus. @@ -85,15 +81,6 @@ ¶ms.show_state); } - if (browser_view_->browser()->profile()->GetProfileType() == - Profile::INCOGNITO_PROFILE) { -#if defined(OS_WIN) - params.native_theme = ui::NativeThemeDarkWin::instance(); -#elif defined(OS_CHROMEOS) - params.native_theme = ui::NativeThemeDarkAura::instance(); -#endif - } - Init(params); if (!native_browser_frame_->UsesNativeSystemMenu()) { @@ -177,7 +164,22 @@ } const ui::ThemeProvider* BrowserFrame::GetThemeProvider() const { - return theme_provider_; + return &ThemeService::GetThemeProviderForProfile( + browser_view_->browser()->profile()); +} + +const ui::NativeTheme* BrowserFrame::GetNativeTheme() const { + if (browser_view_->browser()->profile()->GetProfileType() == + Profile::INCOGNITO_PROFILE && + ThemeServiceFactory::GetForProfile(browser_view_->browser()->profile()) + ->UsingDefaultTheme()) { +#if defined(OS_WIN) + return ui::NativeThemeDarkWin::instance(); +#elif defined(OS_CHROMEOS) + return ui::NativeThemeDarkAura::instance(); +#endif + } + return views::Widget::GetNativeTheme(); } void BrowserFrame::SchedulePaintInRect(const gfx::Rect& rect) {
diff --git a/chrome/browser/ui/views/frame/browser_frame.h b/chrome/browser/ui/views/frame/browser_frame.h index 4497095b..b62cd215 100644 --- a/chrome/browser/ui/views/frame/browser_frame.h +++ b/chrome/browser/ui/views/frame/browser_frame.h
@@ -19,6 +19,7 @@ class NativeBrowserFrame; class NonClientFrameView; class SystemMenuModelBuilder; +class ThemeService; namespace gfx { class FontList; @@ -28,7 +29,6 @@ namespace ui { class EventHandler; class MenuModel; -class ThemeProvider; } namespace views { @@ -102,6 +102,7 @@ bool GetAccelerator(int command_id, ui::Accelerator* accelerator) const override; const ui::ThemeProvider* GetThemeProvider() const override; + const ui::NativeTheme* GetNativeTheme() const override; void SchedulePaintInRect(const gfx::Rect& rect) override; void OnNativeWidgetActivationChanged(bool active) override; @@ -140,7 +141,7 @@ // NativeBrowserFrame::UsesNativeSystemMenu() returns false. scoped_ptr<views::MenuRunner> menu_runner_; - const ui::ThemeProvider* theme_provider_; + const ThemeService* theme_service_; scoped_ptr<ui::EventHandler> browser_command_handler_;
diff --git a/chrome/browser/ui/views/frame/browser_view.cc b/chrome/browser/ui/views/frame/browser_view.cc index 2d7a8e0..9b12a2e 100644 --- a/chrome/browser/ui/views/frame/browser_view.cc +++ b/chrome/browser/ui/views/frame/browser_view.cc
@@ -165,6 +165,7 @@ #include "base/win/windows_version.h" #include "chrome/browser/jumplist_win.h" #include "ui/gfx/color_palette.h" +#include "ui/native_theme/native_theme_dark_win.h" #include "ui/views/win/scoped_fullscreen_visibility.h" #endif @@ -182,6 +183,10 @@ #include "content/public/common/mojo_shell_connection.h" #endif +#if defined(OS_LINUX) +#include "ui/native_theme/native_theme_dark_aura.h" +#endif + using base::TimeDelta; using base::UserMetricsAction; using content::NativeWebKeyboardEvent; @@ -450,8 +455,8 @@ BrowserView::BrowserView() : views::ClientView(nullptr, nullptr), - last_focused_view_storage_id_(views::ViewStorage::GetInstance() - ->CreateStorageID()), + last_focused_view_storage_id_( + views::ViewStorage::GetInstance()->CreateStorageID()), frame_(nullptr), top_container_(nullptr), tabstrip_(nullptr), @@ -462,6 +467,7 @@ devtools_web_view_(nullptr), contents_container_(nullptr), initialized_(false), + handling_theme_changed_(false), in_process_fullscreen_(false), #if defined(OS_WIN) ticker_(0), @@ -2010,12 +2016,33 @@ state->role = ui::AX_ROLE_CLIENT; } +void BrowserView::OnThemeChanged() { + if (!IsRegularOrGuestSession() && + ui::MaterialDesignController::IsModeMaterial()) { + // When the theme changes, the native theme may also change (in OTR, the + // usage of dark or normal hinges on the browser theme), so we have to + // propagate both kinds of change. + base::AutoReset<bool> reset(&handling_theme_changed_, true); +#if defined(OS_WIN) + ui::NativeThemeDarkWin::instance()->NotifyObservers(); + ui::NativeThemeWin::instance()->NotifyObservers(); +#elif defined(OS_LINUX) + ui::NativeThemeDarkAura::instance()->NotifyObservers(); + ui::NativeThemeAura::instance()->NotifyObservers(); +#endif + } + + views::View::OnThemeChanged(); +} + void BrowserView::OnNativeThemeChanged(const ui::NativeTheme* theme) { // Do not handle native theme changes before the browser view is initialized. if (!initialized_) return; ClientView::OnNativeThemeChanged(theme); - UserChangedTheme(); + // Don't infinitely recurse. + if (!handling_theme_changed_) + UserChangedTheme(); chrome::MaybeShowInvertBubbleView(this); }
diff --git a/chrome/browser/ui/views/frame/browser_view.h b/chrome/browser/ui/views/frame/browser_view.h index 7995bca..df2055e1 100644 --- a/chrome/browser/ui/views/frame/browser_view.h +++ b/chrome/browser/ui/views/frame/browser_view.h
@@ -445,6 +445,7 @@ const ViewHierarchyChangedDetails& details) override; void ChildPreferredSizeChanged(View* child) override; void GetAccessibleState(ui::AXViewState* state) override; + void OnThemeChanged() override; void OnNativeThemeChanged(const ui::NativeTheme* theme) override; // Overridden from ui::AcceleratorTarget: @@ -670,6 +671,10 @@ // True if we have already been initialized. bool initialized_; + // True if we're currently handling a theme change (i.e. inside + // OnThemeChanged()). + bool handling_theme_changed_; + // True when in ProcessFullscreen(). The flag is used to avoid reentrance and // to ignore requests to layout while in ProcessFullscreen() to reduce // jankiness.
diff --git a/chrome/browser/ui/views/frame/web_app_left_header_view_ash_unittest.cc b/chrome/browser/ui/views/frame/web_app_left_header_view_ash_unittest.cc index 1c20979..64bf454 100644 --- a/chrome/browser/ui/views/frame/web_app_left_header_view_ash_unittest.cc +++ b/chrome/browser/ui/views/frame/web_app_left_header_view_ash_unittest.cc
@@ -8,11 +8,11 @@ #include "base/command_line.h" #include "base/macros.h" #include "base/values.h" -#include "chrome/browser/ui/toolbar/test_toolbar_model.h" #include "chrome/browser/ui/views/frame/browser_non_client_frame_view_ash.h" #include "chrome/browser/ui/views/frame/browser_view.h" #include "chrome/browser/ui/views/frame/test_with_browser_view.h" #include "chrome/common/chrome_switches.h" +#include "components/toolbar/test_toolbar_model.h" #include "extensions/browser/extension_registry.h" #include "extensions/common/extension.h" #include "extensions/common/manifest_constants.h"
diff --git a/chrome/browser/ui/views/omnibox/omnibox_popup_contents_view.cc b/chrome/browser/ui/views/omnibox/omnibox_popup_contents_view.cc index d38e649..fb229650 100644 --- a/chrome/browser/ui/views/omnibox/omnibox_popup_contents_view.cc +++ b/chrome/browser/ui/views/omnibox/omnibox_popup_contents_view.cc
@@ -13,6 +13,7 @@ #include "chrome/browser/ui/layout_constants.h" #include "chrome/browser/ui/views/location_bar/location_bar_view.h" #include "chrome/browser/ui/views/omnibox/omnibox_result_view.h" +#include "chrome/browser/ui/views/theme_copying_widget.h" #include "components/omnibox/browser/omnibox_view.h" #include "grit/theme_resources.h" #include "ui/base/material_design/material_design_controller.h" @@ -31,10 +32,11 @@ #include "ui/views/window/non_client_view.h" class OmniboxPopupContentsView::AutocompletePopupWidget - : public views::Widget, + : public ThemeCopyingWidget, public base::SupportsWeakPtr<AutocompletePopupWidget> { public: - AutocompletePopupWidget() {} + explicit AutocompletePopupWidget(views::Widget* role_model) + : ThemeCopyingWidget(role_model) {} ~AutocompletePopupWidget() override {} private: @@ -239,7 +241,7 @@ views::Widget* popup_parent = location_bar_view_->GetWidget(); // If the popup is currently closed, we need to create it. - popup_ = (new AutocompletePopupWidget)->AsWeakPtr(); + popup_ = (new AutocompletePopupWidget(popup_parent))->AsWeakPtr(); views::Widget::InitParams params(views::Widget::InitParams::TYPE_POPUP); #if defined(OS_WIN) @@ -252,7 +254,6 @@ params.parent = popup_parent->GetNativeView(); params.bounds = GetPopupBounds(); params.context = popup_parent->GetNativeWindow(); - params.native_theme = popup_parent->GetNativeTheme(); popup_->Init(params); // Third-party software such as DigitalPersona identity verification can // hook the underlying window creation methods and use SendMessage to
diff --git a/chrome/browser/ui/views/profiles/signin_view_controller.cc b/chrome/browser/ui/views/profiles/signin_view_controller.cc index 48727552..850e752 100644 --- a/chrome/browser/ui/views/profiles/signin_view_controller.cc +++ b/chrome/browser/ui/views/profiles/signin_view_controller.cc
@@ -11,7 +11,7 @@ #include "chrome/browser/signin/signin_promo.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/tabs/tab_strip_model.h" -#include "chrome/browser/ui/webui/signin/inline_login_ui.h" +#include "chrome/browser/ui/webui/signin/get_auth_frame.h" #include "chrome/common/url_constants.h" #include "components/constrained_window/constrained_window_views.h" #include "components/signin/core/browser/signin_error_controller.h" @@ -157,8 +157,8 @@ // views::ButtonListener: void ButtonPressed(views::Button* sender, const ui::Event& event) override { - auto auth_web_contents = InlineLoginUI::GetAuthFrameWebContents( - content_view_->GetWebContents(), GURL(), "signin-frame"); + auto auth_web_contents = signin::GetAuthFrameWebContents( + content_view_->GetWebContents(), "signin-frame"); if (auth_web_contents) { if (auth_web_contents->GetController().CanGoBack()) auth_web_contents->GetController().GoBack(); @@ -171,8 +171,8 @@ // content::WebContentsDelegate void LoadingStateChanged( content::WebContents* source, bool to_different_document) override { - auto auth_web_contents = InlineLoginUI::GetAuthFrameWebContents( - content_view_->GetWebContents(), GURL(), "signin-frame"); + auto auth_web_contents = signin::GetAuthFrameWebContents( + content_view_->GetWebContents(), "signin-frame"); if (auth_web_contents) { if (auth_web_contents->GetController().CanGoBack()) host_view_->ShowBackArrow();
diff --git a/chrome/browser/ui/views/theme_copying_widget.cc b/chrome/browser/ui/views/theme_copying_widget.cc new file mode 100644 index 0000000..a9e2d19 --- /dev/null +++ b/chrome/browser/ui/views/theme_copying_widget.cc
@@ -0,0 +1,14 @@ +// 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. + +#include "chrome/browser/ui/views/theme_copying_widget.h" + +ThemeCopyingWidget::ThemeCopyingWidget(views::Widget* role_model) + : role_model_(role_model) {} + +ThemeCopyingWidget::~ThemeCopyingWidget() {} + +const ui::NativeTheme* ThemeCopyingWidget::GetNativeTheme() const { + return role_model_->GetNativeTheme(); +}
diff --git a/chrome/browser/ui/views/theme_copying_widget.h b/chrome/browser/ui/views/theme_copying_widget.h new file mode 100644 index 0000000..a868e362 --- /dev/null +++ b/chrome/browser/ui/views/theme_copying_widget.h
@@ -0,0 +1,27 @@ +// 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. + +#ifndef CHROME_BROWSER_UI_VIEWS_THEME_COPYING_WIDGET_H_ +#define CHROME_BROWSER_UI_VIEWS_THEME_COPYING_WIDGET_H_ + +#include "ui/views/widget/widget.h" + +// This widget uses a reference widget to provide its NativeTheme. The +// reference widget is assumed to outlive |this|. +class ThemeCopyingWidget : public views::Widget { + public: + explicit ThemeCopyingWidget(views::Widget* role_model); + ~ThemeCopyingWidget() override; + + // views::Widget + const ui::NativeTheme* GetNativeTheme() const override; + + private: + // The widget we'll copy our theme from. + views::Widget* role_model_; + + DISALLOW_COPY_AND_ASSIGN(ThemeCopyingWidget); +}; + +#endif // CHROME_BROWSER_UI_VIEWS_THEME_COPYING_WIDGET_H_
diff --git a/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc b/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc index 3a460f3f..09f0f63 100644 --- a/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc +++ b/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc
@@ -51,10 +51,7 @@ #include "chrome/browser/ui/webui/predictors/predictors_ui.h" #include "chrome/browser/ui/webui/profiler_ui.h" #include "chrome/browser/ui/webui/settings/md_settings_ui.h" -#include "chrome/browser/ui/webui/signin/inline_login_ui.h" #include "chrome/browser/ui/webui/signin/profile_signin_confirmation_ui.h" -#include "chrome/browser/ui/webui/signin/sync_confirmation_ui.h" -#include "chrome/browser/ui/webui/signin/user_manager_ui.h" #include "chrome/browser/ui/webui/signin_internals_ui.h" #include "chrome/browser/ui/webui/supervised_user_internals_ui.h" #include "chrome/browser/ui/webui/sync_internals_ui.h" @@ -127,6 +124,12 @@ #include "chrome/browser/ui/webui/popular_sites_internals_ui.h" #endif +#if !defined(OS_CHROMEOS) && !defined(OS_ANDROID) && !defined(OS_IOS) +#include "chrome/browser/ui/webui/signin/inline_login_ui.h" +#include "chrome/browser/ui/webui/signin/sync_confirmation_ui.h" +#include "chrome/browser/ui/webui/signin/user_manager_ui.h" +#endif + #if defined(OS_CHROMEOS) #include "base/sys_info.h" #include "chrome/browser/ui/webui/chromeos/bluetooth_pairing_ui.h" @@ -493,8 +496,6 @@ #else if (url.host() == chrome::kChromeUICopresenceHost) return &NewWebUI<CopresenceUI>; - if (url.host() == chrome::kChromeUIChromeSigninHost) - return &NewWebUI<InlineLoginUI>; if (url.SchemeIs(content::kChromeDevToolsScheme)) return &NewWebUI<DevToolsUI>; @@ -509,6 +510,8 @@ return &NewWebUI<PopularSitesInternalsUI>; #endif #if !defined(OS_CHROMEOS) && !defined(OS_ANDROID) && !defined(OS_IOS) + if (url.host() == chrome::kChromeUIChromeSigninHost) + return &NewWebUI<InlineLoginUI>; if (url.host() == chrome::kChromeUIUserManagerHost) return &NewWebUI<UserManagerUI>; if (url.host() == chrome::kChromeUISyncConfirmationHost)
diff --git a/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc index a4e629a..2ae711f 100644 --- a/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc +++ b/chrome/browser/ui/webui/chromeos/login/gaia_screen_handler.cc
@@ -25,7 +25,7 @@ #include "chrome/browser/chromeos/settings/cros_settings.h" #include "chrome/browser/io_thread.h" #include "chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h" -#include "chrome/browser/ui/webui/signin/inline_login_ui.h" +#include "chrome/browser/ui/webui/signin/get_auth_frame.h" #include "chrome/common/channel_info.h" #include "chrome/common/pref_names.h" #include "chrome/grit/generated_resources.h" @@ -54,8 +54,6 @@ const char kJsScreenPath[] = "login.GaiaSigninScreen"; const char kAuthIframeParentName[] = "signin-frame"; -const char kAuthIframeParentOrigin[] = - "chrome-extension://mfffpogegjflfpflabcdkioaeobkgjik/"; const char kRestrictiveProxyURL[] = "https://www.google.com/generate_204"; @@ -604,10 +602,8 @@ void GaiaScreenHandler::SubmitLoginFormForTest() { VLOG(2) << "Submit login form for test, user=" << test_user_; - content::RenderFrameHost* frame = InlineLoginUI::GetAuthFrame( - web_ui()->GetWebContents(), - GURL(kAuthIframeParentOrigin), - kAuthIframeParentName); + content::RenderFrameHost* frame = + signin::GetAuthFrame(web_ui()->GetWebContents(), kAuthIframeParentName); std::string code = "document.getElementById('identifier').value = '" + test_user_ + "';"
diff --git a/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc b/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc index d03cf1f..3e97019 100644 --- a/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc +++ b/chrome/browser/ui/webui/chromeos/login/oobe_ui.cc
@@ -56,13 +56,16 @@ #include "chrome/browser/ui/webui/chromeos/login/user_image_screen_handler.h" #include "chrome/browser/ui/webui/chromeos/login/wrong_hwid_screen_handler.h" #include "chrome/browser/ui/webui/options/chromeos/user_image_source.h" +#include "chrome/browser/ui/webui/test_files_request_filter.h" #include "chrome/browser/ui/webui/theme_source.h" #include "chrome/common/chrome_constants.h" +#include "chrome/common/chrome_switches.h" #include "chrome/common/url_constants.h" #include "chromeos/chromeos_switches.h" #include "components/policy/core/common/cloud/cloud_policy_constants.h" #include "content/public/browser/web_ui.h" #include "content/public/browser/web_ui_data_source.h" +#include "content/public/common/content_switches.h" #include "grit/browser_resources.h" #include "grit/chrome_unscaled_resources.h" #include "ui/base/resource/resource_bundle.h" @@ -139,6 +142,13 @@ source->AddResourcePath("Roboto-Bold.ttf", IDR_FONT_ROBOTO_BOLD); } + // Only add a filter when runing as test. + base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); + const bool is_running_test = command_line->HasSwitch(::switches::kTestName) || + command_line->HasSwitch(::switches::kTestType); + if (is_running_test) + source->SetRequestFilter(::test::GetTestFilesRequestFilter()); + return source; }
diff --git a/chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.cc b/chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.cc index 39dd2c4f..98c8cca 100644 --- a/chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.cc +++ b/chrome/browser/ui/webui/settings/md_settings_localized_strings_provider.cc
@@ -292,6 +292,8 @@ "changeDownloadLocation", IDS_SETTINGS_CHANGE_DOWNLOAD_LOCATION); html_source->AddLocalizedString( "promptForDownload", IDS_SETTINGS_PROMPT_FOR_DOWNLOAD); + html_source->AddLocalizedString( + "disconnectGoogleDriveAccount", IDS_SETTINGS_DISCONNECT_GOOGLE_DRIVE); } void AddResetStrings(content::WebUIDataSource* html_source) {
diff --git a/chrome/browser/ui/webui/settings/md_settings_ui.cc b/chrome/browser/ui/webui/settings/md_settings_ui.cc index 0db61f4..e1569f41 100644 --- a/chrome/browser/ui/webui/settings/md_settings_ui.cc +++ b/chrome/browser/ui/webui/settings/md_settings_ui.cc
@@ -19,6 +19,7 @@ #include "chrome/browser/ui/webui/settings/settings_clear_browsing_data_handler.h" #include "chrome/browser/ui/webui/settings/settings_default_browser_handler.h" #include "chrome/browser/ui/webui/settings/settings_startup_pages_handler.h" +#include "chrome/browser/ui/webui/settings/site_settings_handler.h" #include "chrome/common/url_constants.h" #include "content/public/browser/web_contents.h" #include "content/public/browser/web_ui.h" @@ -56,6 +57,7 @@ AddSettingsPageUIHandler(new FontHandler(web_ui)); AddSettingsPageUIHandler(new LanguagesHandler(web_ui)); AddSettingsPageUIHandler(new PeopleHandler(profile)); + AddSettingsPageUIHandler(new SiteSettingsHandler(profile)); AddSettingsPageUIHandler(new StartupPagesHandler(web_ui)); #if defined(OS_CHROMEOS)
diff --git a/chrome/browser/ui/webui/settings/settings_startup_pages_handler.cc b/chrome/browser/ui/webui/settings/settings_startup_pages_handler.cc index e9b7be09..233df7c3 100644 --- a/chrome/browser/ui/webui/settings/settings_startup_pages_handler.cc +++ b/chrome/browser/ui/webui/settings/settings_startup_pages_handler.cc
@@ -26,22 +26,6 @@ if (Profile::FromWebUI(web_ui())->IsOffTheRecord()) return; - startup_custom_pages_table_model_.SetObserver(this); - - PrefService* prefService = Profile::FromWebUI(web_ui())->GetPrefs(); - SessionStartupPref pref = SessionStartupPref::GetStartupPref( - prefService); - startup_custom_pages_table_model_.SetURLs(pref.urls); - - if (pref.urls.empty()) - pref.type = SessionStartupPref::DEFAULT; - - pref_change_registrar_.Init(prefService); - pref_change_registrar_.Add( - prefs::kURLsToRestoreOnStartup, - base::Bind(&StartupPagesHandler::UpdateStartupPages, - base::Unretained(this))); - web_ui()->RegisterMessageCallback("addStartupPage", base::Bind(&StartupPagesHandler::AddStartupPage, base::Unretained(this))); @@ -109,6 +93,22 @@ } void StartupPagesHandler::OnStartupPrefsPageLoad(const base::ListValue* args) { + startup_custom_pages_table_model_.SetObserver(this); + + PrefService* prefService = Profile::FromWebUI(web_ui())->GetPrefs(); + SessionStartupPref pref = SessionStartupPref::GetStartupPref( + prefService); + startup_custom_pages_table_model_.SetURLs(pref.urls); + + if (pref.urls.empty()) + pref.type = SessionStartupPref::DEFAULT; + + pref_change_registrar_.Init(prefService); + pref_change_registrar_.Add( + prefs::kURLsToRestoreOnStartup, + base::Bind(&StartupPagesHandler::UpdateStartupPages, + base::Unretained(this))); + const SessionStartupPref startup_pref = SessionStartupPref::GetStartupPref( Profile::FromWebUI(web_ui())->GetPrefs()); startup_custom_pages_table_model_.SetURLs(startup_pref.urls);
diff --git a/chrome/browser/ui/webui/settings/site_settings_handler.cc b/chrome/browser/ui/webui/settings/site_settings_handler.cc new file mode 100644 index 0000000..490b179c --- /dev/null +++ b/chrome/browser/ui/webui/settings/site_settings_handler.cc
@@ -0,0 +1,63 @@ +// 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. + +#include "chrome/browser/ui/webui/settings/site_settings_handler.h" + +#include "base/bind.h" +#include "base/values.h" +#include "chrome/browser/profiles/profile.h" +#include "components/content_settings/core/common/content_settings_types.h" +#include "content/public/browser/browser_thread.h" +#include "content/public/browser/storage_partition.h" +#include "content/public/browser/web_ui.h" +#include "ui/base/text/bytes_formatting.h" + +namespace settings { + +SiteSettingsHandler::SiteSettingsHandler(Profile* profile) + : profile_(profile) { +} + +SiteSettingsHandler::~SiteSettingsHandler() { + if (storage_info_fetcher_.get()) + storage_info_fetcher_->RemoveObserver(this); +} + +void SiteSettingsHandler::RegisterMessages() { + web_ui()->RegisterMessageCallback( + "fetchUsageTotal", + base::Bind(&SiteSettingsHandler::HandleFetchUsageTotal, + base::Unretained(this))); +} + +void SiteSettingsHandler::OnGetUsageInfo( + const storage::UsageInfoEntries& entries) { + DCHECK_CURRENTLY_ON(content::BrowserThread::UI); + + for (const auto& entry : entries) { + if (entry.usage <= 0) continue; + if (entry.host == usage_host_) { + web_ui()->CallJavascriptFunction( + "settings.WebsiteUsagePrivateApi.returnUsageTotal", + base::StringValue(entry.host), + base::StringValue(ui::FormatBytes(entry.usage))); + return; + } + } +} + +void SiteSettingsHandler::HandleFetchUsageTotal( + const base::ListValue* args) { + CHECK_EQ(1U, args->GetSize()); + std::string host; + CHECK(args->GetString(0, &host)); + usage_host_ = host; + storage_info_fetcher_ = new StorageInfoFetcher( + content::BrowserContext::GetDefaultStoragePartition( + profile_)->GetQuotaManager()); + storage_info_fetcher_->AddObserver(this); + storage_info_fetcher_->Run(); +} + +} // namespace settings
diff --git a/chrome/browser/ui/webui/settings/site_settings_handler.h b/chrome/browser/ui/webui/settings/site_settings_handler.h new file mode 100644 index 0000000..f4ad68ea --- /dev/null +++ b/chrome/browser/ui/webui/settings/site_settings_handler.h
@@ -0,0 +1,52 @@ +// 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. + +#ifndef CHROME_BROWSER_UI_WEBUI_SETTINGS_SITE_SETTINGS_HANDLER_H_ +#define CHROME_BROWSER_UI_WEBUI_SETTINGS_SITE_SETTINGS_HANDLER_H_ + +#include <vector> + +#include "chrome/browser/storage/storage_info_fetcher.h" +#include "chrome/browser/ui/webui/settings/md_settings_ui.h" + +class Profile; + +namespace base { +class ListValue; +} + +namespace settings { + +// Chrome "ContentSettings" settings page UI handler. +class SiteSettingsHandler + : public SettingsPageUIHandler, StorageInfoFetcher::Observer { + public: + explicit SiteSettingsHandler(Profile* profile); + ~SiteSettingsHandler() override; + + // SettingsPageUIHandler: + void RegisterMessages() override; + + // StorageInfoFetcher::Observer: + void OnGetUsageInfo(const storage::UsageInfoEntries& entries) override; + + private: + // Asynchronously fetches the usage for a given origin. Replies back with + // OnGetUsageInfo above. + void HandleFetchUsageTotal(const base::ListValue* args); + + Profile* profile_; + + // The host for which to fetch usage. + std::string usage_host_; + + // The helper object asynchronously fetching storage info. + scoped_refptr<StorageInfoFetcher> storage_info_fetcher_; + + DISALLOW_COPY_AND_ASSIGN(SiteSettingsHandler); +}; + +} // namespace settings + +#endif // CHROME_BROWSER_UI_WEBUI_SETTINGS_SITE_SETTINGS_HANDLER_H_
diff --git a/chrome/browser/ui/webui/signin/get_auth_frame.cc b/chrome/browser/ui/webui/signin/get_auth_frame.cc new file mode 100644 index 0000000..f5705a2 --- /dev/null +++ b/chrome/browser/ui/webui/signin/get_auth_frame.cc
@@ -0,0 +1,54 @@ +// 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. + +#include "chrome/browser/ui/webui/signin/get_auth_frame.h" + +#include <set> + +#include "base/bind.h" +#include "components/guest_view/browser/guest_view_manager.h" +#include "content/public/browser/web_contents.h" +#include "extensions/browser/guest_view/web_view/web_view_guest.h" + +namespace { + +bool AddWebContentsToSet(std::set<content::WebContents*>* frame_set, + const std::string& web_view_name, + content::WebContents* web_contents) { + auto* web_view = extensions::WebViewGuest::FromWebContents(web_contents); + if (web_view && web_view->name() == web_view_name) + frame_set->insert(web_contents); + return false; +} + +} // namespace + +namespace signin { + +content::RenderFrameHost* GetAuthFrame(content::WebContents* web_contents, + const std::string& parent_frame_name) { + content::WebContents* auth_web_contents = + GetAuthFrameWebContents(web_contents, parent_frame_name); + return auth_web_contents ? auth_web_contents->GetMainFrame() : nullptr; +} + +content::WebContents* GetAuthFrameWebContents( + content::WebContents* web_contents, + const std::string& parent_frame_name) { + std::set<content::WebContents*> frame_set; + auto* manager = guest_view::GuestViewManager::FromBrowserContext( + web_contents->GetBrowserContext()); + if (manager) { + manager->ForEachGuest( + web_contents, + base::Bind(&AddWebContentsToSet, &frame_set, parent_frame_name)); + } + DCHECK_GE(1U, frame_set.size()); + if (!frame_set.empty()) + return *frame_set.begin(); + + return nullptr; +} + +} // namespace signin
diff --git a/chrome/browser/ui/webui/signin/get_auth_frame.h b/chrome/browser/ui/webui/signin/get_auth_frame.h new file mode 100644 index 0000000..7c56c6d8 --- /dev/null +++ b/chrome/browser/ui/webui/signin/get_auth_frame.h
@@ -0,0 +1,28 @@ +// 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. + +#ifndef CHROME_BROWSER_UI_WEBUI_SIGNIN_GET_AUTH_FRAME_H_ +#define CHROME_BROWSER_UI_WEBUI_SIGNIN_GET_AUTH_FRAME_H_ + +#include <string> + +namespace content { +class RenderFrameHost; +class WebContents; +} + +namespace signin { + +// Gets a webview within an auth page that has the specified parent frame name +// (i.e. <webview name="foobar"></webview>). +content::RenderFrameHost* GetAuthFrame(content::WebContents* web_contents, + const std::string& parent_frame_name); + +content::WebContents* GetAuthFrameWebContents( + content::WebContents* web_contents, + const std::string& parent_frame_name); + +} // namespace signin + +#endif // CHROME_BROWSER_UI_WEBUI_SIGNIN_GET_AUTH_FRAME_H_
diff --git a/chrome/browser/ui/webui/signin/inline_login_handler_impl.cc b/chrome/browser/ui/webui/signin/inline_login_handler_impl.cc index 674e882..aefdf66d 100644 --- a/chrome/browser/ui/webui/signin/inline_login_handler_impl.cc +++ b/chrome/browser/ui/webui/signin/inline_login_handler_impl.cc
@@ -41,7 +41,7 @@ #include "chrome/browser/ui/tab_modal_confirm_dialog_delegate.h" #include "chrome/browser/ui/tabs/tab_strip_model.h" #include "chrome/browser/ui/user_manager.h" -#include "chrome/browser/ui/webui/signin/inline_login_ui.h" +#include "chrome/browser/ui/webui/signin/get_auth_frame.h" #include "chrome/browser/ui/webui/signin/login_ui_service.h" #include "chrome/browser/ui/webui/signin/login_ui_service_factory.h" #include "chrome/common/url_constants.h" @@ -470,16 +470,16 @@ if (!web_contents()) return; - // Returns early if this is not a gaia iframe navigation. - const GURL kGaiaExtOrigin( - GaiaUrls::GetInstance()->signin_completed_continue_url().GetOrigin()); - content::RenderFrameHost* gaia_frame = InlineLoginUI::GetAuthFrame( - web_contents(), kGaiaExtOrigin, "signin-frame"); + // Returns early if this is not a gaia webview navigation. + content::RenderFrameHost* gaia_frame = + signin::GetAuthFrame(web_contents(), "signin-frame"); if (render_frame_host != gaia_frame) return; // Loading any untrusted (e.g., HTTP) URLs in the privileged sign-in process // will require confirmation before the sign in takes effect. + const GURL kGaiaExtOrigin( + GaiaUrls::GetInstance()->signin_completed_continue_url().GetOrigin()); if (!url.is_empty()) { GURL origin(url.GetOrigin()); if (url.spec() != url::kAboutBlankURL &&
diff --git a/chrome/browser/ui/webui/signin/inline_login_ui.cc b/chrome/browser/ui/webui/signin/inline_login_ui.cc index 9366941..c35321e 100644 --- a/chrome/browser/ui/webui/signin/inline_login_ui.cc +++ b/chrome/browser/ui/webui/signin/inline_login_ui.cc
@@ -5,58 +5,25 @@ #include "chrome/browser/ui/webui/signin/inline_login_ui.h" #include "base/command_line.h" -#include "base/files/file_util.h" -#include "base/path_service.h" -#include "base/strings/string_split.h" #include "build/build_config.h" #include "chrome/browser/extensions/chrome_extension_web_contents_observer.h" #include "chrome/browser/extensions/tab_helper.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/sessions/session_tab_helper.h" #include "chrome/browser/ui/webui/metrics_handler.h" -#include "chrome/common/chrome_paths.h" +#include "chrome/browser/ui/webui/test_files_request_filter.h" #include "chrome/common/chrome_switches.h" #include "chrome/common/url_constants.h" #include "chrome/grit/chromium_strings.h" -#include "components/guest_view/browser/guest_view_manager.h" #include "components/signin/core/common/profile_management_switches.h" -#include "content/public/browser/render_frame_host.h" #include "content/public/browser/web_ui.h" #include "content/public/browser/web_ui_data_source.h" #include "content/public/common/content_switches.h" -#include "extensions/browser/guest_view/web_view/web_view_guest.h" #include "grit/browser_resources.h" -#if defined(OS_CHROMEOS) -#include "chrome/browser/chromeos/login/startup_utils.h" -#include "chrome/browser/ui/webui/chromeos/login/inline_login_handler_chromeos.h" -#else #include "chrome/browser/ui/webui/signin/inline_login_handler_impl.h" -#endif namespace { -bool HandleTestFileRequestCallback( - const std::string& path, - const content::WebUIDataSource::GotDataCallback& callback) { - std::vector<std::string> url_substr = base::SplitString( - path, "/", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL); - if (url_substr.size() != 2 || url_substr[0] != "test") - return false; - - std::string contents; - base::FilePath test_data_dir; - PathService::Get(chrome::DIR_TEST_DATA, &test_data_dir); - if (!base::ReadFileToString( - test_data_dir.AppendASCII("webui").AppendASCII(url_substr[1]), - &contents, std::string::npos)) - return false; - - base::RefCountedString* ref_contents = new base::RefCountedString(); - ref_contents->data() = contents; - callback.Run(ref_contents); - return true; -} - content::WebUIDataSource* CreateWebUIDataSource() { content::WebUIDataSource* source = content::WebUIDataSource::Create(chrome::kChromeUIChromeSigninHost); @@ -71,7 +38,7 @@ const bool is_running_test = command_line->HasSwitch(::switches::kTestName) || command_line->HasSwitch(::switches::kTestType); if (is_running_test) - source->SetRequestFilter(base::Bind(&HandleTestFileRequestCallback)); + source->SetRequestFilter(test::GetTestFilesRequestFilter()); source->AddResourcePath("inline_login.css", IDR_INLINE_LOGIN_CSS); source->AddResourcePath("inline_login.js", IDR_INLINE_LOGIN_JS); @@ -81,15 +48,6 @@ return source; } -bool AddWebContentsToSet(std::set<content::WebContents*>* frame_set, - const std::string& web_view_name, - content::WebContents* web_contents) { - auto* web_view = extensions::WebViewGuest::FromWebContents(web_contents); - if (web_view && web_view->name() == web_view_name) - frame_set->insert(web_contents); - return false; -} - } // empty namespace InlineLoginUI::InlineLoginUI(content::WebUI* web_ui) @@ -97,12 +55,7 @@ auth_extension_(Profile::FromWebUI(web_ui)) { Profile* profile = Profile::FromWebUI(web_ui); content::WebUIDataSource::Add(profile, CreateWebUIDataSource()); - -#if defined(OS_CHROMEOS) - web_ui->AddMessageHandler(new chromeos::InlineLoginHandlerChromeOS()); -#else web_ui->AddMessageHandler(new InlineLoginHandlerImpl()); -#endif web_ui->AddMessageHandler(new MetricsHandler()); content::WebContents* contents = web_ui->GetWebContents(); @@ -120,32 +73,3 @@ InlineLoginUI::~InlineLoginUI() {} -// Gets the Gaia iframe within a WebContents. -content::RenderFrameHost* InlineLoginUI::GetAuthFrame( - content::WebContents* web_contents, - const GURL& parent_origin, - const std::string& parent_frame_name) { - content::WebContents* auth_web_contents = GetAuthFrameWebContents( - web_contents, parent_origin, parent_frame_name); - return auth_web_contents ? auth_web_contents->GetMainFrame() : nullptr; -} - -content::WebContents* InlineLoginUI::GetAuthFrameWebContents( - content::WebContents* web_contents, - const GURL& parent_origin, - const std::string& parent_frame_name) { - std::set<content::WebContents*> frame_set; - auto* manager = - guest_view::GuestViewManager::FromBrowserContext( - web_contents->GetBrowserContext()); - if (manager) { - manager->ForEachGuest( - web_contents, - base::Bind(&AddWebContentsToSet, &frame_set, parent_frame_name)); - } - DCHECK_GE(1U, frame_set.size()); - if (!frame_set.empty()) - return *frame_set.begin(); - - return nullptr; -}
diff --git a/chrome/browser/ui/webui/signin/inline_login_ui.h b/chrome/browser/ui/webui/signin/inline_login_ui.h index 6aea463..55b00d2 100644 --- a/chrome/browser/ui/webui/signin/inline_login_ui.h +++ b/chrome/browser/ui/webui/signin/inline_login_ui.h
@@ -9,10 +9,6 @@ #include "chrome/browser/extensions/signin/scoped_gaia_auth_extension.h" #include "ui/web_dialogs/web_dialog_ui.h" -namespace content { -class RenderFrameHost; -} - // Inline login WebUI in various signin flows for ChromeOS and Chrome desktop. // The authentication is carried out via the host gaia_auth extension. Upon // success, the profile of the webui should be populated with proper cookies. @@ -22,18 +18,6 @@ explicit InlineLoginUI(content::WebUI* web_ui); ~InlineLoginUI() override; - // Gets the frame (iframe or webview) within an auth page that has the - // specified parent origin if |parent_origin| is not empty, and the specified - // parent frame name. - static content::RenderFrameHost* GetAuthFrame( - content::WebContents* web_contents, - const GURL& parent_origin, - const std::string& parent_frame_name); - - static content::WebContents* GetAuthFrameWebContents( - content::WebContents* web_contents, - const GURL& parent_origin, - const std::string& parent_frame_name); private: ScopedGaiaAuthExtension auth_extension_;
diff --git a/chrome/browser/ui/webui/signin/inline_login_ui_browsertest.cc b/chrome/browser/ui/webui/signin/inline_login_ui_browsertest.cc index e1d21ac6..6be4d3d7 100644 --- a/chrome/browser/ui/webui/signin/inline_login_ui_browsertest.cc +++ b/chrome/browser/ui/webui/signin/inline_login_ui_browsertest.cc
@@ -353,8 +353,6 @@ ASSERT_NE(info1.pid, info3.pid); } -#if !defined(OS_CHROMEOS) - IN_PROC_BROWSER_TEST_F(InlineLoginUIBrowserTest, CanOfferNoProfile) { std::string error_message; EXPECT_FALSE(InlineLoginHandlerImpl::CanOffer( @@ -758,8 +756,6 @@ base::MessageLoop::current()->RunUntilIdle(); } -#endif // OS_CHROMEOS - class InlineLoginUISafeIframeBrowserTest : public InProcessBrowserTest { public: FooWebUIProvider& foo_provider() { return foo_provider_; } @@ -822,17 +818,10 @@ ui_test_utils::NavigateToURL(browser(), url); } -// Flaky on CrOS, http://crbug.com/364759. -#if defined(OS_CHROMEOS) -#define MAYBE_TopFrameNavigationDisallowed DISABLED_TopFrameNavigationDisallowed -#else -#define MAYBE_TopFrameNavigationDisallowed TopFrameNavigationDisallowed -#endif - // Make sure that the gaia iframe cannot trigger top-frame navigation. // TODO(guohui): flaky on trybot crbug/364759. IN_PROC_BROWSER_TEST_F(InlineLoginUISafeIframeBrowserTest, - MAYBE_TopFrameNavigationDisallowed) { + TopFrameNavigationDisallowed) { // Loads into gaia iframe a web page that attempts to deframe on load. GURL deframe_url(embedded_test_server()->GetURL("/login/deframe.html")); GURL url(net::AppendOrReplaceQueryParameter(GetSigninPromoURL(), "frameUrl", @@ -867,7 +856,6 @@ EXPECT_EQ(GURL("about:blank"), contents->GetVisibleURL()); } -#if !defined(OS_CHROMEOS) IN_PROC_BROWSER_TEST_F(InlineLoginUISafeIframeBrowserTest, ConfirmationRequiredForNonsecureSignin) { FakeGaia fake_gaia; @@ -896,4 +884,3 @@ run_loop.Run(); base::MessageLoop::current()->RunUntilIdle(); } -#endif // OS_CHROMEOS
diff --git a/chrome/browser/ui/webui/signin/login_ui_test_utils.cc b/chrome/browser/ui/webui/signin/login_ui_test_utils.cc index 6d01cf96..8ee2c5cc 100644 --- a/chrome/browser/ui/webui/signin/login_ui_test_utils.cc +++ b/chrome/browser/ui/webui/signin/login_ui_test_utils.cc
@@ -6,7 +6,7 @@ #include "chrome/browser/signin/signin_tracker_factory.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/tabs/tab_strip_model.h" -#include "chrome/browser/ui/webui/signin/inline_login_ui.h" +#include "chrome/browser/ui/webui/signin/get_auth_frame.h" #include "chrome/test/base/ui_test_utils.h" #include "content/public/browser/notification_service.h" #include "content/public/browser/notification_types.h" @@ -139,8 +139,7 @@ content::WebContents* web_contents = browser->tab_strip_model()->GetActiveWebContents(); ASSERT_TRUE(content::ExecuteScriptAndExtractString( - InlineLoginUI::GetAuthFrame(web_contents, GURL(), "signin-frame"), - js, &message)); + signin::GetAuthFrame(web_contents, "signin-frame"), js, &message)); ASSERT_EQ("found", message) << "Failed to find element with id " << element_id; @@ -152,9 +151,10 @@ browser->tab_strip_model()->GetActiveWebContents(); bool result = false; EXPECT_TRUE(content::ExecuteScriptAndExtractBool( - InlineLoginUI::GetAuthFrame(web_contents, GURL(), "signin-frame"), + signin::GetAuthFrame(web_contents, "signin-frame"), "window.domAutomationController.send(" - " document.getElementById('" + element_id + "') != null);", + " document.getElementById('" + + element_id + "') != null);", &result)); return result; } @@ -167,15 +167,15 @@ content::WebContents* web_contents = browser->tab_strip_model()->GetActiveWebContents(); - ASSERT_TRUE(content::ExecuteScript(InlineLoginUI::GetAuthFrame( - web_contents, GURL(), "signin-frame"), js)); + ASSERT_TRUE(content::ExecuteScript( + signin::GetAuthFrame(web_contents, "signin-frame"), js)); WaitUntilElementExistsInSigninFrame(browser, "Passwd"); js = "document.getElementById('Passwd').value = '" + password + "';" "document.getElementById('signIn').click();"; - ASSERT_TRUE(content::ExecuteScript(InlineLoginUI::GetAuthFrame( - web_contents, GURL(), "signin-frame"), js)); + ASSERT_TRUE(content::ExecuteScript( + signin::GetAuthFrame(web_contents, "signin-frame"), js)); } void SigninInOldGaiaFlow(Browser* browser, @@ -188,8 +188,8 @@ content::WebContents* web_contents = browser->tab_strip_model()->GetActiveWebContents(); - ASSERT_TRUE(content::ExecuteScript(InlineLoginUI::GetAuthFrame( - web_contents, GURL(), "signin-frame"), js)); + ASSERT_TRUE(content::ExecuteScript( + signin::GetAuthFrame(web_contents, "signin-frame"), js)); } void ExecuteJsToSigninInSigninFrame(Browser* browser,
diff --git a/chrome/browser/ui/webui/test_files_request_filter.cc b/chrome/browser/ui/webui/test_files_request_filter.cc new file mode 100644 index 0000000..2a57b48 --- /dev/null +++ b/chrome/browser/ui/webui/test_files_request_filter.cc
@@ -0,0 +1,46 @@ +// 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. + +#include "chrome/browser/ui/webui/test_files_request_filter.h" + +#include "base/bind.h" +#include "base/files/file_util.h" +#include "base/memory/ref_counted_memory.h" +#include "base/path_service.h" +#include "base/strings/string_split.h" +#include "chrome/common/chrome_paths.h" + +namespace { + +bool HandleTestFileRequestCallback( + const std::string& path, + const content::WebUIDataSource::GotDataCallback& callback) { + std::vector<std::string> url_substr = + base::SplitString(path, "/", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL); + if (url_substr.size() != 2 || url_substr[0] != "test") + return false; + + std::string contents; + base::FilePath test_data_dir; + PathService::Get(chrome::DIR_TEST_DATA, &test_data_dir); + if (!base::ReadFileToString( + test_data_dir.AppendASCII("webui").AppendASCII(url_substr[1]), + &contents, std::string::npos)) + return false; + + base::RefCountedString* ref_contents = new base::RefCountedString(); + ref_contents->data() = contents; + callback.Run(ref_contents); + return true; +} + +} // namespace + +namespace test { + +content::WebUIDataSource::HandleRequestCallback GetTestFilesRequestFilter() { + return base::Bind(&HandleTestFileRequestCallback); +} + +} // namespace test
diff --git a/chrome/browser/ui/webui/test_files_request_filter.h b/chrome/browser/ui/webui/test_files_request_filter.h new file mode 100644 index 0000000..e6e49bd --- /dev/null +++ b/chrome/browser/ui/webui/test_files_request_filter.h
@@ -0,0 +1,19 @@ +// 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. + +#ifndef CHROME_BROWSER_UI_WEBUI_TEST_FILES_REQUEST_FILTER_H_ +#define CHROME_BROWSER_UI_WEBUI_TEST_FILES_REQUEST_FILTER_H_ + +#include "content/public/browser/web_ui_data_source.h" + +namespace test { + +// Returns a callback to be used as a filter in WebUIDataSource. +// The filter responds with a content of "%DIR_TEST_DATA%/webui/<filename>" if +// request path has "/test/<filename>" format. +content::WebUIDataSource::HandleRequestCallback GetTestFilesRequestFilter(); + +} // namespace test + +#endif // CHROME_BROWSER_UI_WEBUI_TEST_FILES_REQUEST_FILTER_H_
diff --git a/chrome/browser/ui/webui/webui_webview_browsertest.cc b/chrome/browser/ui/webui/webui_webview_browsertest.cc index da0bf0d..784d662 100644 --- a/chrome/browser/ui/webui/webui_webview_browsertest.cc +++ b/chrome/browser/ui/webui/webui_webview_browsertest.cc
@@ -39,9 +39,13 @@ } GURL GetWebViewEnabledWebUIURL() const { +#if defined(OS_CHROMEOS) + return GURL(chrome::kChromeUIOobeURL).Resolve("/login"); +#else return GURL(signin::GetPromoURL( signin_metrics::AccessPoint::ACCESS_POINT_START_PAGE, signin_metrics::Reason::REASON_SIGNIN_PRIMARY_ACCOUNT, false)); +#endif } private:
diff --git a/chrome/chrome_browser.gypi b/chrome/chrome_browser.gypi index a4cf99ea..414b24d0 100644 --- a/chrome/chrome_browser.gypi +++ b/chrome/chrome_browser.gypi
@@ -563,6 +563,8 @@ 'browser/storage/durable_storage_permission_context.h', 'browser/storage/durable_storage_permission_context_factory.cc', 'browser/storage/durable_storage_permission_context_factory.h', + 'browser/storage/storage_info_fetcher.cc', + 'browser/storage/storage_info_fetcher.h', 'browser/tab_contents/navigation_metrics_recorder.cc', 'browser/tab_contents/navigation_metrics_recorder.h', 'browser/tab_contents/retargeting_details.h',
diff --git a/chrome/chrome_browser_extensions.gypi b/chrome/chrome_browser_extensions.gypi index 04b53e7..2689005 100644 --- a/chrome/chrome_browser_extensions.gypi +++ b/chrome/chrome_browser_extensions.gypi
@@ -68,7 +68,6 @@ 'browser/extensions/api/messaging/native_message_process_host.h', 'browser/extensions/api/messaging/native_process_launcher.cc', 'browser/extensions/api/messaging/native_process_launcher.h', - 'browser/extensions/api/messaging/native_process_launcher_android.cc', 'browser/extensions/api/messaging/native_process_launcher_posix.cc', 'browser/extensions/api/messaging/native_process_launcher_win.cc', ],
diff --git a/chrome/chrome_browser_ui.gypi b/chrome/chrome_browser_ui.gypi index 088af29..adae246 100644 --- a/chrome/chrome_browser_ui.gypi +++ b/chrome/chrome_browser_ui.gypi
@@ -248,8 +248,6 @@ 'browser/ui/webui/chromeos/login/hid_detection_screen_handler.h', 'browser/ui/webui/chromeos/login/host_pairing_screen_handler.cc', 'browser/ui/webui/chromeos/login/host_pairing_screen_handler.h', - 'browser/ui/webui/chromeos/login/inline_login_handler_chromeos.cc', - 'browser/ui/webui/chromeos/login/inline_login_handler_chromeos.h', 'browser/ui/webui/chromeos/login/kiosk_app_menu_handler.cc', 'browser/ui/webui/chromeos/login/kiosk_app_menu_handler.h', 'browser/ui/webui/chromeos/login/kiosk_autolaunch_screen_handler.cc', @@ -393,6 +391,8 @@ 'browser/ui/webui/sync_internals_message_handler.h', 'browser/ui/webui/sync_internals_ui.cc', 'browser/ui/webui/sync_internals_ui.h', + 'browser/ui/webui/test_files_request_filter.cc', + 'browser/ui/webui/test_files_request_filter.h', 'browser/ui/webui/theme_source.cc', 'browser/ui/webui/theme_source.h', 'browser/ui/webui/translate_internals/translate_internals_handler.cc', @@ -1319,6 +1319,10 @@ 'browser/ui/views/profiles/new_avatar_button.h', 'browser/ui/webui/app_launcher_page_ui.cc', 'browser/ui/webui/app_launcher_page_ui.h', + 'browser/ui/webui/signin/inline_login_ui.cc', + 'browser/ui/webui/signin/inline_login_ui.h', + 'browser/ui/webui/signin/inline_login_handler.cc', + 'browser/ui/webui/signin/inline_login_handler.h', 'browser/ui/webui/signin/inline_login_handler_impl.cc', 'browser/ui/webui/signin/inline_login_handler_impl.h', 'browser/ui/webui/signin/sync_confirmation_handler.cc', @@ -2008,10 +2012,10 @@ 'browser/ui/webui/settings/settings_manage_profile_handler.h', 'browser/ui/webui/settings/settings_startup_pages_handler.cc', 'browser/ui/webui/settings/settings_startup_pages_handler.h', - 'browser/ui/webui/signin/inline_login_handler.cc', - 'browser/ui/webui/signin/inline_login_handler.h', - 'browser/ui/webui/signin/inline_login_ui.cc', - 'browser/ui/webui/signin/inline_login_ui.h', + 'browser/ui/webui/signin/get_auth_frame.cc', + 'browser/ui/webui/signin/get_auth_frame.h', + 'browser/ui/webui/settings/site_settings_handler.cc', + 'browser/ui/webui/settings/site_settings_handler.h', 'browser/ui/webui/signin/login_ui_service.cc', 'browser/ui/webui/signin/login_ui_service.h', 'browser/ui/webui/signin/login_ui_service_factory.cc', @@ -2442,6 +2446,8 @@ 'browser/ui/views/tabs/window_finder_mac.mm', 'browser/ui/views/tabs/window_finder_win.cc', 'browser/ui/views/task_manager_view.cc', + 'browser/ui/views/theme_copying_widget.cc', + 'browser/ui/views/theme_copying_widget.h', 'browser/ui/views/toolbar/app_menu.cc', 'browser/ui/views/toolbar/app_menu.h', 'browser/ui/views/toolbar/app_menu_button.cc',
diff --git a/chrome/chrome_tests.gypi b/chrome/chrome_tests.gypi index e638b8c..62161e6 100644 --- a/chrome/chrome_tests.gypi +++ b/chrome/chrome_tests.gypi
@@ -519,8 +519,6 @@ 'browser/ui/toolbar/component_toolbar_actions_browsertest.cc', 'browser/ui/toolbar/mock_component_toolbar_actions_factory.cc', 'browser/ui/toolbar/mock_component_toolbar_actions_factory.h', - 'browser/ui/toolbar/test_toolbar_model.cc', - 'browser/ui/toolbar/test_toolbar_model.h', 'browser/ui/website_settings/mock_permission_bubble_view.cc', 'browser/ui/website_settings/mock_permission_bubble_view.h', 'browser/ui/website_settings/permission_bubble_browser_test_util.cc', @@ -1073,8 +1071,6 @@ 'browser/ui/search/instant_test_utils.h', 'browser/ui/search/local_ntp_browsertest.cc', 'browser/ui/startup/startup_browser_creator_interactive_uitest.cc', - 'browser/ui/toolbar/test_toolbar_model.cc', - 'browser/ui/toolbar/test_toolbar_model.h', 'browser/ui/translate/translate_bubble_test_utils.h', 'browser/ui/views/accessibility/navigation_accessibility_uitest_win.cc', 'browser/ui/webui/options/language_dictionary_interactive_uitest.cc', @@ -2163,7 +2159,6 @@ '../third_party/safe_browsing/safe_browsing.gyp:safe_browsing', '../third_party/webrtc/modules/modules.gyp:desktop_capture', '../third_party/widevine/cdm/widevine_cdm.gyp:widevine_cdm_version_h', - '../third_party/zlib/google/zip.gyp:compression_utils', '../ui/accessibility/accessibility.gyp:accessibility_test_support', '../ui/compositor/compositor.gyp:compositor_test_support', '../ui/resources/ui_resources.gyp:ui_resources', @@ -2363,6 +2358,8 @@ 'browser/ui/bookmarks/bookmark_bubble_sign_in_delegate_browsertest.cc', # chromeos does not use cross-platform panels 'browser/ui/panels/panel_extension_browsertest.cc', + # inline login UI is disabled on chromeos + 'browser/ui/webui/signin/inline_login_ui_browsertest.cc', # chromeos does not use the desktop user manager 'browser/ui/webui/signin/user_manager_ui_browsertest.cc', ],
diff --git a/chrome/chrome_tests_unit.gypi b/chrome/chrome_tests_unit.gypi index 15460b8..9a292c1 100644 --- a/chrome/chrome_tests_unit.gypi +++ b/chrome/chrome_tests_unit.gypi
@@ -152,12 +152,12 @@ 'browser/net/spdyproxy/data_reduction_proxy_chrome_settings_unittest.cc', 'browser/net/spdyproxy/data_reduction_proxy_settings_unittest_android.cc', 'browser/net/url_info_unittest.cc', - 'browser/page_load_metrics/observers/page_load_metrics_observer_test_harness.cc', - 'browser/page_load_metrics/observers/page_load_metrics_observer_test_harness.h', 'browser/page_load_metrics/observers/aborts_page_load_metrics_observer_unittest.cc', 'browser/page_load_metrics/observers/core_page_load_metrics_observer_unittest.cc', 'browser/page_load_metrics/observers/from_gws_page_load_metrics_observer_unittest.cc', 'browser/page_load_metrics/observers/google_captcha_observer_unittest.cc', + 'browser/page_load_metrics/observers/page_load_metrics_observer_test_harness.cc', + 'browser/page_load_metrics/observers/page_load_metrics_observer_test_harness.h', 'browser/password_manager/chrome_password_manager_client_unittest.cc', 'browser/password_manager/password_manager_internals_service_unittest.cc', 'browser/password_manager/password_store_mac_unittest.cc', @@ -1211,11 +1211,11 @@ 'browser/ui/cocoa/bookmarks/bookmark_model_observer_for_cocoa_unittest.mm', 'browser/ui/cocoa/bookmarks/bookmark_name_folder_controller_unittest.mm', 'browser/ui/cocoa/bookmarks/bookmark_tree_browser_cell_unittest.mm', + 'browser/ui/cocoa/browser/edit_search_engine_cocoa_controller_unittest.mm', + 'browser/ui/cocoa/browser/zoom_bubble_controller_unittest.mm', 'browser/ui/cocoa/browser_window_cocoa_unittest.mm', 'browser/ui/cocoa/browser_window_controller_unittest.mm', 'browser/ui/cocoa/browser_window_layout_unittest.mm', - 'browser/ui/cocoa/browser/edit_search_engine_cocoa_controller_unittest.mm', - 'browser/ui/cocoa/browser/zoom_bubble_controller_unittest.mm', 'browser/ui/cocoa/bubble_view_unittest.mm', 'browser/ui/cocoa/chrome_browser_window_unittest.mm', 'browser/ui/cocoa/clickhold_button_cell_unittest.mm', @@ -1274,8 +1274,8 @@ 'browser/ui/cocoa/infobars/translate_infobar_unittest.mm', 'browser/ui/cocoa/location_bar/autocomplete_text_field_cell_unittest.mm', 'browser/ui/cocoa/location_bar/autocomplete_text_field_editor_unittest.mm', - 'browser/ui/cocoa/location_bar/autocomplete_text_field_unittest_helper.mm', 'browser/ui/cocoa/location_bar/autocomplete_text_field_unittest.mm', + 'browser/ui/cocoa/location_bar/autocomplete_text_field_unittest_helper.mm', 'browser/ui/cocoa/location_bar/ev_bubble_decoration_unittest.mm', 'browser/ui/cocoa/location_bar/image_decoration_unittest.mm', 'browser/ui/cocoa/location_bar/keyword_hint_decoration_unittest.mm', @@ -1568,8 +1568,6 @@ 'browser/ui/toolbar/recent_tabs_sub_menu_model_unittest.cc', 'browser/ui/toolbar/test_toolbar_actions_bar_bubble_delegate.cc', 'browser/ui/toolbar/test_toolbar_actions_bar_bubble_delegate.h', - 'browser/ui/toolbar/test_toolbar_model.cc', - 'browser/ui/toolbar/test_toolbar_model.h', 'browser/ui/toolbar/toolbar_actions_bar_unittest.cc', 'browser/ui/toolbar/toolbar_actions_bar_unittest.h', 'browser/ui/toolbar/toolbar_actions_model_unittest.cc', @@ -1697,6 +1695,7 @@ '../components/components.gyp:sync_driver_test_support', '../components/components.gyp:sync_sessions_test_support', '../components/components.gyp:syncable_prefs_test_support', + '../components/components.gyp:toolbar_test_support', '../components/components.gyp:update_client_test_support', '../components/components.gyp:user_prefs_tracked_test_support', '../content/content.gyp:content_app_both',
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn index 60fbe7d..648869a 100644 --- a/chrome/test/BUILD.gn +++ b/chrome/test/BUILD.gn
@@ -108,6 +108,7 @@ "//components/sync_driver:test_support", "//components/sync_sessions:test_support", "//components/syncable_prefs:test_support", + "//components/toolbar:test_support", "//components/ui/zoom:test_support", "//components/update_client:test_support", "//content/public/app:both", @@ -1030,6 +1031,9 @@ # chromeos does not use cross-platform panels "../browser/ui/panels/panel_extension_browsertest.cc", + # inline login UI is disabled on chromeos + "../browser/ui/webui/signin/inline_login_ui_browsertest.cc", + # chromeos does not use the desktop user manager "../browser/ui/webui/signin/user_manager_ui_browsertest.cc", ]
diff --git a/chrome/test/data/webui/settings/site_details_tests.js b/chrome/test/data/webui/settings/site_details_tests.js index bb81b2e0..38c5197 100644 --- a/chrome/test/data/webui/settings/site_details_tests.js +++ b/chrome/test/data/webui/settings/site_details_tests.js
@@ -107,12 +107,10 @@ test('empty state', function() { testElement.prefs = prefsEmpty; - testElement.origin = "http://www.google.com"; + testElement.origin = 'http://www.google.com'; - // Once actual storage numbers are shown (instead of hard-coded), these - // two will become hidden by default. - assertFalse(testElement.$.usage.hidden); - assertFalse(testElement.$.storage.hidden); + assertTrue(testElement.$.usage.hidden); + assertTrue(testElement.$.storage.hidden); // TODO(finnur): Check for the Permission heading hiding when no // permissions are showing. @@ -130,7 +128,7 @@ test('all categories visible', function() { testElement.prefs = prefs; - testElement.origin = "https://foo-allow.com:443"; + testElement.origin = 'https://foo-allow.com:443'; var msg = 'All categories should be showing'; assertNotEquals(0, testElement.$.camera.offsetHeight, msg); @@ -142,6 +140,30 @@ assertNotEquals(0, testElement.$.notification.offsetHeight, msg); assertNotEquals(0, testElement.$.popups.offsetHeight, msg); }); + + test('usage heading shows on storage available', function() { + // Remove the current website-usage-private-api element. + var parent = testElement.$.usageApi.parentNode; + testElement.$.usageApi.remove(); + + // Replace it with a mock version. + Polymer({ + is: 'mock-website-usage-private-api', + + fetchUsageTotal: function(origin) { + testElement.storedData_ = '1 KB'; + }, + }); + var api = document.createElement('mock-website-usage-private-api'); + testElement.$.usageApi = api; + Polymer.dom(parent).appendChild(api); + + testElement.prefs = prefs; + testElement.origin = 'https://foo-allow.com:443'; + + assertFalse(testElement.$.usage.hidden); + assertFalse(testElement.$.storage.hidden); + }); }); } return {
diff --git a/chrome/test/nacl/nacl_browsertest.cc b/chrome/test/nacl/nacl_browsertest.cc index 79537da..784165c 100644 --- a/chrome/test/nacl/nacl_browsertest.cc +++ b/chrome/test/nacl/nacl_browsertest.cc
@@ -152,8 +152,13 @@ IN_PROC_BROWSER_TEST_F(NaClBrowserTestNewlib, IrtManifestFile) { RunNaClIntegrationTest(FILE_PATH_LITERAL("irt_manifest_file_test.html")); } -IN_PROC_BROWSER_TEST_F(NaClBrowserTestPnaclNonSfi, - MAYBE_PNACL_NONSFI(IrtManifestFile)) { +#if defined(OS_LINUX) +// http://crbug.com/579804 +#define MAYBE_IrtManifestFile DISABLED_IrtManifestFile +#else +#define MAYBE_IrtManifestFile MAYBE_PNACL_NONSFI(IrtManifestFile) +#endif +IN_PROC_BROWSER_TEST_F(NaClBrowserTestPnaclNonSfi, MAYBE_IrtManifestFile) { RunNaClIntegrationTest(FILE_PATH_LITERAL("irt_manifest_file_test.html")); } @@ -166,8 +171,13 @@ IN_PROC_BROWSER_TEST_F(NaClBrowserTestNewlib, MAYBE_IrtException) { RunNaClIntegrationTest(FILE_PATH_LITERAL("irt_exception_test.html")); } -IN_PROC_BROWSER_TEST_F(NaClBrowserTestPnaclNonSfi, - MAYBE_PNACL_NONSFI(IrtException)) { +#if defined(OS_LINUX) +// http://crbug.com/579804 +#define MAYBE_IrtException2 DISABLED_IrtException +#else +#define MAYBE_IrtException2 MAYBE_PNACL_NONSFI(IrtException) +#endif +IN_PROC_BROWSER_TEST_F(NaClBrowserTestPnaclNonSfi, MAYBE_IrtException2) { RunNaClIntegrationTest(FILE_PATH_LITERAL("irt_exception_test.html")); }
diff --git a/chrome/test/ppapi/ppapi_browsertest.cc b/chrome/test/ppapi/ppapi_browsertest.cc index 53375146..32d8057 100644 --- a/chrome/test/ppapi/ppapi_browsertest.cc +++ b/chrome/test/ppapi/ppapi_browsertest.cc
@@ -1290,8 +1290,13 @@ RunTests("packaged_app"); } -IN_PROC_BROWSER_TEST_F(NonSfiPackagedAppTest, - MAYBE_PNACL_NONSFI(SuccessfulLoad)) { +#if defined(OS_LINUX) +// http://crbug.com/579804 +#define MAYBE_SuccessfulLoad DISABLED_SuccessfulLoad +#else +#define MAYBE_SuccessfulLoad MAYBE_PNACL_NONSFI(SuccessfulLoad) +#endif +IN_PROC_BROWSER_TEST_F(NonSfiPackagedAppTest, MAYBE_SuccessfulLoad) { RunTests("packaged_app"); }
diff --git a/chrome/test/ppapi/ppapi_filechooser_browsertest.cc b/chrome/test/ppapi/ppapi_filechooser_browsertest.cc index 79c1f13..181d109 100644 --- a/chrome/test/ppapi/ppapi_filechooser_browsertest.cc +++ b/chrome/test/ppapi/ppapi_filechooser_browsertest.cc
@@ -309,6 +309,16 @@ RunTestViaHTTP("FileChooser_SaveAsDangerousExecutableDisallowed"); } +IN_PROC_BROWSER_TEST_F(PPAPIFileChooserTest, + FileChooser_SaveAs_DangerousExtensionList_Disallowed) { + base::CommandLine::ForCurrentProcess()->AppendSwitch( + switches::kDisallowUncheckedDangerousDownloads); + TestSelectFileDialogFactory test_dialog_factory( + TestSelectFileDialogFactory::NOT_REACHED, + TestSelectFileDialogFactory::SelectedFileInfoList()); + RunTestViaHTTP("FileChooser_SaveAsDangerousExtensionListDisallowed"); +} + // The kDisallowUncheckedDangerousDownloads switch (whose behavior is verified // by the FileChooser_SaveAs_DangerousExecutable_Disallowed test above) should // block the file being downloaded. However, the FakeDatabaseManager reports
diff --git a/chrome/test/remoting/webapp_javascript_unittest.cc b/chrome/test/remoting/webapp_javascript_unittest.cc index 676daa9..d04f261 100644 --- a/chrome/test/remoting/webapp_javascript_unittest.cc +++ b/chrome/test/remoting/webapp_javascript_unittest.cc
@@ -13,14 +13,10 @@ namespace remoting { // Flakily times out on Win7 Tests (dbg) and Linux Tests (dbg)(1): -// https://crbug.com/504204. -#if (defined(OS_WIN) || defined(OS_LINUX)) && !defined(NDEBUG) -#define MAYBE_Remoting_Webapp_Js_Unittest DISABLED_Remoting_Webapp_Js_Unittest -#else -#define MAYBE_Remoting_Webapp_Js_Unittest Remoting_Webapp_Js_Unittest -#endif +// https://crbug.com/504204. Recently completely broken on +// Linux: https://crbug.com/582005 IN_PROC_BROWSER_TEST_F(QUnitBrowserTestRunner, - MAYBE_Remoting_Webapp_Js_Unittest) { + DISABLED_Remoting_Webapp_Js_Unittest) { base::FilePath base_dir; ASSERT_TRUE(PathService::Get(base::DIR_EXE, &base_dir));
diff --git a/chrome/unit_tests_apk.isolate b/chrome/unit_tests_apk.isolate index cc4da8e..b11ff2a 100644 --- a/chrome/unit_tests_apk.isolate +++ b/chrome/unit_tests_apk.isolate
@@ -10,6 +10,7 @@ 'variables': { 'command': [ '<(PRODUCT_DIR)/bin/run_unit_tests', + '--logcat-output-dir', '${ISOLATED_OUTDIR}/logcats', ], 'files': [ '../base/base.isolate',
diff --git a/chromeos/CHROMEOS_LKGM b/chromeos/CHROMEOS_LKGM index 10799961..95e9497 100644 --- a/chromeos/CHROMEOS_LKGM +++ b/chromeos/CHROMEOS_LKGM
@@ -1 +1 @@ -7867.0.0 \ No newline at end of file +7871.0.0 \ No newline at end of file
diff --git a/components/autofill.gypi b/components/autofill.gypi index ac24009d..93d634f 100644 --- a/components/autofill.gypi +++ b/components/autofill.gypi
@@ -11,7 +11,6 @@ 'dependencies': [ '../base/base.gyp:base', '../base/base.gyp:base_i18n', - '../third_party/zlib/google/zip.gyp:compression_utils', '../url/url.gyp:url_lib', ], 'include_dirs': [
diff --git a/components/autofill/core/DEPS b/components/autofill/core/DEPS index 5af6466..2ee4fb8 100644 --- a/components/autofill/core/DEPS +++ b/components/autofill/core/DEPS
@@ -1,5 +1,4 @@ include_rules = [ - "+components/compression", "+components/os_crypt", "+components/pref_registry", "+components/rappor",
diff --git a/components/autofill/core/browser/BUILD.gn b/components/autofill/core/browser/BUILD.gn index b60d136..95a0cbf 100644 --- a/components/autofill/core/browser/BUILD.gn +++ b/components/autofill/core/browser/BUILD.gn
@@ -193,7 +193,6 @@ "//third_party/libaddressinput:util", "//third_party/libphonenumber", "//third_party/re2", - "//third_party/zlib:compression_utils", "//ui/base", "//ui/gfx", "//ui/gfx/geometry", @@ -325,7 +324,6 @@ "//testing/gtest", "//third_party/libaddressinput:util", "//third_party/libphonenumber", - "//third_party/zlib:compression_utils", "//ui/base", "//url", ]
diff --git a/components/autofill/core/browser/autofill_download_manager.cc b/components/autofill/core/browser/autofill_download_manager.cc index 2db18f50..62193e8 100644 --- a/components/autofill/core/browser/autofill_download_manager.cc +++ b/components/autofill/core/browser/autofill_download_manager.cc
@@ -26,7 +26,6 @@ #include "net/http/http_response_headers.h" #include "net/http/http_status_code.h" #include "net/url_request/url_fetcher.h" -#include "third_party/zlib/google/compression_utils.h" #include "url/gurl.h" namespace autofill { @@ -238,18 +237,6 @@ DCHECK(request_context); GURL request_url = GetRequestUrl(request_data.request_type); - // TODO(crbug.com/580102): Remove the compression step. - std::string compressed_data; - if (!compression::GzipCompress(request_data.payload, &compressed_data)) { - NOTREACHED(); - return false; - } - - const int compression_ratio = base::checked_cast<int>( - 100 * compressed_data.size() / request_data.payload.size()); - AutofillMetrics::LogPayloadCompressionRatio(compression_ratio, - request_data.request_type); - // Id is ignored for regular chrome, in unit test id's for fake fetcher // factory will be 0, 1, 2, ... net::URLFetcher* fetcher = @@ -260,12 +247,11 @@ url_fetchers_[fetcher] = request_data; fetcher->SetAutomaticallyRetryOn5xx(false); fetcher->SetRequestContext(request_context); - fetcher->SetUploadData("text/proto", compressed_data); + fetcher->SetUploadData("text/proto", request_data.payload); fetcher->SetLoadFlags(net::LOAD_DO_NOT_SAVE_COOKIES | net::LOAD_DO_NOT_SEND_COOKIES); - // Add Chrome experiment state and GZIP encoding to the request headers. + // Add Chrome experiment state to the request headers. net::HttpRequestHeaders headers; - headers.SetHeaderIfMissing("content-encoding", "gzip"); variations::AppendVariationHeaders( fetcher->GetOriginalURL(), driver_->IsOffTheRecord(), false, &headers); fetcher->SetExtraRequestHeaders(headers.ToString());
diff --git a/components/autofill/core/browser/autofill_download_manager.h b/components/autofill/core/browser/autofill_download_manager.h index 963fefaa..c470614 100644 --- a/components/autofill/core/browser/autofill_download_manager.h +++ b/components/autofill/core/browser/autofill_download_manager.h
@@ -94,7 +94,6 @@ FRIEND_TEST_ALL_PREFIXES(AutofillDownloadManagerTest, QueryAndUploadTest); FRIEND_TEST_ALL_PREFIXES(AutofillDownloadManagerTest, BackoffLogic_Upload); FRIEND_TEST_ALL_PREFIXES(AutofillDownloadManagerTest, BackoffLogic_Query); - FRIEND_TEST_ALL_PREFIXES(AutofillDownloadManagerTest, UploadRequestIsGzipped); struct FormRequestData; typedef std::list<std::pair<std::string, std::string> > QueryRequestCache;
diff --git a/components/autofill/core/browser/autofill_download_manager_unittest.cc b/components/autofill/core/browser/autofill_download_manager_unittest.cc index ad5c65c4..d1f0488 100644 --- a/components/autofill/core/browser/autofill_download_manager_unittest.cc +++ b/components/autofill/core/browser/autofill_download_manager_unittest.cc
@@ -21,14 +21,12 @@ #include "components/autofill/core/browser/form_structure.h" #include "components/autofill/core/browser/test_autofill_driver.h" #include "components/autofill/core/common/form_data.h" -#include "net/http/http_request_headers.h" #include "net/http/http_status_code.h" #include "net/url_request/test_url_fetcher_factory.h" #include "net/url_request/url_request_status.h" #include "net/url_request/url_request_test_util.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" -#include "third_party/zlib/google/compression_utils.h" using base::ASCIIToUTF16; @@ -49,13 +47,6 @@ fetcher->delegate()->OnURLFetchComplete(fetcher); } -// Compresses |data| and returns the result. -std::string Compress(const std::string& data) { - std::string compressed_data; - EXPECT_TRUE(compression::GzipCompress(data, &compressed_data)); - return compressed_data; -} - } // namespace // This tests AutofillDownloadManager. AutofillDownloadManagerTest implements @@ -649,131 +640,4 @@ EXPECT_EQ(responses[0], responses_.front().response); } -TEST_F(AutofillDownloadManagerTest, QueryRequestIsGzipped) { - // Expected query (uncompressed for visual verification). - AutofillQueryContents query; - query.set_client_version("6.1.1715.1442/en (GGLL)"); - AutofillQueryContents::Form* query_form = query.add_form(); - query_form->set_signature(14546501144368603154U); - - query_form->add_field()->set_signature(239111655U); - query_form->add_field()->set_signature(3763331450U); - query_form->add_field()->set_signature(3494530716U); - - std::string expected_query_string; - ASSERT_TRUE(query.SerializeToString(&expected_query_string)); - - // Create and register factory. - net::TestURLFetcherFactory factory; - - FormData form; - - FormFieldData field; - field.form_control_type = "text"; - - field.label = ASCIIToUTF16("username"); - field.name = ASCIIToUTF16("username"); - form.fields.push_back(field); - - field.label = ASCIIToUTF16("First Name"); - field.name = ASCIIToUTF16("firstname"); - form.fields.push_back(field); - - field.label = ASCIIToUTF16("Last Name"); - field.name = ASCIIToUTF16("lastname"); - form.fields.push_back(field); - - FormStructure* form_structure = new FormStructure(form); - ScopedVector<FormStructure> form_structures; - form_structures.push_back(form_structure); - - base::HistogramTester histogram; - // Request with id 0. - EXPECT_TRUE(download_manager_.StartQueryRequest(form_structures.get())); - histogram.ExpectUniqueSample("Autofill.ServerQueryResponse", - AutofillMetrics::QUERY_SENT, 1); - - // Request payload is gzipped. - net::TestURLFetcher* fetcher = factory.GetFetcherByID(0); - ASSERT_TRUE(fetcher); - EXPECT_EQ(Compress(expected_query_string), fetcher->upload_data()); - - // Proper content-encoding header is defined. - net::HttpRequestHeaders headers; - fetcher->GetExtraRequestHeaders(&headers); - std::string header; - EXPECT_TRUE(headers.GetHeader("content-encoding", &header)); - EXPECT_EQ("gzip", header); - - // TODO(http://crbug.com/580102) The >100% compression ratio is a known - // problem. - // Expect that the compression is logged. - // NOTE: To get the expected value, run tests with --vmodule=autofill*=1 and - // watch for the VLOG which indicates compression. - histogram.ExpectUniqueSample("Autofill.PayloadCompressionRatio.Query", 133, - 1); -} - -TEST_F(AutofillDownloadManagerTest, UploadRequestIsGzipped) { - // Expected upload (uncompressed for visual verification). - AutofillUploadContents upload; - upload.set_submission(true); - upload.set_client_version("6.1.1715.1442/en (GGLL)"); - upload.set_form_signature(14546501144368603154U); - upload.set_autofill_used(true); - upload.set_data_present(""); - - std::string expected_upload_string; - ASSERT_TRUE(upload.SerializeToString(&expected_upload_string)); - - // Create and register factory. - net::TestURLFetcherFactory factory; - - FormData form; - - FormFieldData field; - field.form_control_type = "text"; - - field.label = ASCIIToUTF16("username"); - field.name = ASCIIToUTF16("username"); - form.fields.push_back(field); - - field.label = ASCIIToUTF16("First Name"); - field.name = ASCIIToUTF16("firstname"); - form.fields.push_back(field); - - field.label = ASCIIToUTF16("Last Name"); - field.name = ASCIIToUTF16("lastname"); - form.fields.push_back(field); - - FormStructure* form_structure = new FormStructure(form); - ScopedVector<FormStructure> form_structures; - form_structures.push_back(form_structure); - - base::HistogramTester histogram; - // Request with id 0. - EXPECT_TRUE(download_manager_.StartUploadRequest( - *(form_structures[0]), true, ServerFieldTypeSet(), std::string(), true)); - - // Request payload is gzipped. - net::TestURLFetcher* fetcher = factory.GetFetcherByID(0); - ASSERT_TRUE(fetcher); - EXPECT_EQ(Compress(expected_upload_string), fetcher->upload_data()); - - // Proper content-encoding header is defined. - net::HttpRequestHeaders headers; - fetcher->GetExtraRequestHeaders(&headers); - std::string header; - EXPECT_TRUE(headers.GetHeader("content-encoding", &header)); - EXPECT_EQ("gzip", header); - - // TODO(http://crbug.com/580102) The >100% compression ratio is a known - // problem. - // Expect that the compression is logged. - // NOTE: To get the expected value, run tests with --vmodule=autofill*=1 and - // watch for the VLOG which indicates compression. - histogram.ExpectUniqueSample("Autofill.PayloadCompressionRatio.Upload", 150, - 1); -} - } // namespace autofill
diff --git a/components/autofill/core/browser/autofill_metrics.cc b/components/autofill/core/browser/autofill_metrics.cc index 41ffc80..82befa4 100644 --- a/components/autofill/core/browser/autofill_metrics.cc +++ b/components/autofill/core/browser/autofill_metrics.cc
@@ -683,22 +683,6 @@ AUTOFILL_FORM_SUBMITTED_STATE_ENUM_SIZE); } -// static -void AutofillMetrics::LogPayloadCompressionRatio( - int compression_ratio, - AutofillDownloadManager::RequestType type) { - switch (type) { - case AutofillDownloadManager::REQUEST_QUERY: - UMA_HISTOGRAM_PERCENTAGE("Autofill.PayloadCompressionRatio.Query", - compression_ratio); - break; - case AutofillDownloadManager::REQUEST_UPLOAD: - UMA_HISTOGRAM_PERCENTAGE("Autofill.PayloadCompressionRatio.Upload", - compression_ratio); - break; - } -} - AutofillMetrics::FormEventLogger::FormEventLogger(bool is_for_credit_card) : is_for_credit_card_(is_for_credit_card), is_server_data_available_(false),
diff --git a/components/autofill/core/browser/autofill_metrics.h b/components/autofill/core/browser/autofill_metrics.h index c94f730..08a8bf9 100644 --- a/components/autofill/core/browser/autofill_metrics.h +++ b/components/autofill/core/browser/autofill_metrics.h
@@ -10,7 +10,6 @@ #include "base/macros.h" #include "components/autofill/core/browser/autofill_client.h" -#include "components/autofill/core/browser/autofill_download_manager.h" #include "components/autofill/core/browser/autofill_profile.h" #include "components/autofill/core/browser/credit_card.h" #include "components/autofill/core/browser/field_types.h" @@ -651,12 +650,6 @@ // state of the form. static void LogAutofillFormSubmittedState(AutofillFormSubmittedState state); - // Log the compression ratio obtained by compressing with gzip. Logs for the - // query or upload request, depending on |type|. - static void LogPayloadCompressionRatio( - int compression_ratio, - AutofillDownloadManager::RequestType type); - // Utility to autofill form events in the relevant histograms depending on // the presence of server and/or local data. class FormEventLogger {
diff --git a/components/content_settings/core/browser/content_settings_default_provider.cc b/components/content_settings/core/browser/content_settings_default_provider.cc index 8bae69f..9cd6eba 100644 --- a/components/content_settings/core/browser/content_settings_default_provider.cc +++ b/components/content_settings/core/browser/content_settings_default_provider.cc
@@ -208,14 +208,15 @@ return false; } - // The default settings may not be directly modified for OTR sessions. - // Instead, they are synced to the main profile's setting. - if (is_incognito_) - return false; - // Put |in_value| in a scoped pointer to ensure that it gets cleaned up // properly if we don't pass on the ownership. scoped_ptr<base::Value> value(in_value); + + // The default settings may not be directly modified for OTR sessions. + // Instead, they are synced to the main profile's setting. + if (is_incognito_) + return true; + { base::AutoReset<bool> auto_reset(&updating_preferences_, true); // Lock the memory map access, so that values are not read by
diff --git a/components/content_settings/core/browser/content_settings_pref.cc b/components/content_settings/core/browser/content_settings_pref.cc index 762cb621..6145152 100644 --- a/components/content_settings/core/browser/content_settings_pref.cc +++ b/components/content_settings/core/browser/content_settings_pref.cc
@@ -143,27 +143,32 @@ return true; } +void ContentSettingsPref::ClearPref() { + DCHECK(thread_checker_.CalledOnValidThread()); + DCHECK(prefs_); + + { + base::AutoLock auto_lock(lock_); + value_map_.clear(); + } + + { + base::AutoReset<bool> auto_reset(&updating_preferences_, true); + DictionaryPrefUpdate update(prefs_, pref_name_); + base::DictionaryValue* pattern_pairs_settings = update.Get(); + pattern_pairs_settings->Clear(); + } +} + void ContentSettingsPref::ClearAllContentSettingsRules() { DCHECK(thread_checker_.CalledOnValidThread()); DCHECK(prefs_); - OriginIdentifierValueMap* map_to_modify = &incognito_value_map_; - if (!is_incognito_) - map_to_modify = &value_map_; - - { + if (is_incognito_) { base::AutoLock auto_lock(lock_); - map_to_modify->clear(); - } - - if (!is_incognito_) { - // Clear the preference. - { - base::AutoReset<bool> auto_reset(&updating_preferences_, true); - DictionaryPrefUpdate update(prefs_, pref_name_); - base::DictionaryValue* pattern_pairs_settings = update.Get(); - pattern_pairs_settings->Clear(); - } + incognito_value_map_.clear(); + } else { + ClearPref(); } notify_callback_.Run(ContentSettingsPattern(),
diff --git a/components/content_settings/core/browser/content_settings_pref.h b/components/content_settings/core/browser/content_settings_pref.h index 3bae849..a49929d 100644 --- a/components/content_settings/core/browser/content_settings_pref.h +++ b/components/content_settings/core/browser/content_settings_pref.h
@@ -60,6 +60,8 @@ const ResourceIdentifier& resource_identifier, base::Value* value); + void ClearPref(); + void ClearAllContentSettingsRules(); void UpdateLastUsage(const ContentSettingsPattern& primary_pattern,
diff --git a/components/content_settings/core/browser/content_settings_pref_provider.cc b/components/content_settings/core/browser/content_settings_pref_provider.cc index 681b50f0..a29dfbd 100644 --- a/components/content_settings/core/browser/content_settings_pref_provider.cc +++ b/components/content_settings/core/browser/content_settings_pref_provider.cc
@@ -164,6 +164,14 @@ prefs_ = NULL; } +void PrefProvider::ClearPrefs() { + DCHECK(CalledOnValidThread()); + DCHECK(prefs_); + + for (const auto& pref : content_settings_prefs_) + pref.second->ClearPref(); +} + void PrefProvider::UpdateLastUsage( const ContentSettingsPattern& primary_pattern, const ContentSettingsPattern& secondary_pattern,
diff --git a/components/content_settings/core/browser/content_settings_pref_provider.h b/components/content_settings/core/browser/content_settings_pref_provider.h index d2549643..395632d 100644 --- a/components/content_settings/core/browser/content_settings_pref_provider.h +++ b/components/content_settings/core/browser/content_settings_pref_provider.h
@@ -56,6 +56,8 @@ void ShutdownOnUIThread() override; + void ClearPrefs(); + // Records the last time the given pattern has used a certain content setting. void UpdateLastUsage(const ContentSettingsPattern& primary_pattern, const ContentSettingsPattern& secondary_pattern,
diff --git a/components/content_settings/core/browser/cookie_settings_unittest.cc b/components/content_settings/core/browser/cookie_settings_unittest.cc index 618f98b..55fa2328 100644 --- a/components/content_settings/core/browser/cookie_settings_unittest.cc +++ b/components/content_settings/core/browser/cookie_settings_unittest.cc
@@ -29,7 +29,8 @@ kAllHttpsSitesPattern(ContentSettingsPattern::FromString("https://*")) { CookieSettings::RegisterProfilePrefs(prefs_.registry()); HostContentSettingsMap::RegisterProfilePrefs(prefs_.registry()); - settings_map_ = new HostContentSettingsMap(&prefs_, false); + settings_map_ = new HostContentSettingsMap( + &prefs_, false /* incognito_profile */, false /* guest_profile */); cookie_settings_ = new CookieSettings(settings_map_.get(), &prefs_, "chrome-extension"); }
diff --git a/components/content_settings/core/browser/host_content_settings_map.cc b/components/content_settings/core/browser/host_content_settings_map.cc index 3510045..4d0aadd 100644 --- a/components/content_settings/core/browser/host_content_settings_map.cc +++ b/components/content_settings/core/browser/host_content_settings_map.cc
@@ -94,22 +94,29 @@ } // namespace HostContentSettingsMap::HostContentSettingsMap(PrefService* prefs, - bool incognito) + bool is_incognito_profile, + bool is_guest_profile) : #ifndef NDEBUG used_from_thread_id_(base::PlatformThread::CurrentId()), #endif prefs_(prefs), - is_off_the_record_(incognito) { + is_off_the_record_(is_incognito_profile || is_guest_profile) { + DCHECK(!(is_incognito_profile && is_guest_profile)); content_settings::ObservableProvider* policy_provider = new content_settings::PolicyProvider(prefs_); policy_provider->AddObserver(this); content_settings_providers_[POLICY_PROVIDER] = policy_provider; - content_settings::ObservableProvider* pref_provider = + content_settings::PrefProvider* pref_provider = new content_settings::PrefProvider(prefs_, is_off_the_record_); pref_provider->AddObserver(this); content_settings_providers_[PREF_PROVIDER] = pref_provider; + // This ensures that content settings are cleared for the guest profile. This + // wouldn't be needed except that we used to allow settings to be stored for + // the guest profile and so we need to ensure those get cleared. + if (is_guest_profile) + pref_provider->ClearPrefs(); content_settings::ObservableProvider* default_provider = new content_settings::DefaultProvider(prefs_, is_off_the_record_); @@ -307,11 +314,12 @@ resource_identifier.empty()); UsedContentSettingsProviders(); - base::Value* val = value.release(); for (auto& provider_pair : content_settings_providers_) { - if (provider_pair.second->SetWebsiteSetting(primary_pattern, - secondary_pattern, content_type, - resource_identifier, val)) { + if (provider_pair.second->SetWebsiteSetting( + primary_pattern, secondary_pattern, content_type, + resource_identifier, value.get())) { + // If succesful then ownership is passed to the provider. + ignore_result(value.release()); return; } }
diff --git a/components/content_settings/core/browser/host_content_settings_map.h b/components/content_settings/core/browser/host_content_settings_map.h index 0c12c48..b31228e 100644 --- a/components/content_settings/core/browser/host_content_settings_map.h +++ b/components/content_settings/core/browser/host_content_settings_map.h
@@ -62,8 +62,11 @@ }; // This should be called on the UI thread, otherwise |thread_checker_| handles - // CalledOnValidThread() wrongly. - HostContentSettingsMap(PrefService* prefs, bool incognito); + // CalledOnValidThread() wrongly. Only one (or neither) of + // |is_incognito_profile| and |is_guest_profile| should be true. + HostContentSettingsMap(PrefService* prefs, + bool is_incognito_profile, + bool is_guest_profile); static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry);
diff --git a/components/guest_view/OWNERS b/components/guest_view/OWNERS index 434ce080..3faf0b9 100644 --- a/components/guest_view/OWNERS +++ b/components/guest_view/OWNERS
@@ -3,3 +3,4 @@ lazyboy@chromium.org lfg@chromium.org wjmaclean@chromium.org +paulmeyer@chromium.org
diff --git a/components/mus/mus_app.cc b/components/mus/mus_app.cc index c2dc704e..fe4055e 100644 --- a/components/mus/mus_app.cc +++ b/components/mus/mus_app.cc
@@ -41,7 +41,7 @@ struct MandolineUIServicesApp::PendingRequest { scoped_ptr<mojo::InterfaceRequest<mojom::DisplayManager>> dm_request; - scoped_ptr<mojo::InterfaceRequest<mojom::WindowManager>> wm_request; + scoped_ptr<mojo::InterfaceRequest<mojom::WindowManagerDeprecated>> wm_request; }; MandolineUIServicesApp::MandolineUIServicesApp() @@ -93,7 +93,7 @@ ApplicationConnection* connection) { connection->AddService<Gpu>(this); connection->AddService<mojom::DisplayManager>(this); - connection->AddService<mojom::WindowManager>(this); + connection->AddService<mojom::WindowManagerDeprecated>(this); connection->AddService<WindowTreeHostFactory>(this); return true; } @@ -142,11 +142,12 @@ void MandolineUIServicesApp::Create( mojo::ApplicationConnection* connection, - mojo::InterfaceRequest<mojom::WindowManager> request) { + mojo::InterfaceRequest<mojom::WindowManagerDeprecated> request) { if (!connection_manager_->has_tree_host_connections()) { scoped_ptr<PendingRequest> pending_request(new PendingRequest); pending_request->wm_request.reset( - new mojo::InterfaceRequest<mojom::WindowManager>(std::move(request))); + new mojo::InterfaceRequest<mojom::WindowManagerDeprecated>( + std::move(request))); pending_requests_.push_back(std::move(pending_request)); return; } @@ -174,7 +175,7 @@ mojo::InterfaceRequest<mojom::WindowTreeHost> host, mojom::WindowTreeHostClientPtr host_client, mojom::WindowTreeClientPtr tree_client, - mojom::WindowManagerPtr window_manager) { + mojom::WindowManagerDeprecatedPtr window_manager) { DCHECK(connection_manager_); // TODO(fsamuel): We need to make sure that only the window manager can create
diff --git a/components/mus/mus_app.h b/components/mus/mus_app.h index 08d893ab..29e0822 100644 --- a/components/mus/mus_app.h +++ b/components/mus/mus_app.h
@@ -45,7 +45,7 @@ : public mojo::ApplicationDelegate, public ws::ConnectionManagerDelegate, public mojo::InterfaceFactory<mojom::DisplayManager>, - public mojo::InterfaceFactory<mojom::WindowManager>, + public mojo::InterfaceFactory<mojom::WindowManagerDeprecated>, public mojo::InterfaceFactory<mojom::WindowTreeHostFactory>, public mojo::InterfaceFactory<mojom::Gpu>, public mojom::WindowTreeHostFactory { @@ -77,9 +77,10 @@ void Create(mojo::ApplicationConnection* connection, mojo::InterfaceRequest<mojom::DisplayManager> request) override; - // mojo::InterfaceFactory<mojom::WindowManager> implementation. - void Create(mojo::ApplicationConnection* connection, - mojo::InterfaceRequest<mojom::WindowManager> request) override; + // mojo::InterfaceFactory<mojom::WindowManagerDeprecated> implementation. + void Create( + mojo::ApplicationConnection* connection, + mojo::InterfaceRequest<mojom::WindowManagerDeprecated> request) override; // mojo::InterfaceFactory<mojom::WindowTreeHostFactory>: void Create( @@ -91,14 +92,15 @@ mojo::InterfaceRequest<mojom::Gpu> request) override; // mojom::WindowTreeHostFactory implementation. - void CreateWindowTreeHost(mojo::InterfaceRequest<mojom::WindowTreeHost> host, - mojom::WindowTreeHostClientPtr host_client, - mojom::WindowTreeClientPtr tree_client, - mojom::WindowManagerPtr window_manager) override; + void CreateWindowTreeHost( + mojo::InterfaceRequest<mojom::WindowTreeHost> host, + mojom::WindowTreeHostClientPtr host_client, + mojom::WindowTreeClientPtr tree_client, + mojom::WindowManagerDeprecatedPtr window_manager) override; mojo::WeakBindingSet<mojom::WindowTreeHostFactory> factory_bindings_; scoped_ptr<ws::ForwardingWindowManager> window_manager_impl_; - mojo::WeakBindingSet<mojom::WindowManager> window_manager_bindings_; + mojo::WeakBindingSet<mojom::WindowManagerDeprecated> window_manager_bindings_; mojo::ApplicationImpl* app_impl_; scoped_ptr<ws::ConnectionManager> connection_manager_; scoped_refptr<GpuState> gpu_state_;
diff --git a/components/mus/public/cpp/lib/window_tree_client_impl.cc b/components/mus/public/cpp/lib/window_tree_client_impl.cc index c20441c..3ba759b2 100644 --- a/components/mus/public/cpp/lib/window_tree_client_impl.cc +++ b/components/mus/public/cpp/lib/window_tree_client_impl.cc
@@ -502,8 +502,8 @@ tree_ptr_.set_connection_error_handler([this]() { delete this; }); if (window_manager_delegate_) { - tree_ptr_->GetWindowManagerInternalClient(GetProxy( - &window_manager_internal_client_, tree_ptr_.associated_group())); + tree_ptr_->GetWindowManagerClient(GetProxy(&window_manager_internal_client_, + tree_ptr_.associated_group())); } OnEmbedImpl(tree_ptr_.get(), connection_id, std::move(root_data), @@ -795,11 +795,11 @@ } } -void WindowTreeClientImpl::GetWindowManagerInternal( - mojo::AssociatedInterfaceRequest<WindowManagerInternal> internal) { +void WindowTreeClientImpl::GetWindowManager( + mojo::AssociatedInterfaceRequest<WindowManager> internal) { window_manager_internal_.reset( - new mojo::AssociatedBinding<mojom::WindowManagerInternal>( - this, std::move(internal))); + new mojo::AssociatedBinding<mojom::WindowManager>(this, + std::move(internal))); } void WindowTreeClientImpl::RequestClose(uint32_t window_id) {
diff --git a/components/mus/public/cpp/lib/window_tree_client_impl.h b/components/mus/public/cpp/lib/window_tree_client_impl.h index aba822679..4d86fef 100644 --- a/components/mus/public/cpp/lib/window_tree_client_impl.h +++ b/components/mus/public/cpp/lib/window_tree_client_impl.h
@@ -36,7 +36,7 @@ // Manages the connection with the Window Server service. class WindowTreeClientImpl : public WindowTreeConnection, public mojom::WindowTreeClient, - public mojom::WindowManagerInternal, + public mojom::WindowManager, public WindowManagerClient { public: WindowTreeClientImpl(WindowTreeDelegate* delegate, @@ -210,11 +210,10 @@ mojom::Cursor cursor) override; void OnChangeCompleted(uint32_t change_id, bool success) override; void RequestClose(uint32_t window_id) override; - void GetWindowManagerInternal( - mojo::AssociatedInterfaceRequest<WindowManagerInternal> internal) - override; + void GetWindowManager( + mojo::AssociatedInterfaceRequest<WindowManager> internal) override; - // Overridden from WindowManagerInternal: + // Overridden from WindowManager: void WmSetBounds(uint32_t change_id, Id window_id, mojo::RectPtr transit_bounds) override; @@ -265,10 +264,9 @@ base::ObserverList<WindowTreeConnectionObserver> observers_; - scoped_ptr<mojo::AssociatedBinding<mojom::WindowManagerInternal>> + scoped_ptr<mojo::AssociatedBinding<mojom::WindowManager>> window_manager_internal_; - mojom::WindowManagerInternalClientAssociatedPtr - window_manager_internal_client_; + mojom::WindowManagerClientAssociatedPtr window_manager_internal_client_; MOJO_DISALLOW_COPY_AND_ASSIGN(WindowTreeClientImpl); };
diff --git a/components/mus/public/cpp/lib/window_tree_host_factory.cc b/components/mus/public/cpp/lib/window_tree_host_factory.cc index 2e1c0de..32b35ae 100644 --- a/components/mus/public/cpp/lib/window_tree_host_factory.cc +++ b/components/mus/public/cpp/lib/window_tree_host_factory.cc
@@ -14,7 +14,7 @@ mojom::WindowTreeHostClientPtr host_client, WindowTreeDelegate* delegate, mojom::WindowTreeHostPtr* host, - mojom::WindowManagerPtr window_manager, + mojom::WindowManagerDeprecatedPtr window_manager, WindowManagerDelegate* window_manager_delegate) { mojom::WindowTreeClientPtr tree_client; WindowTreeConnection::CreateForWindowManager( @@ -31,7 +31,7 @@ mojom::WindowTreeHostClientPtr host_client, WindowTreeDelegate* delegate, mojom::WindowTreeHostPtr* host, - mojom::WindowManagerPtr window_manager, + mojom::WindowManagerDeprecatedPtr window_manager, WindowManagerDelegate* window_manager_delegate) { mojom::WindowTreeHostFactoryPtr factory; app->ConnectToService("mojo:mus", &factory);
diff --git a/components/mus/public/cpp/tests/test_window_tree.cc b/components/mus/public/cpp/tests/test_window_tree.cc index 0ecd6f24..af526cd 100644 --- a/components/mus/public/cpp/tests/test_window_tree.cc +++ b/components/mus/public/cpp/tests/test_window_tree.cc
@@ -127,8 +127,7 @@ acked_events_.insert(event_id); } -void TestWindowTree::GetWindowManagerInternalClient( - mojo::AssociatedInterfaceRequest<mojom::WindowManagerInternalClient> - internal) {} +void TestWindowTree::GetWindowManagerClient( + mojo::AssociatedInterfaceRequest<mojom::WindowManagerClient> internal) {} } // namespace mus
diff --git a/components/mus/public/cpp/tests/test_window_tree.h b/components/mus/public/cpp/tests/test_window_tree.h index 3115b27..3ee1b0c 100644 --- a/components/mus/public/cpp/tests/test_window_tree.h +++ b/components/mus/public/cpp/tests/test_window_tree.h
@@ -86,9 +86,9 @@ bool visible, mojo::TextInputStatePtr state) override; void OnWindowInputEventAck(uint32_t event_id) override; - void GetWindowManagerInternalClient( - mojo::AssociatedInterfaceRequest<mojom::WindowManagerInternalClient> - internal) override; + void GetWindowManagerClient( + mojo::AssociatedInterfaceRequest<mojom::WindowManagerClient> internal) + override; bool got_change_; uint32_t change_id_;
diff --git a/components/mus/public/cpp/window_tree_host_factory.h b/components/mus/public/cpp/window_tree_host_factory.h index 6211e22..fd8c4c1d 100644 --- a/components/mus/public/cpp/window_tree_host_factory.h +++ b/components/mus/public/cpp/window_tree_host_factory.h
@@ -26,17 +26,18 @@ mojom::WindowTreeHostClientPtr host_client, WindowTreeDelegate* delegate, mojom::WindowTreeHostPtr* host, - mojom::WindowManagerPtr window_manager, + mojom::WindowManagerDeprecatedPtr window_manager, WindowManagerDelegate* window_manager_delegate); // Creates a single host with no client by connecting to the window manager // application. Useful only for tests and trivial UIs. -void CreateSingleWindowTreeHost(mojo::ApplicationImpl* app, - mojom::WindowTreeHostClientPtr host_client, - WindowTreeDelegate* delegate, - mojom::WindowTreeHostPtr* host, - mojom::WindowManagerPtr window_manager, - WindowManagerDelegate* window_manager_delegate); +void CreateSingleWindowTreeHost( + mojo::ApplicationImpl* app, + mojom::WindowTreeHostClientPtr host_client, + WindowTreeDelegate* delegate, + mojom::WindowTreeHostPtr* host, + mojom::WindowManagerDeprecatedPtr window_manager, + WindowManagerDelegate* window_manager_delegate); } // namespace mus
diff --git a/components/mus/public/interfaces/window_manager.mojom b/components/mus/public/interfaces/window_manager.mojom index 3c01269..d1dd40fc 100644 --- a/components/mus/public/interfaces/window_manager.mojom +++ b/components/mus/public/interfaces/window_manager.mojom
@@ -10,22 +10,6 @@ // Represents a core interface that should be implemented by any window manager // built on top of Mus. -interface WindowManager { - // The window's preferred size as defined by its content. Type: gfx::Size. - const string kPreferredSize_Property = "prop:preferred-size"; - // The window's resize behavior. Type: ResizeBehavior. - const string kResizeBehavior_Property = "prop:resize-behavior"; - // Bounds the window is restored to. Type: gfx::Rect. - const string kRestoreBounds_Property = "prop:restore-bounds"; - // Shadow style for the window. Type: mojom::ShadowStyle. - const string kShadowStyle_Property = "prop:shadow-style"; - // The window's show state. Type: ShowState. - const string kShowState_Property = "prop:show-state"; - // The window bounds as set by user input. Type: gfx::Rect. - const string kUserSetBounds_Property = "prop:user-set-bounds"; - const string kWindowType_Property = "prop:window-type"; - // The window's title. Type: mojom::String - const string kWindowTitle_Property = "prop:window-title"; - +interface WindowManagerDeprecated { OpenWindow(WindowTreeClient client, map<string, array<uint8>> properties); };
diff --git a/components/mus/public/interfaces/window_tree.mojom b/components/mus/public/interfaces/window_tree.mojom index 1abc036..1dd204e 100644 --- a/components/mus/public/interfaces/window_tree.mojom +++ b/components/mus/public/interfaces/window_tree.mojom
@@ -235,9 +235,8 @@ // See documentation for WindowTreeClient::OnWindowInputEvent(). OnWindowInputEventAck(uint32 event_id); - // See description of WindowManagerInternal for details. - GetWindowManagerInternalClient( - associated WindowManagerInternalClient& internal); + // See description of WindowManager for details. + GetWindowManagerClient(associated WindowManagerClient& internal); }; // Changes to windows are not sent to the connection that originated the @@ -351,26 +350,41 @@ // client allows the change it should delete the window. RequestClose(uint32 window_id); - // See description of WindowManagerInternal for details. - GetWindowManagerInternal(associated WindowManagerInternal& internal); + // See description of WindowManager for details. + GetWindowManager(associated WindowManager& internal); }; -// WindowManagerInternal is used when a WindowTreeClient attempts to modify +// WindowManager is used when a WindowTreeClient attempts to modify // a property of the embed root. When this happens WindowTree calls the -// appropriate function on WindowManagerInternal. For example, if a +// appropriate function on WindowManager. For example, if a // WindowTreeClient calls SetWindowBounds() on its embed root, WindowTree -// calls WmSetBounds(). WindowManagerInternal can then decide if it wants to +// calls WmSetBounds(). WindowManager can then decide if it wants to // change the bounds or not. // -// WindowManagerInternal may only be installed from the connection that created +// WindowManager may only be installed from the connection that created // a new window tree (see WindowTreeHostFactory). // // This interface is only used as an associated interface and is associated // with WindowTreeClient. -// TODO(sky): rename this to WindowManager. -interface WindowManagerInternal { - // When the WindowManagerInternal completes a request it must call back to - // WindowManagerInternalClient::WmResponse(). +interface WindowManager { + // The window's preferred size as defined by its content. Type: gfx::Size. + const string kPreferredSize_Property = "prop:preferred-size"; + // The window's resize behavior. Type: ResizeBehavior. + const string kResizeBehavior_Property = "prop:resize-behavior"; + // Bounds the window is restored to. Type: gfx::Rect. + const string kRestoreBounds_Property = "prop:restore-bounds"; + // Shadow style for the window. Type: mojom::ShadowStyle. + const string kShadowStyle_Property = "prop:shadow-style"; + // The window's show state. Type: ShowState. + const string kShowState_Property = "prop:show-state"; + // The window bounds as set by user input. Type: gfx::Rect. + const string kUserSetBounds_Property = "prop:user-set-bounds"; + const string kWindowType_Property = "prop:window-type"; + // The window's title. Type: mojom::String + const string kWindowTitle_Property = "prop:window-title"; + + // When the WindowManager completes a request it must call back to + // WindowManagerClient::WmResponse(). WmSetBounds(uint32 change_id, uint32 window_id, mojo.Rect bounds); WmSetProperty(uint32 change_id, uint32 window_id, @@ -383,8 +397,7 @@ // This interface is only used as an associated interface and is associated // with WindowTree. -// TODO(sky): rename this to WindowManagerClient. -interface WindowManagerInternalClient { +interface WindowManagerClient { // The window manager has completed a request with the specific change id. WmResponse(uint32 change_id, bool response);
diff --git a/components/mus/public/interfaces/window_tree_host.mojom b/components/mus/public/interfaces/window_tree_host.mojom index 32cd0af..0a89e20 100644 --- a/components/mus/public/interfaces/window_tree_host.mojom +++ b/components/mus/public/interfaces/window_tree_host.mojom
@@ -57,5 +57,5 @@ CreateWindowTreeHost(WindowTreeHost& window_tree_host, WindowTreeHostClient? host_client, WindowTreeClient tree_client, - WindowManager? window_manager); + WindowManagerDeprecated? window_manager); };
diff --git a/components/mus/ws/access_policy.h b/components/mus/ws/access_policy.h index f054b3f..ac354798 100644 --- a/components/mus/ws/access_policy.h +++ b/components/mus/ws/access_policy.h
@@ -63,7 +63,7 @@ const ServerWindow* window, const ServerWindow** new_parent, const ServerWindow** old_parent) const = 0; - virtual bool CanSetWindowManagerInternal() const = 0; + virtual bool CanSetWindowManager() const = 0; // Returns the window to supply to the client when focus changes to |focused|. virtual const ServerWindow* GetWindowForFocusChange(
diff --git a/components/mus/ws/client_connection.cc b/components/mus/ws/client_connection.cc index 81206768..d3e3b2af 100644 --- a/components/mus/ws/client_connection.cc +++ b/components/mus/ws/client_connection.cc
@@ -39,9 +39,8 @@ binding_.ResumeIncomingMethodCallProcessing(); } -mojom::WindowManagerInternal* -DefaultClientConnection::GetWindowManagerInternal() { - client_->GetWindowManagerInternal( +mojom::WindowManager* DefaultClientConnection::GetWindowManager() { + client_->GetWindowManager( GetProxy(&window_manager_internal_, client_.associated_group())); return window_manager_internal_.get(); }
diff --git a/components/mus/ws/client_connection.h b/components/mus/ws/client_connection.h index 37f8fc9..4227977 100644 --- a/components/mus/ws/client_connection.h +++ b/components/mus/ws/client_connection.h
@@ -29,7 +29,7 @@ mojom::WindowTreeClient* client() { return client_; } - virtual mojom::WindowManagerInternal* GetWindowManagerInternal() = 0; + virtual mojom::WindowManager* GetWindowManager() = 0; virtual void SetIncomingMethodCallProcessingPaused(bool paused) = 0; @@ -51,14 +51,14 @@ ~DefaultClientConnection() override; // ClientConnection: - mojom::WindowManagerInternal* GetWindowManagerInternal() override; + mojom::WindowManager* GetWindowManager() override; void SetIncomingMethodCallProcessingPaused(bool paused) override; private: ConnectionManager* connection_manager_; mojo::Binding<mojom::WindowTree> binding_; mojom::WindowTreeClientPtr client_; - mojom::WindowManagerInternalAssociatedPtr window_manager_internal_; + mojom::WindowManagerAssociatedPtr window_manager_internal_; DISALLOW_COPY_AND_ASSIGN(DefaultClientConnection); };
diff --git a/components/mus/ws/default_access_policy.cc b/components/mus/ws/default_access_policy.cc index f8efadb..ae4b827 100644 --- a/components/mus/ws/default_access_policy.cc +++ b/components/mus/ws/default_access_policy.cc
@@ -171,7 +171,7 @@ return nullptr; } -bool DefaultAccessPolicy::CanSetWindowManagerInternal() const { +bool DefaultAccessPolicy::CanSetWindowManager() const { return false; }
diff --git a/components/mus/ws/default_access_policy.h b/components/mus/ws/default_access_policy.h index fc11edea..5c2d5f6 100644 --- a/components/mus/ws/default_access_policy.h +++ b/components/mus/ws/default_access_policy.h
@@ -55,7 +55,7 @@ const ServerWindow** old_parent) const override; const ServerWindow* GetWindowForFocusChange( const ServerWindow* focused) override; - bool CanSetWindowManagerInternal() const override; + bool CanSetWindowManager() const override; private: bool WasCreatedByThisConnection(const ServerWindow* window) const;
diff --git a/components/mus/ws/forwarding_window_manager.cc b/components/mus/ws/forwarding_window_manager.cc index c8cde93..7c9737dc 100644 --- a/components/mus/ws/forwarding_window_manager.cc +++ b/components/mus/ws/forwarding_window_manager.cc
@@ -16,7 +16,8 @@ ForwardingWindowManager::~ForwardingWindowManager() {} -mojom::WindowManager* ForwardingWindowManager::GetActiveWindowManager() { +mojom::WindowManagerDeprecated* +ForwardingWindowManager::GetActiveWindowManager() { // TODO(sky): This needs to detect active window, or OpenWindow() needs to // take the display. return connection_manager_->GetActiveWindowTreeHost()->window_manager();
diff --git a/components/mus/ws/forwarding_window_manager.h b/components/mus/ws/forwarding_window_manager.h index 085f9cf1..3f68bf3 100644 --- a/components/mus/ws/forwarding_window_manager.h +++ b/components/mus/ws/forwarding_window_manager.h
@@ -17,14 +17,14 @@ // WindowManager implementation that forwards to the window manager of the // active display. -class ForwardingWindowManager : public mojom::WindowManager { +class ForwardingWindowManager : public mojom::WindowManagerDeprecated { public: explicit ForwardingWindowManager(ConnectionManager* connection_manager); ~ForwardingWindowManager() override; private: // Returns the WindowManager of the active display. - mojom::WindowManager* GetActiveWindowManager(); + mojom::WindowManagerDeprecated* GetActiveWindowManager(); // mojom::WindowManager: void OpenWindow(
diff --git a/components/mus/ws/window_manager_access_policy.cc b/components/mus/ws/window_manager_access_policy.cc index a6293ae..d259ebf 100644 --- a/components/mus/ws/window_manager_access_policy.cc +++ b/components/mus/ws/window_manager_access_policy.cc
@@ -131,7 +131,7 @@ return IsWindowKnown(window) || (*new_parent && IsWindowKnown(*new_parent)); } -bool WindowManagerAccessPolicy::CanSetWindowManagerInternal() const { +bool WindowManagerAccessPolicy::CanSetWindowManager() const { return true; }
diff --git a/components/mus/ws/window_manager_access_policy.h b/components/mus/ws/window_manager_access_policy.h index ba9390c..91a0a63 100644 --- a/components/mus/ws/window_manager_access_policy.h +++ b/components/mus/ws/window_manager_access_policy.h
@@ -54,7 +54,7 @@ const ServerWindow** old_parent) const override; const ServerWindow* GetWindowForFocusChange( const ServerWindow* focused) override; - bool CanSetWindowManagerInternal() const override; + bool CanSetWindowManager() const override; private: bool IsWindowKnown(const ServerWindow* window) const;
diff --git a/components/mus/ws/window_tree_apptest.cc b/components/mus/ws/window_tree_apptest.cc index c28fb33..43202c6b 100644 --- a/components/mus/ws/window_tree_apptest.cc +++ b/components/mus/ws/window_tree_apptest.cc
@@ -369,9 +369,8 @@ } } void RequestClose(uint32_t window_id) override {} - void GetWindowManagerInternal( - mojo::AssociatedInterfaceRequest<mojom::WindowManagerInternal> internal) - override {} + void GetWindowManager(mojo::AssociatedInterfaceRequest<mojom::WindowManager> + internal) override {} TestChangeTracker tracker_;
diff --git a/components/mus/ws/window_tree_host_impl.cc b/components/mus/ws/window_tree_host_impl.cc index 330ad06..7b369b7 100644 --- a/components/mus/ws/window_tree_host_impl.cc +++ b/components/mus/ws/window_tree_host_impl.cc
@@ -91,7 +91,7 @@ mojo::ApplicationImpl* app_impl, const scoped_refptr<GpuState>& gpu_state, const scoped_refptr<SurfacesState>& surfaces_state, - mojom::WindowManagerPtr window_manager) + mojom::WindowManagerDeprecatedPtr window_manager) : id_(next_id++), delegate_(nullptr), connection_manager_(connection_manager),
diff --git a/components/mus/ws/window_tree_host_impl.h b/components/mus/ws/window_tree_host_impl.h index 69e298b..52638da0 100644 --- a/components/mus/ws/window_tree_host_impl.h +++ b/components/mus/ws/window_tree_host_impl.h
@@ -51,7 +51,7 @@ mojo::ApplicationImpl* app_impl, const scoped_refptr<GpuState>& gpu_state, const scoped_refptr<SurfacesState>& surfaces_state, - mojom::WindowManagerPtr window_manater); + mojom::WindowManagerDeprecatedPtr window_manater); ~WindowTreeHostImpl() override; // Initializes state that depends on the existence of a WindowTreeHostImpl. @@ -92,7 +92,9 @@ ConnectionManager* connection_manager() { return connection_manager_; } - mojom::WindowManager* window_manager() { return window_manager_.get(); } + mojom::WindowManagerDeprecated* window_manager() { + return window_manager_.get(); + } // Returns the root ServerWindow of this viewport. ServerWindow* root_window() { return root_.get(); } @@ -220,7 +222,7 @@ scoped_ptr<ServerWindow> root_; scoped_ptr<DisplayManager> display_manager_; scoped_ptr<FocusController> focus_controller_; - mojom::WindowManagerPtr window_manager_; + mojom::WindowManagerDeprecatedPtr window_manager_; mojom::WindowTree* tree_awaiting_input_ack_; // The last cursor set. Used to track whether we need to change the cursor.
diff --git a/components/mus/ws/window_tree_impl.cc b/components/mus/ws/window_tree_impl.cc index 7cfa5e3..3cdb88c 100644 --- a/components/mus/ws/window_tree_impl.cc +++ b/components/mus/ws/window_tree_impl.cc
@@ -1172,18 +1172,16 @@ client_->OnChangeCompleted(change_id, success); } -void WindowTreeImpl::GetWindowManagerInternalClient( - mojo::AssociatedInterfaceRequest<mojom::WindowManagerInternalClient> - internal) { - if (!access_policy_->CanSetWindowManagerInternal() || - window_manager_internal_) +void WindowTreeImpl::GetWindowManagerClient( + mojo::AssociatedInterfaceRequest<mojom::WindowManagerClient> internal) { + if (!access_policy_->CanSetWindowManager() || window_manager_internal_) return; window_manager_internal_client_binding_.reset( - new mojo::AssociatedBinding<mojom::WindowManagerInternalClient>( + new mojo::AssociatedBinding<mojom::WindowManagerClient>( this, std::move(internal))); - window_manager_internal_ = connection_manager_->GetClientConnection(this) - ->GetWindowManagerInternal(); + window_manager_internal_ = + connection_manager_->GetClientConnection(this)->GetWindowManager(); } void WindowTreeImpl::WmResponse(uint32_t change_id, bool response) {
diff --git a/components/mus/ws/window_tree_impl.h b/components/mus/ws/window_tree_impl.h index 2ebc383..f49a2afc 100644 --- a/components/mus/ws/window_tree_impl.h +++ b/components/mus/ws/window_tree_impl.h
@@ -44,7 +44,7 @@ // internal state) as necessary. class WindowTreeImpl : public mojom::WindowTree, public AccessPolicyDelegate, - public mojom::WindowManagerInternalClient { + public mojom::WindowManagerClient { public: WindowTreeImpl(ConnectionManager* connection_manager, ServerWindow* root, @@ -324,11 +324,11 @@ Id transport_window_id, mojo::InsetsPtr insets, mojo::Array<mojo::RectPtr> transport_additional_client_areas) override; - void GetWindowManagerInternalClient( - mojo::AssociatedInterfaceRequest<mojom::WindowManagerInternalClient> - internal) override; + void GetWindowManagerClient( + mojo::AssociatedInterfaceRequest<mojom::WindowManagerClient> internal) + override; - // mojom::WindowManagerInternalClient: + // mojom::WindowManagerClient: void WmResponse(uint32_t change_id, bool response) override; void WmRequestClose(Id transport_window_id) override; void WmSetFrameDecorationValues( @@ -376,9 +376,9 @@ std::queue<scoped_ptr<TargetedEvent>> event_queue_; - scoped_ptr<mojo::AssociatedBinding<mojom::WindowManagerInternalClient>> + scoped_ptr<mojo::AssociatedBinding<mojom::WindowManagerClient>> window_manager_internal_client_binding_; - mojom::WindowManagerInternal* window_manager_internal_; + mojom::WindowManager* window_manager_internal_; scoped_ptr<WaitingForTopLevelWindowInfo> waiting_for_top_level_window_info_;
diff --git a/components/mus/ws/window_tree_unittest.cc b/components/mus/ws/window_tree_unittest.cc index 0bd503f..e6a34b0e 100644 --- a/components/mus/ws/window_tree_unittest.cc +++ b/components/mus/ws/window_tree_unittest.cc
@@ -63,11 +63,10 @@ return client_window_id; } -class TestWindowManagerInternal : public mojom::WindowManagerInternal { +class TestWindowManager : public mojom::WindowManager { public: - TestWindowManagerInternal() - : got_create_top_level_window_(false), change_id_(0u) {} - ~TestWindowManagerInternal() override {} + TestWindowManager() : got_create_top_level_window_(false), change_id_(0u) {} + ~TestWindowManager() override {} bool did_call_create_top_level_window(uint32_t* change_id) { if (!got_create_top_level_window_) @@ -79,7 +78,7 @@ } private: - // WindowManagerInternal: + // WindowManager: void WmSetBounds(uint32_t change_id, uint32_t window_id, mojo::RectPtr bounds) override {} @@ -97,7 +96,7 @@ bool got_create_top_level_window_; uint32_t change_id_; - DISALLOW_COPY_AND_ASSIGN(TestWindowManagerInternal); + DISALLOW_COPY_AND_ASSIGN(TestWindowManager); }; // ----------------------------------------------------------------------------- @@ -201,9 +200,8 @@ tracker_.OnChangeCompleted(change_id, success); } void RequestClose(uint32_t window_id) override {} - void GetWindowManagerInternal( - mojo::AssociatedInterfaceRequest<mojom::WindowManagerInternal> internal) - override {} + void GetWindowManager(mojo::AssociatedInterfaceRequest<mojom::WindowManager> + internal) override {} TestChangeTracker tracker_; @@ -227,7 +225,7 @@ bool is_paused() const { return is_paused_; } // ClientConnection: - mojom::WindowManagerInternal* GetWindowManagerInternal() override { + mojom::WindowManager* GetWindowManager() override { NOTREACHED(); return nullptr; } @@ -442,7 +440,7 @@ } void set_window_manager_internal(WindowTreeImpl* connection, - mojom::WindowManagerInternal* wm_internal) { + mojom::WindowManager* wm_internal) { connection->window_manager_internal_ = wm_internal; } @@ -834,7 +832,7 @@ // Establish connection, call NewTopLevelWindow(), make sure get id, and make // sure client paused. TEST_F(WindowTreeTest, NewTopLevelWindow) { - TestWindowManagerInternal wm_internal; + TestWindowManager wm_internal; set_window_manager_internal(wm_connection(), &wm_internal); TestWindowTreeClient* embed_connection = nullptr; WindowTreeImpl* window_tree_connection = nullptr; @@ -868,7 +866,7 @@ embed_window_id2)); // Ack the change, which should resume the binding. - static_cast<mojom::WindowManagerInternalClient*>(wm_connection()) + static_cast<mojom::WindowManagerClient*>(wm_connection()) ->OnWmCreatedTopLevelWindow(wm_change_id, embed_window_id2.id); EXPECT_FALSE(last_client_connection()->is_paused()); EXPECT_EQ("TopLevelCreated id=17 window_id=" +
diff --git a/components/printing/renderer/DEPS b/components/printing/renderer/DEPS index ada73c40..e0bb7eff 100644 --- a/components/printing/renderer/DEPS +++ b/components/printing/renderer/DEPS
@@ -1,6 +1,6 @@ include_rules = [ "+grit/components_resources.h", "+net/base", - "+skia/ext", + "+third_party/skia", "+ui/base", ]
diff --git a/components/printing/renderer/print_web_view_helper.cc b/components/printing/renderer/print_web_view_helper.cc index dce40c484..6a8f1c32 100644 --- a/components/printing/renderer/print_web_view_helper.cc +++ b/components/printing/renderer/print_web_view_helper.cc
@@ -49,6 +49,7 @@ #include "third_party/WebKit/public/web/WebSettings.h" #include "third_party/WebKit/public/web/WebView.h" #include "third_party/WebKit/public/web/WebViewClient.h" +#include "third_party/skia/include/core/SkCanvas.h" #include "ui/base/resource/resource_bundle.h" using content::WebPreferences; @@ -1772,7 +1773,7 @@ float platform_scale_factor = css_scale_factor; #endif // defined(OS_WIN) - skia::PlatformCanvas* canvas = metafile->GetVectorCanvasForNewPage( + SkCanvas* canvas = metafile->GetVectorCanvasForNewPage( page_size, canvas_area, platform_scale_factor); if (!canvas) return;
diff --git a/components/printing/renderer/print_web_view_helper_mac.mm b/components/printing/renderer/print_web_view_helper_mac.mm index e94f21e..08a1c10 100644 --- a/components/printing/renderer/print_web_view_helper_mac.mm +++ b/components/printing/renderer/print_web_view_helper_mac.mm
@@ -12,9 +12,9 @@ #include "components/printing/common/print_messages.h" #include "printing/metafile_skia_wrapper.h" #include "printing/page_size_margins.h" -#include "skia/ext/platform_canvas.h" #include "third_party/WebKit/public/platform/WebCanvas.h" #include "third_party/WebKit/public/web/WebLocalFrame.h" +#include "third_party/skia/include/core/SkCanvas.h" namespace printing { @@ -138,7 +138,7 @@ params.display_header_footer ? gfx::Rect(*page_size) : content_area; { - skia::PlatformCanvas* canvas = metafile->GetVectorCanvasForNewPage( + SkCanvas* canvas = metafile->GetVectorCanvasForNewPage( *page_size, canvas_area, scale_factor); if (!canvas) return;
diff --git a/components/signin/ios/browser/account_consistency_service_unittest.mm b/components/signin/ios/browser/account_consistency_service_unittest.mm index 3458982..06942dc 100644 --- a/components/signin/ios/browser/account_consistency_service_unittest.mm +++ b/components/signin/ios/browser/account_consistency_service_unittest.mm
@@ -126,7 +126,8 @@ signin_manager_.reset(new FakeSigninManager( signin_client_.get(), nullptr, &account_tracker_service_, nullptr)); account_tracker_service_.Initialize(signin_client_.get()); - settings_map_ = new HostContentSettingsMap(&prefs_, false); + settings_map_ = new HostContentSettingsMap( + &prefs_, false /* incognito_profile */, false /* guest_profile */); cookie_settings_ = new content_settings::CookieSettings(settings_map_.get(), &prefs_, ""); ResetAccountConsistencyService();
diff --git a/components/toolbar.gypi b/components/toolbar.gypi index 4a94c60..a690d696 100644 --- a/components/toolbar.gypi +++ b/components/toolbar.gypi
@@ -22,5 +22,31 @@ 'toolbar/toolbar_model.h', ], }, + { + # GN version: //components/toolbar:test_support + 'target_name': 'toolbar_test_support', + 'type': 'static_library', + 'dependencies': [ + '../base/base.gyp:base', + '../ui/gfx/gfx.gyp:gfx_vector_icons', + 'components_resources.gyp:components_resources', + 'toolbar', + ], + 'include_dirs': [ + '..', + ], + 'sources': [ + 'toolbar/test_toolbar_model.cc', + 'toolbar/test_toolbar_model.h', + ], + 'conditions': [ + ['toolkit_views==1', { + # Needed to get the TOOLKIT_VIEWS define. + 'dependencies': [ + '<(DEPTH)/ui/views/views.gyp:views', + ], + }], + ], + }, ], }
diff --git a/components/toolbar/BUILD.gn b/components/toolbar/BUILD.gn index 098f41de..4e2ac01 100644 --- a/components/toolbar/BUILD.gn +++ b/components/toolbar/BUILD.gn
@@ -2,6 +2,8 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +import("//build/config/ui.gni") + source_set("toolbar") { sources = [ "toolbar_model.cc", @@ -14,3 +16,24 @@ "//url", ] } + +source_set("test_support") { + testonly = true + + sources = [ + "test_toolbar_model.cc", + "test_toolbar_model.h", + ] + + deps = [ + ":toolbar", + "//base", + "//components/resources", + "//ui/gfx", + ] + + if (toolkit_views) { + # Needed to get the TOOLKIT_VIEWS define. + deps += [ "//ui/views" ] + } +}
diff --git a/components/toolbar/DEPS b/components/toolbar/DEPS index 668e2b8..1f108293 100644 --- a/components/toolbar/DEPS +++ b/components/toolbar/DEPS
@@ -1,3 +1,5 @@ include_rules = [ + "+components/grit", "+components/security_state", + "+ui/gfx", ]
diff --git a/chrome/browser/ui/toolbar/test_toolbar_model.cc b/components/toolbar/test_toolbar_model.cc similarity index 93% rename from chrome/browser/ui/toolbar/test_toolbar_model.cc rename to components/toolbar/test_toolbar_model.cc index 556c0fbf..e1f4cf5 100644 --- a/chrome/browser/ui/toolbar/test_toolbar_model.cc +++ b/components/toolbar/test_toolbar_model.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 "chrome/browser/ui/toolbar/test_toolbar_model.h" +#include "components/toolbar/test_toolbar_model.h" -#include "grit/components_scaled_resources.h" +#include "components/grit/components_scaled_resources.h" #include "ui/gfx/vector_icons_public.h" TestToolbarModel::TestToolbarModel()
diff --git a/chrome/browser/ui/toolbar/test_toolbar_model.h b/components/toolbar/test_toolbar_model.h similarity index 92% rename from chrome/browser/ui/toolbar/test_toolbar_model.h rename to components/toolbar/test_toolbar_model.h index 9acc0c3a..0587453 100644 --- a/chrome/browser/ui/toolbar/test_toolbar_model.h +++ b/components/toolbar/test_toolbar_model.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef CHROME_BROWSER_UI_TOOLBAR_TEST_TOOLBAR_MODEL_H_ -#define CHROME_BROWSER_UI_TOOLBAR_TEST_TOOLBAR_MODEL_H_ +#ifndef COMPONENTS_TOOLBAR_TEST_TOOLBAR_MODEL_H_ +#define COMPONENTS_TOOLBAR_TEST_TOOLBAR_MODEL_H_ #include <stddef.h> @@ -65,4 +65,4 @@ DISALLOW_COPY_AND_ASSIGN(TestToolbarModel); }; -#endif // CHROME_BROWSER_UI_TOOLBAR_TEST_TOOLBAR_MODEL_H_ +#endif // COMPONENTS_TOOLBAR_TEST_TOOLBAR_MODEL_H_
diff --git a/content/browser/frame_host/navigation_controller_impl_browsertest.cc b/content/browser/frame_host/navigation_controller_impl_browsertest.cc index 26c9fd8..484e05b9 100644 --- a/content/browser/frame_host/navigation_controller_impl_browsertest.cc +++ b/content/browser/frame_host/navigation_controller_impl_browsertest.cc
@@ -2605,8 +2605,18 @@ "bar.com", "/navigation_controller/simple_page_1.html")); NavigateFrameToURL(foo_subframe, bar_url); EXPECT_TRUE(WaitForLoadStop(shell()->web_contents())); - EXPECT_NE(main_site_instance, - foo_subframe->current_frame_host()->GetSiteInstance()); + + // When run just with subframe navigation entries enabled and not in + // site-per-process-mode the subframe should be in the same SiteInstance as + // its parent. + if (!SiteIsolationPolicy::AreCrossProcessFramesPossible()) { + EXPECT_EQ(main_site_instance, + foo_subframe->current_frame_host()->GetSiteInstance()); + } else { + EXPECT_NE(main_site_instance, + foo_subframe->current_frame_host()->GetSiteInstance()); + } + foo_subframe_entry = controller.GetLastCommittedEntry()->GetFrameEntry(foo_subframe); EXPECT_EQ(named_subframe_name, foo_subframe_entry->frame_unique_name());
diff --git a/content/browser/loader/async_resource_handler.cc b/content/browser/loader/async_resource_handler.cc index 53b26e1..e6b1ddf 100644 --- a/content/browser/loader/async_resource_handler.cc +++ b/content/browser/loader/async_resource_handler.cc
@@ -331,10 +331,7 @@ } int data_offset = buffer_->GetLastAllocationOffset(); - - int64_t current_transfer_size = request()->GetTotalReceivedBytes(); - int encoded_data_length = current_transfer_size - reported_transfer_size_; - reported_transfer_size_ = current_transfer_size; + int encoded_data_length = CalculateEncodedDataLengthToReport(); // TODO(erikchen): Temporary debugging. http://crbug.com/527588. CHECK_LE(data_offset, kBufferSize); @@ -355,9 +352,7 @@ } void AsyncResourceHandler::OnDataDownloaded(int bytes_downloaded) { - int64_t current_transfer_size = request()->GetTotalReceivedBytes(); - int encoded_data_length = current_transfer_size - reported_transfer_size_; - reported_transfer_size_ = current_transfer_size; + int encoded_data_length = CalculateEncodedDataLengthToReport(); ResourceMessageFilter* filter = GetFilter(); if (filter) { @@ -455,4 +450,11 @@ return false; } +int AsyncResourceHandler::CalculateEncodedDataLengthToReport() { + int64_t current_transfer_size = request()->GetTotalReceivedBytes(); + int encoded_data_length = current_transfer_size - reported_transfer_size_; + reported_transfer_size_ = current_transfer_size; + return encoded_data_length; +} + } // namespace content
diff --git a/content/browser/loader/async_resource_handler.h b/content/browser/loader/async_resource_handler.h index efc597f..ca06ed3 100644 --- a/content/browser/loader/async_resource_handler.h +++ b/content/browser/loader/async_resource_handler.h
@@ -66,6 +66,7 @@ void ResumeIfDeferred(); void OnDefer(); bool CheckForSufficientResource(); + int CalculateEncodedDataLengthToReport(); scoped_refptr<ResourceBuffer> buffer_; ResourceDispatcherHostImpl* rdh_;
diff --git a/content/browser/presentation/presentation_service_impl_unittest.cc b/content/browser/presentation/presentation_service_impl_unittest.cc index 80e7952..83bae54 100644 --- a/content/browser/presentation/presentation_service_impl_unittest.cc +++ b/content/browser/presentation/presentation_service_impl_unittest.cc
@@ -801,7 +801,13 @@ SaveQuitClosureAndRunLoop(); } -TEST_F(PresentationServiceImplTest, ScreenAvailabilityNotSupported) { +#if defined(OS_ANDROID) +#define MAYBE_ScreenAvailabilityNotSupported DISABLED_ScreenAvailabilityNotSupported +#else +#define MAYBE_ScreenAvailabilityNotSupported ScreenAvailabilityNotSupported +#endif +// Flaky on some android bots, see crbug.com/581878. +TEST_F(PresentationServiceImplTest, MAYBE_ScreenAvailabilityNotSupported) { mock_delegate_.set_screen_availability_listening_supported(false); EXPECT_CALL(mock_client_, OnScreenAvailabilityNotSupported(Eq(kPresentationUrl)));
diff --git a/content/browser/service_worker/service_worker_internals_ui.cc b/content/browser/service_worker/service_worker_internals_ui.cc index c59d41f..c443f2e 100644 --- a/content/browser/service_worker/service_worker_internals_ui.cc +++ b/content/browser/service_worker/service_worker_internals_ui.cc
@@ -22,10 +22,12 @@ #include "content/grit/content_resources.h" #include "content/public/browser/browser_context.h" #include "content/public/browser/browser_thread.h" +#include "content/public/browser/render_process_host.h" #include "content/public/browser/storage_partition.h" #include "content/public/browser/web_contents.h" #include "content/public/browser/web_ui.h" #include "content/public/browser/web_ui_data_source.h" +#include "content/public/common/child_process_host.h" #include "content/public/common/url_constants.h" using base::DictionaryValue; @@ -89,6 +91,20 @@ (*version.get().*method)(callback); } +base::ProcessId GetRealProcessId(int process_host_id) { + if (process_host_id == ChildProcessHost::kInvalidUniqueID) + return base::kNullProcessId; + + RenderProcessHost* rph = RenderProcessHost::FromID(process_host_id); + if (!rph) + return base::kNullProcessId; + + base::ProcessHandle handle = rph->GetHandle(); + if (handle == base::kNullProcessHandle) + return base::kNullProcessId; + return base::Process(handle).Pid(); +} + void UpdateVersionInfo(const ServiceWorkerVersionInfo& version, DictionaryValue* info) { switch (version.running_status) { @@ -128,7 +144,8 @@ } info->SetString("script_url", version.script_url.spec()); info->SetString("version_id", base::Int64ToString(version.version_id)); - info->SetInteger("process_id", version.process_id); + info->SetInteger("process_id", + static_cast<int>(GetRealProcessId(version.process_id))); info->SetInteger("thread_id", version.thread_id); info->SetInteger("devtools_agent_route_id", version.devtools_agent_route_id); }
diff --git a/content/browser/site_per_process_browsertest.cc b/content/browser/site_per_process_browsertest.cc index f7a373bf..99327e8 100644 --- a/content/browser/site_per_process_browsertest.cc +++ b/content/browser/site_per_process_browsertest.cc
@@ -1321,6 +1321,50 @@ DepictFrameTree(root)); } +// Ensure that the renderer process doesn't crash when the main frame navigates +// a remote child to a page that results in a network error. +// See https://crbug.com/558016. +IN_PROC_BROWSER_TEST_F(SitePerProcessBrowserTest, NavigateRemoteAfterError) { + GURL main_url(embedded_test_server()->GetURL( + "a.com", "/cross_site_iframe_factory.html?a(a)")); + NavigateToURL(shell(), main_url); + + // It is safe to obtain the root frame tree node here, as it doesn't change. + FrameTreeNode* root = static_cast<WebContentsImpl*>(shell()->web_contents()) + ->GetFrameTree() + ->root(); + + TestNavigationObserver observer(shell()->web_contents()); + + // Load same-site page into iframe. + FrameTreeNode* child = root->child_at(0); + GURL http_url(embedded_test_server()->GetURL("a.com", "/title1.html")); + NavigateFrameToURL(child, http_url); + EXPECT_EQ(http_url, observer.last_navigation_url()); + EXPECT_TRUE(observer.last_navigation_succeeded()); + + // Load cross-site page into iframe. + GURL url = embedded_test_server()->GetURL("foo.com", "/title2.html"); + NavigateFrameToURL(root->child_at(0), url); + EXPECT_TRUE(observer.last_navigation_succeeded()); + EXPECT_EQ(url, observer.last_navigation_url()); + + // Ensure that we have created a new process for the subframe. + EXPECT_EQ( + " Site A ------------ proxies for B\n" + " +--Site B ------- proxies for A\n" + "Where A = http://a.com/\n" + " B = http://foo.com/", + DepictFrameTree(root)); + SiteInstance* site_instance = child->current_frame_host()->GetSiteInstance(); + EXPECT_NE(shell()->web_contents()->GetSiteInstance(), site_instance); + + // Stop the test server and try to navigate the remote frame. + url = embedded_test_server()->GetURL("bar.com", "/title3.html"); + EXPECT_TRUE(embedded_test_server()->ShutdownAndWaitUntilComplete()); + NavigateIframeToURL(shell()->web_contents(), "child-0", url); +} + // Verify that killing a cross-site frame's process B and then navigating a // frame to B correctly recreates all proxies in B. //
diff --git a/content/child/threaded_data_provider.cc b/content/child/threaded_data_provider.cc index 91d385b8..2f82a2d1 100644 --- a/content/child/threaded_data_provider.cc +++ b/content/child/threaded_data_provider.cc
@@ -112,6 +112,7 @@ int data_offset, int data_length, int encoded_data_length) { + TRACE_EVENT0("loader", "DataProviderMessageFilter::OnReceivedData"); DCHECK(io_task_runner_->BelongsToCurrentThread()); background_thread_.TaskRunner()->PostTask( FROM_HERE, @@ -303,6 +304,8 @@ void ThreadedDataProvider::OnReceivedDataOnForegroundThread( const char* data, int data_length, int encoded_data_length) { DCHECK(ChildThreadImpl::current()); + TRACE_EVENT0("loader", + "ThreadedDataProvider::OnReceivedDataOnForegroundThread"); background_thread_.TaskRunner()->PostTask( FROM_HERE, base::Bind(&ThreadedDataProvider::ForwardAndACKData,
diff --git a/content/common/gpu/media/dxva_video_decode_accelerator_win.cc b/content/common/gpu/media/dxva_video_decode_accelerator_win.cc index 40a3239..d356852d 100644 --- a/content/common/gpu/media/dxva_video_decode_accelerator_win.cc +++ b/content/common/gpu/media/dxva_video_decode_accelerator_win.cc
@@ -166,6 +166,9 @@ // the decoded samples. These buffers are then reused when the client tells // us that it is done with the buffer. kNumPictureBuffers = 5, + // The keyed mutex should always be released before the other thread + // attempts to acquire it, so AcquireSync should always return immediately. + kAcquireSyncWaitMs = 0, }; static IMFSample* CreateEmptySample() { @@ -349,7 +352,10 @@ EGLConfig egl_config); ~DXVAPictureBuffer(); - void ReusePictureBuffer(); + bool InitializeTexture(const DXVAVideoDecodeAccelerator& decoder, + bool use_rgb); + + bool ReusePictureBuffer(); // Copies the output sample data to the picture buffer provided by the // client. // The dest_surface parameter contains the decoded bits. @@ -377,7 +383,7 @@ // Called when the source surface |src_surface| is copied to the destination // |dest_surface| - void CopySurfaceComplete(IDirect3DSurface9* src_surface, + bool CopySurfaceComplete(IDirect3DSurface9* src_surface, IDirect3DSurface9* dest_surface); private: @@ -386,9 +392,17 @@ bool available_; media::PictureBuffer picture_buffer_; EGLSurface decoding_surface_; + + HANDLE texture_share_handle_; base::win::ScopedComPtr<IDirect3DTexture9> decoding_texture_; base::win::ScopedComPtr<ID3D11Texture2D> dx11_decoding_texture_; + base::win::ScopedComPtr<IDXGIKeyedMutex> egl_keyed_mutex_; + base::win::ScopedComPtr<IDXGIKeyedMutex> dx11_keyed_mutex_; + + // This is the last value that was used to release the keyed mutex. + uint64_t keyed_mutex_value_; + // The following |IDirect3DSurface9| interface pointers are used to hold // references on the surfaces during the course of a StretchRect operation // to copy the source surface to the target. The references are released @@ -422,6 +436,9 @@ eglGetConfigAttrib(egl_display, egl_config, EGL_BIND_TO_TEXTURE_RGB, &use_rgb); + if (!picture_buffer->InitializeTexture(decoder, !!use_rgb)) + return linked_ptr<DXVAPictureBuffer>(nullptr); + EGLint attrib_list[] = { EGL_WIDTH, buffer.size().width(), EGL_HEIGHT, buffer.size().height(), @@ -430,59 +447,83 @@ EGL_NONE }; - picture_buffer->decoding_surface_ = eglCreatePbufferSurface( - egl_display, - egl_config, - attrib_list); + picture_buffer->decoding_surface_ = eglCreatePbufferFromClientBuffer( + egl_display, EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE, + picture_buffer->texture_share_handle_, egl_config, attrib_list); RETURN_ON_FAILURE(picture_buffer->decoding_surface_, "Failed to create surface", linked_ptr<DXVAPictureBuffer>(NULL)); - - HANDLE share_handle = NULL; - EGLBoolean ret = eglQuerySurfacePointerANGLE( - egl_display, - picture_buffer->decoding_surface_, - EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE, - &share_handle); - - RETURN_ON_FAILURE(share_handle && ret == EGL_TRUE, - "Failed to query ANGLE surface pointer", - linked_ptr<DXVAPictureBuffer>(NULL)); - - HRESULT hr = E_FAIL; - if (decoder.d3d11_device_) { - base::win::ScopedComPtr<ID3D11Resource> resource; - hr = decoder.d3d11_device_->OpenSharedResource( - share_handle, - __uuidof(ID3D11Resource), - reinterpret_cast<void**>(resource.Receive())); - RETURN_ON_HR_FAILURE(hr, "Failed to open shared resource", - linked_ptr<DXVAPictureBuffer>(NULL)); - hr = picture_buffer->dx11_decoding_texture_.QueryFrom(resource.get()); - } else { - hr = decoder.d3d9_device_ex_->CreateTexture( - buffer.size().width(), - buffer.size().height(), - 1, - D3DUSAGE_RENDERTARGET, - use_rgb ? D3DFMT_X8R8G8B8 : D3DFMT_A8R8G8B8, - D3DPOOL_DEFAULT, - picture_buffer->decoding_texture_.Receive(), - &share_handle); + if (decoder.d3d11_device_ && decoder.use_keyed_mutex_) { + void* keyed_mutex = nullptr; + EGLBoolean ret = eglQuerySurfacePointerANGLE( + egl_display, picture_buffer->decoding_surface_, + EGL_DXGI_KEYED_MUTEX_ANGLE, &keyed_mutex); + RETURN_ON_FAILURE(keyed_mutex && ret == EGL_TRUE, + "Failed to query ANGLE keyed mutex", + linked_ptr<DXVAPictureBuffer>(nullptr)); + picture_buffer->egl_keyed_mutex_ = base::win::ScopedComPtr<IDXGIKeyedMutex>( + static_cast<IDXGIKeyedMutex*>(keyed_mutex)); } - RETURN_ON_HR_FAILURE(hr, "Failed to create texture", - linked_ptr<DXVAPictureBuffer>(NULL)); picture_buffer->use_rgb_ = !!use_rgb; return picture_buffer; } +bool DXVAVideoDecodeAccelerator::DXVAPictureBuffer::InitializeTexture( + const DXVAVideoDecodeAccelerator& decoder, + bool use_rgb) { + DCHECK(!texture_share_handle_); + if (decoder.d3d11_device_) { + D3D11_TEXTURE2D_DESC desc; + desc.Width = picture_buffer_.size().width(); + desc.Height = picture_buffer_.size().height(); + desc.MipLevels = 1; + desc.ArraySize = 1; + desc.Format = DXGI_FORMAT_B8G8R8A8_UNORM; + desc.SampleDesc.Count = 1; + desc.SampleDesc.Quality = 0; + desc.Usage = D3D11_USAGE_DEFAULT; + desc.BindFlags = D3D11_BIND_SHADER_RESOURCE | D3D11_BIND_RENDER_TARGET; + desc.CPUAccessFlags = 0; + desc.MiscFlags = decoder.use_keyed_mutex_ + ? D3D11_RESOURCE_MISC_SHARED_KEYEDMUTEX + : D3D11_RESOURCE_MISC_SHARED; + + HRESULT hr = decoder.d3d11_device_->CreateTexture2D( + &desc, nullptr, dx11_decoding_texture_.Receive()); + RETURN_ON_HR_FAILURE(hr, "Failed to create texture", false); + if (decoder.use_keyed_mutex_) { + hr = dx11_keyed_mutex_.QueryFrom(dx11_decoding_texture_.get()); + RETURN_ON_HR_FAILURE(hr, "Failed to get keyed mutex", false); + } + + base::win::ScopedComPtr<IDXGIResource> resource; + hr = resource.QueryFrom(dx11_decoding_texture_.get()); + DCHECK(SUCCEEDED(hr)); + hr = resource->GetSharedHandle(&texture_share_handle_); + RETURN_ON_FAILURE(SUCCEEDED(hr) && texture_share_handle_, + "Failed to query shared handle", false); + + } else { + HRESULT hr = E_FAIL; + hr = decoder.d3d9_device_ex_->CreateTexture( + picture_buffer_.size().width(), picture_buffer_.size().height(), 1, + D3DUSAGE_RENDERTARGET, use_rgb ? D3DFMT_X8R8G8B8 : D3DFMT_A8R8G8B8, + D3DPOOL_DEFAULT, decoding_texture_.Receive(), &texture_share_handle_); + RETURN_ON_HR_FAILURE(hr, "Failed to create texture", false); + RETURN_ON_FAILURE(texture_share_handle_, "Failed to query shared handle", + false); + } + return true; +} + DXVAVideoDecodeAccelerator::DXVAPictureBuffer::DXVAPictureBuffer( const media::PictureBuffer& buffer) : available_(true), picture_buffer_(buffer), decoding_surface_(NULL), - use_rgb_(true) { -} + texture_share_handle_(nullptr), + keyed_mutex_value_(0), + use_rgb_(true) {} DXVAVideoDecodeAccelerator::DXVAPictureBuffer::~DXVAPictureBuffer() { if (decoding_surface_) { @@ -500,7 +541,7 @@ } } -void DXVAVideoDecodeAccelerator::DXVAPictureBuffer::ReusePictureBuffer() { +bool DXVAVideoDecodeAccelerator::DXVAPictureBuffer::ReusePictureBuffer() { DCHECK(decoding_surface_); EGLDisplay egl_display = gfx::GLSurfaceEGL::GetHardwareDisplay(); eglReleaseTexImage( @@ -511,6 +552,11 @@ target_surface_.Release(); decoder_dx11_texture_.Release(); set_available(true); + if (egl_keyed_mutex_) { + HRESULT hr = egl_keyed_mutex_->ReleaseSync(++keyed_mutex_value_); + RETURN_ON_FAILURE(hr == S_OK, "Could not release sync mutex", false); + } + return true; } bool DXVAVideoDecodeAccelerator::DXVAPictureBuffer:: @@ -525,8 +571,9 @@ // when we receive a notification that the copy was completed or when the // DXVAPictureBuffer instance is destroyed. decoder_dx11_texture_ = dx11_texture; - decoder->CopyTexture(dx11_texture, dx11_decoding_texture_.get(), NULL, - id(), input_buffer_id); + decoder->CopyTexture(dx11_texture, dx11_decoding_texture_.get(), + dx11_keyed_mutex_, keyed_mutex_value_, NULL, id(), + input_buffer_id); return true; } D3DSURFACE_DESC surface_desc; @@ -566,7 +613,7 @@ return true; } -void DXVAVideoDecodeAccelerator::DXVAPictureBuffer::CopySurfaceComplete( +bool DXVAVideoDecodeAccelerator::DXVAPictureBuffer::CopySurfaceComplete( IDirect3DSurface9* src_surface, IDirect3DSurface9* dest_surface) { DCHECK(!available()); @@ -587,6 +634,12 @@ DCHECK(decoder_dx11_texture_.get()); decoder_dx11_texture_.Release(); } + if (egl_keyed_mutex_) { + keyed_mutex_value_++; + HRESULT result = + egl_keyed_mutex_->AcquireSync(keyed_mutex_value_, kAcquireSyncWaitMs); + RETURN_ON_FAILURE(result == S_OK, "Could not acquire sync mutex", false); + } EGLDisplay egl_display = gfx::GLSurfaceEGL::GetHardwareDisplay(); eglBindTexImage( @@ -596,6 +649,7 @@ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glBindTexture(GL_TEXTURE_2D, current_texture); + return true; } DXVAVideoDecodeAccelerator::PendingSampleInfo::PendingSampleInfo( @@ -623,6 +677,7 @@ decoder_thread_("DXVAVideoDecoderThread"), pending_flush_(false), use_dx11_(false), + use_keyed_mutex_(false), dx11_video_format_converter_media_type_needs_init_(true), gl_context_(gl_context), using_angle_device_(false), @@ -966,7 +1021,10 @@ return; } - it->second->ReusePictureBuffer(); + RETURN_AND_NOTIFY_ON_FAILURE(it->second->ReusePictureBuffer(), + "Failed to reuse picture buffer", + PLATFORM_FAILURE, ); + ProcessPendingSamples(); if (pending_flush_) { decoder_thread_task_runner_->PostTask( @@ -1243,6 +1301,10 @@ attributes->GetUINT32(MF_SA_D3D11_AWARE, &dx11_aware); use_dx11_ = !!dx11_aware; } + + use_keyed_mutex_ = + use_dx11_ && gfx::GLSurfaceEGL::HasEGLExtension("EGL_ANGLE_keyed_mutex"); + return true; } @@ -1940,8 +2002,9 @@ DCHECK(!output_picture_buffers_.empty()); - picture_buffer->CopySurfaceComplete(src_surface, - dest_surface); + bool result = picture_buffer->CopySurfaceComplete(src_surface, dest_surface); + RETURN_AND_NOTIFY_ON_FAILURE(result, "Failed to complete copying surface", + PLATFORM_FAILURE, ); NotifyPictureReady(picture_buffer->id(), input_buffer_id); @@ -1964,11 +2027,14 @@ base::Unretained(this))); } -void DXVAVideoDecodeAccelerator::CopyTexture(ID3D11Texture2D* src_texture, - ID3D11Texture2D* dest_texture, - IMFSample* video_frame, - int picture_buffer_id, - int input_buffer_id) { +void DXVAVideoDecodeAccelerator::CopyTexture( + ID3D11Texture2D* src_texture, + ID3D11Texture2D* dest_texture, + base::win::ScopedComPtr<IDXGIKeyedMutex> dest_keyed_mutex, + uint64_t keyed_mutex_value, + IMFSample* video_frame, + int picture_buffer_id, + int input_buffer_id) { HRESULT hr = E_FAIL; DCHECK(use_dx11_); @@ -2005,14 +2071,11 @@ } decoder_thread_task_runner_->PostTask( - FROM_HERE, - base::Bind(&DXVAVideoDecodeAccelerator::CopyTexture, - base::Unretained(this), - src_texture, - dest_texture, - input_sample_for_conversion.Detach(), - picture_buffer_id, - input_buffer_id)); + FROM_HERE, base::Bind(&DXVAVideoDecodeAccelerator::CopyTexture, + base::Unretained(this), src_texture, dest_texture, + dest_keyed_mutex, keyed_mutex_value, + input_sample_for_conversion.Detach(), + picture_buffer_id, input_buffer_id)); return; } @@ -2023,6 +2086,13 @@ DCHECK(video_format_converter_mft_.get()); + if (dest_keyed_mutex) { + HRESULT hr = + dest_keyed_mutex->AcquireSync(keyed_mutex_value, kAcquireSyncWaitMs); + RETURN_AND_NOTIFY_ON_FAILURE( + hr == S_OK, "D3D11 failed to acquire keyed mutex for texture.", + PLATFORM_FAILURE, ); + } // The video processor MFT requires output samples to be allocated by the // caller. We create a sample with a buffer backed with the ID3D11Texture2D // interface exposed by ANGLE. This works nicely as this ensures that the @@ -2077,18 +2147,27 @@ "Failed to convert output sample format.", PLATFORM_FAILURE,); } - d3d11_device_context_->Flush(); - d3d11_device_context_->End(d3d11_query_.get()); + if (dest_keyed_mutex) { + HRESULT hr = dest_keyed_mutex->ReleaseSync(keyed_mutex_value + 1); + RETURN_AND_NOTIFY_ON_FAILURE(hr == S_OK, "Failed to release keyed mutex.", + PLATFORM_FAILURE, ); - decoder_thread_task_runner_->PostDelayedTask( - FROM_HERE, - base::Bind(&DXVAVideoDecodeAccelerator::FlushDecoder, - base::Unretained(this), 0, - reinterpret_cast<IDirect3DSurface9*>(NULL), - reinterpret_cast<IDirect3DSurface9*>(NULL), - picture_buffer_id, input_buffer_id), - base::TimeDelta::FromMilliseconds( - kFlushDecoderSurfaceTimeoutMs)); + main_thread_task_runner_->PostTask( + FROM_HERE, base::Bind(&DXVAVideoDecodeAccelerator::CopySurfaceComplete, + weak_this_factory_.GetWeakPtr(), nullptr, nullptr, + picture_buffer_id, input_buffer_id)); + } else { + d3d11_device_context_->Flush(); + d3d11_device_context_->End(d3d11_query_.get()); + + decoder_thread_task_runner_->PostDelayedTask( + FROM_HERE, base::Bind(&DXVAVideoDecodeAccelerator::FlushDecoder, + base::Unretained(this), 0, + reinterpret_cast<IDirect3DSurface9*>(NULL), + reinterpret_cast<IDirect3DSurface9*>(NULL), + picture_buffer_id, input_buffer_id), + base::TimeDelta::FromMilliseconds(kFlushDecoderSurfaceTimeoutMs)); + } } void DXVAVideoDecodeAccelerator::FlushDecoder(
diff --git a/content/common/gpu/media/dxva_video_decode_accelerator_win.h b/content/common/gpu/media/dxva_video_decode_accelerator_win.h index d3aeda6..5f37ddf98 100644 --- a/content/common/gpu/media/dxva_video_decode_accelerator_win.h +++ b/content/common/gpu/media/dxva_video_decode_accelerator_win.h
@@ -222,6 +222,8 @@ // is the sample containing the frame to be copied. void CopyTexture(ID3D11Texture2D* src_texture, ID3D11Texture2D* dest_texture, + base::win::ScopedComPtr<IDXGIKeyedMutex> dest_keyed_mutex, + uint64_t keyed_mutex_value, IMFSample* video_frame, int picture_buffer_id, int input_buffer_id); @@ -373,6 +375,10 @@ // H/W decoding. bool use_dx11_; + // True if we should use DXGI keyed mutexes to synchronize between the two + // contexts. + bool use_keyed_mutex_; + // Set to true if the DX11 video format converter input media types need to // be initialized. Defaults to true. bool dx11_video_format_converter_media_type_needs_init_;
diff --git a/content/common/mojo/service_registry_impl.cc b/content/common/mojo/service_registry_impl.cc index d75f64d5..a55864f 100644 --- a/content/common/mojo/service_registry_impl.cc +++ b/content/common/mojo/service_registry_impl.cc
@@ -39,14 +39,9 @@ } } -void ServiceRegistryImpl::AddServiceOverrideForTesting( +void ServiceRegistryImpl::AddService( const std::string& service_name, - const ServiceFactory& factory) { - service_overrides_[service_name] = factory; -} - -void ServiceRegistryImpl::AddService(const std::string& service_name, - const ServiceFactory service_factory) { + const base::Callback<void(mojo::ScopedMessagePipeHandle)> service_factory) { service_factories_[service_name] = service_factory; } @@ -57,12 +52,6 @@ void ServiceRegistryImpl::ConnectToRemoteService( const base::StringPiece& service_name, mojo::ScopedMessagePipeHandle handle) { - auto override_it = service_overrides_.find(service_name.as_string()); - if (override_it != service_overrides_.end()) { - override_it->second.Run(std::move(handle)); - return; - } - if (!remote_provider_) { pending_connects_.push( std::make_pair(service_name.as_string(), handle.release())); @@ -83,7 +72,9 @@ void ServiceRegistryImpl::ConnectToService( const mojo::String& name, mojo::ScopedMessagePipeHandle client_handle) { - auto it = service_factories_.find(name); + std::map<std::string, + base::Callback<void(mojo::ScopedMessagePipeHandle)> >::iterator it = + service_factories_.find(name); if (it == service_factories_.end()) return;
diff --git a/content/common/mojo/service_registry_impl.h b/content/common/mojo/service_registry_impl.h index a51c67c..5e4fd73 100644 --- a/content/common/mojo/service_registry_impl.h +++ b/content/common/mojo/service_registry_impl.h
@@ -24,8 +24,6 @@ : public ServiceRegistry, public NON_EXPORTED_BASE(mojo::ServiceProvider) { public: - using ServiceFactory = base::Callback<void(mojo::ScopedMessagePipeHandle)>; - ServiceRegistryImpl(); ~ServiceRegistryImpl() override; @@ -38,15 +36,10 @@ // ServiceProvider. void BindRemoteServiceProvider(mojo::ServiceProviderPtr service_provider); - // Registers a local service factory to intercept ConnectToRemoteService - // requests instead of actually connecting to the remote registry. Used only - // for testing. - void AddServiceOverrideForTesting(const std::string& service_name, - const ServiceFactory& service_factory); - // ServiceRegistry overrides. void AddService(const std::string& service_name, - const ServiceFactory service_factory) override; + const base::Callback<void(mojo::ScopedMessagePipeHandle)> + service_factory) override; void RemoveService(const std::string& service_name) override; void ConnectToRemoteService(const base::StringPiece& service_name, mojo::ScopedMessagePipeHandle handle) override; @@ -65,12 +58,11 @@ mojo::Binding<mojo::ServiceProvider> binding_; mojo::ServiceProviderPtr remote_provider_; - std::map<std::string, ServiceFactory> service_factories_; + std::map<std::string, base::Callback<void(mojo::ScopedMessagePipeHandle)> > + service_factories_; std::queue<std::pair<std::string, mojo::MessagePipeHandle> > pending_connects_; - std::map<std::string, ServiceFactory> service_overrides_; - base::WeakPtrFactory<ServiceRegistry> weak_factory_; };
diff --git a/content/content_tests.gypi b/content/content_tests.gypi index c2cb611..1829548f 100644 --- a/content/content_tests.gypi +++ b/content/content_tests.gypi
@@ -780,6 +780,7 @@ 'renderer/media/media_stream_video_renderer_sink_unittest.cc', 'renderer/media/media_stream_video_source_unittest.cc', 'renderer/media/media_stream_video_track_unittest.cc', + 'renderer/media/mock_constraint_factory.cc', 'renderer/media/mock_media_constraint_factory.cc', 'renderer/media/mock_media_stream_registry.cc', 'renderer/media/mock_media_stream_registry.h',
diff --git a/content/plugin/webplugin_proxy.cc b/content/plugin/webplugin_proxy.cc index f9ce4a3..c03b4fd 100644 --- a/content/plugin/webplugin_proxy.cc +++ b/content/plugin/webplugin_proxy.cc
@@ -305,7 +305,7 @@ #else // See above comment about windowless_context_ changing. // http::/crbug.com/139462 - skia::RefPtr<skia::PlatformCanvas> saved_canvas = windowless_canvas(); + skia::RefPtr<SkCanvas> saved_canvas = windowless_canvas(); saved_canvas->save(); @@ -376,7 +376,7 @@ void WebPluginProxy::CreateCanvasFromHandle( const TransportDIB::Handle& dib_handle, const gfx::Rect& window_rect, - skia::RefPtr<skia::PlatformCanvas>* canvas) { + skia::RefPtr<SkCanvas>* canvas) { *canvas = skia::AdoptRef(skia::CreatePlatformCanvas( window_rect.width(), window_rect.height(), true, dib_handle.GetHandle(), skia::RETURN_NULL_ON_FAILURE));
diff --git a/content/public/test/render_view_test.cc b/content/public/test/render_view_test.cc index cd56c01..d5d5fa58 100644 --- a/content/public/test/render_view_test.cc +++ b/content/public/test/render_view_test.cc
@@ -409,6 +409,8 @@ leak_detector->collectGarbageAndReport(); + base::RunLoop().RunUntilIdle(); + blink_platform_impl_.Shutdown(); blink::shutdown();
diff --git a/content/renderer/media/media_stream_video_source.cc b/content/renderer/media/media_stream_video_source.cc index 38f19b0..942d248 100644 --- a/content/renderer/media/media_stream_video_source.cc +++ b/content/renderer/media/media_stream_video_source.cc
@@ -13,7 +13,6 @@ #include "base/strings/string_number_conversions.h" #include "base/trace_event/trace_event.h" #include "content/child/child_process.h" -#include "content/renderer/media/media_stream_constraints_util.h" #include "content/renderer/media/media_stream_video_track.h" #include "content/renderer/media/video_track_adapter.h" @@ -43,15 +42,14 @@ namespace { -// Google-specific key prefix. Constraints with this prefix are ignored if they -// are unknown. -const char kGooglePrefix[] = "goog"; +const char* kLegalVideoConstraints[] = { + "width", "height", "aspectRatio", "frameRate", + "facingMode", "deviceId", "groupId", "mediaStreamSource", +}; // Returns true if |constraint| has mandatory constraints. bool HasMandatoryConstraints(const blink::WebMediaConstraints& constraints) { - blink::WebVector<blink::WebMediaConstraint> mandatory_constraints; - constraints.getMandatoryConstraints(mandatory_constraints); - return !mandatory_constraints.isEmpty(); + return constraints.basic().hasMandatory(); } // Retrieve the desired max width and height from |constraints|. If not set, @@ -64,23 +62,21 @@ *desired_width = std::numeric_limits<int>::max(); *desired_height = std::numeric_limits<int>::max(); - bool mandatory = GetMandatoryConstraintValueAsInteger( - constraints, - MediaStreamVideoSource::kMaxWidth, - desired_width); - mandatory |= GetMandatoryConstraintValueAsInteger( - constraints, - MediaStreamVideoSource::kMaxHeight, - desired_height); - if (mandatory) + const auto& basic_constraints = constraints.basic(); + if (basic_constraints.width.hasMax() || basic_constraints.height.hasMax()) { + if (basic_constraints.width.hasMax()) + *desired_width = basic_constraints.width.max(); + if (basic_constraints.height.hasMax()) + *desired_height = basic_constraints.height.max(); return; + } - GetOptionalConstraintValueAsInteger(constraints, - MediaStreamVideoSource::kMaxWidth, - desired_width); - GetOptionalConstraintValueAsInteger(constraints, - MediaStreamVideoSource::kMaxHeight, - desired_height); + for (const auto& constraint_set : constraints.advanced()) { + if (constraint_set.width.hasMax()) + *desired_width = constraint_set.width.max(); + if (constraint_set.height.hasMax()) + *desired_height = constraint_set.height.max(); + } } // Retrieve the desired max and min aspect ratio from |constraints|. If not set, @@ -95,128 +91,119 @@ *min_aspect_ratio = 0; *max_aspect_ratio = std::numeric_limits<double>::max(); - bool mandatory = GetMandatoryConstraintValueAsDouble( - constraints, - MediaStreamVideoSource::kMinAspectRatio, - min_aspect_ratio); - mandatory |= GetMandatoryConstraintValueAsDouble( - constraints, - MediaStreamVideoSource::kMaxAspectRatio, - max_aspect_ratio); - if (mandatory) + if (constraints.basic().aspectRatio.hasMin() || + constraints.basic().aspectRatio.hasMax()) { + if (constraints.basic().aspectRatio.hasMin()) + *min_aspect_ratio = constraints.basic().aspectRatio.min(); + if (constraints.basic().aspectRatio.hasMax()) + *max_aspect_ratio = constraints.basic().aspectRatio.max(); return; - - GetOptionalConstraintValueAsDouble(constraints, - MediaStreamVideoSource::kMinAspectRatio, - min_aspect_ratio); - GetOptionalConstraintValueAsDouble(constraints, - MediaStreamVideoSource::kMaxAspectRatio, - max_aspect_ratio); + // Note - the code will ignore attempts at successive refinement + // of the aspect ratio with advanced constraint. This may be wrong. + } + // Note - the code below will potentially pick min and max from different + // constraint sets, some of which might have been ignored. + for (const auto& constraint_set : constraints.advanced()) { + if (constraint_set.aspectRatio.hasMin()) { + *min_aspect_ratio = constraint_set.aspectRatio.min(); + break; + } + } + for (const auto& constraint_set : constraints.advanced()) { + if (constraint_set.aspectRatio.hasMax()) { + *max_aspect_ratio = constraint_set.aspectRatio.max(); + break; + } + } } -// Returns true if |constraint| is fulfilled. |format| can be changed by a +// Returns true if |constraints| are fulfilled. |format| can be changed by a // constraint, e.g. the frame rate can be changed by setting maxFrameRate. -bool UpdateFormatForConstraint(const blink::WebMediaConstraint& constraint, - bool mandatory, - media::VideoCaptureFormat* format) { +bool UpdateFormatForConstraints( + const blink::WebMediaTrackConstraintSet& constraints, + media::VideoCaptureFormat* format, + std::string* failing_constraint_name) { DCHECK(format != NULL); if (!format->IsValid()) return false; - const std::string constraint_name = constraint.m_name.utf8(); - const std::string constraint_value = constraint.m_value.utf8(); - - if (constraint_name.find(kGooglePrefix) == 0) { - // These are actually options, not constraints, so they can be satisfied - // regardless of the format. - return true; - } - - if (constraint_name == MediaStreamSource::kSourceId) { - // This is a constraint that doesn't affect the format. - return true; - } - - // Ignore Chrome specific Tab capture constraints. - if (constraint_name == kMediaStreamSource || - constraint_name == kMediaStreamSourceId) - return true; - - if (constraint_name == MediaStreamVideoSource::kMinAspectRatio || - constraint_name == MediaStreamVideoSource::kMaxAspectRatio) { - // These constraints are handled by cropping if the camera outputs the wrong - // aspect ratio. - double value; - return base::StringToDouble(constraint_value, &value); - } - - double value = 0.0; - if (!base::StringToDouble(constraint_value, &value)) { - DLOG(WARNING) << "Can't parse MediaStream constraint. Name:" - << constraint_name << " Value:" << constraint_value; - return false; - } - - if (constraint_name == MediaStreamVideoSource::kMinWidth) { - return (value <= format->frame_size.width()); - } else if (constraint_name == MediaStreamVideoSource::kMaxWidth) { - return value > 0.0; - } else if (constraint_name == MediaStreamVideoSource::kMinHeight) { - return (value <= format->frame_size.height()); - } else if (constraint_name == MediaStreamVideoSource::kMaxHeight) { - return value > 0.0; - } else if (constraint_name == MediaStreamVideoSource::kMinFrameRate) { - return (value > 0.0) && (value <= format->frame_rate); - } else if (constraint_name == MediaStreamVideoSource::kMaxFrameRate) { - if (value <= 0.0) { - // The frame rate is set by constraint. - // Don't allow 0 as frame rate if it is a mandatory constraint. - // Set the frame rate to 1 if it is not mandatory. - if (mandatory) { - return false; - } else { - value = 1.0; + // The width and height are matched based on cropping occuring later: + // min width/height has to be >= the size of the frame (no upscale). + // max width/height just has to be > 0 (we can crop anything too large). + if ((constraints.width.hasMin() && + constraints.width.min() > format->frame_size.width()) || + (constraints.width.hasMax() && constraints.width.max() <= 0)) { + *failing_constraint_name = constraints.width.name(); + } else if ((constraints.height.hasMin() && + constraints.height.min() > format->frame_size.height()) || + (constraints.height.hasMax() && constraints.height.max() <= 0)) { + *failing_constraint_name = constraints.height.name(); + } else if (!constraints.frameRate.matches(format->frame_rate)) { + if (constraints.frameRate.hasMax()) { + const double value = constraints.frameRate.max(); + // TODO(hta): Check if handling of max = 0.0 is relevant. + // (old handling was to set rate to 1.0 if 0.0 was specified) + if (constraints.frameRate.matches(value)) { + format->frame_rate = + (format->frame_rate > value) ? value : format->frame_rate; + return true; } } - format->frame_rate = - (format->frame_rate > value) ? value : format->frame_rate; - return true; + *failing_constraint_name = constraints.frameRate.name(); } else { - LOG(WARNING) << "Found unknown MediaStream constraint. Name:" - << constraint_name << " Value:" << constraint_value; - return false; + return true; } + + DCHECK(!failing_constraint_name->empty()); + return false; } // Removes media::VideoCaptureFormats from |formats| that don't meet -// |constraint|. -void FilterFormatsByConstraint(const blink::WebMediaConstraint& constraint, - bool mandatory, - media::VideoCaptureFormats* formats) { - DVLOG(3) << "FilterFormatsByConstraint(" - << "{ constraint.m_name = " << constraint.m_name.utf8() - << " constraint.m_value = " << constraint.m_value.utf8() - << " mandatory = " << mandatory << "})"; +// |constraints|. +void FilterFormatsByConstraints( + const blink::WebMediaTrackConstraintSet& constraints, + media::VideoCaptureFormats* formats, + std::string* failing_constraint_name) { media::VideoCaptureFormats::iterator format_it = formats->begin(); while (format_it != formats->end()) { - // Modify the format_it to fulfill the constraint if possible. + // Modify |format_it| to fulfill the constraint if possible. // Delete it otherwise. - if (!UpdateFormatForConstraint(constraint, mandatory, &(*format_it))) + if (!UpdateFormatForConstraints(constraints, &(*format_it), + failing_constraint_name)) { format_it = formats->erase(format_it); - else + } else { ++format_it; + } } } // Returns the media::VideoCaptureFormats that matches |constraints|. +// If the return value is empty, and the reason is a specific constraint, +// |unsatisfied_constraint| returns the name of the constraint. media::VideoCaptureFormats FilterFormats( const blink::WebMediaConstraints& constraints, const media::VideoCaptureFormats& supported_formats, - blink::WebString* unsatisfied_constraint) { + std::string* unsatisfied_constraint) { if (constraints.isNull()) return supported_formats; + const auto& basic = constraints.basic(); + + // Do some checks that won't be done when filtering candidates. + + if (basic.width.hasMin() && basic.width.hasMax() && + basic.width.min() > basic.width.max()) { + *unsatisfied_constraint = basic.width.name(); + return media::VideoCaptureFormats(); + } + + if (basic.height.hasMin() && basic.height.hasMax() && + basic.height.min() > basic.height.max()) { + *unsatisfied_constraint = basic.height.name(); + return media::VideoCaptureFormats(); + } + double max_aspect_ratio; double min_aspect_ratio; GetDesiredMinAndMaxAspectRatio(constraints, @@ -224,64 +211,39 @@ &max_aspect_ratio); if (min_aspect_ratio > max_aspect_ratio || max_aspect_ratio < 0.05f) { - DLOG(WARNING) << "Wrong requested aspect ratio."; + DLOG(WARNING) << "Wrong requested aspect ratio: min " << min_aspect_ratio + << " max " << max_aspect_ratio; + *unsatisfied_constraint = basic.aspectRatio.name(); return media::VideoCaptureFormats(); } - int min_width = 0; - GetMandatoryConstraintValueAsInteger(constraints, - MediaStreamVideoSource::kMinWidth, - &min_width); - int min_height = 0; - GetMandatoryConstraintValueAsInteger(constraints, - MediaStreamVideoSource::kMinHeight, - &min_height); - int max_width; - int max_height; - GetDesiredMaxWidthAndHeight(constraints, &max_width, &max_height); - - if (min_width > max_width || min_height > max_height) + std::vector<std::string> temp( + &kLegalVideoConstraints[0], + &kLegalVideoConstraints[sizeof(kLegalVideoConstraints) / + sizeof(kLegalVideoConstraints[0])]); + std::string failing_name; + if (basic.hasMandatoryOutsideSet(temp, failing_name)) { + *unsatisfied_constraint = failing_name; return media::VideoCaptureFormats(); - - double min_frame_rate = 0.0f; - double max_frame_rate = 0.0f; - if (GetConstraintValueAsDouble(constraints, - MediaStreamVideoSource::kMaxFrameRate, - &max_frame_rate) && - GetConstraintValueAsDouble(constraints, - MediaStreamVideoSource::kMinFrameRate, - &min_frame_rate)) { - if (min_frame_rate > max_frame_rate) { - DLOG(WARNING) << "Wrong requested frame rate."; - return media::VideoCaptureFormats(); - } } - blink::WebVector<blink::WebMediaConstraint> mandatory; - blink::WebVector<blink::WebMediaConstraint> optional; - constraints.getMandatoryConstraints(mandatory); - constraints.getOptionalConstraints(optional); media::VideoCaptureFormats candidates = supported_formats; - for (const auto& constraint : mandatory) { - FilterFormatsByConstraint(constraint, true, &candidates); - if (candidates.empty()) { - *unsatisfied_constraint = constraint.m_name; - return candidates; - } - } + FilterFormatsByConstraints(basic, &candidates, unsatisfied_constraint); if (candidates.empty()) return candidates; // Ok - all mandatory checked and we still have candidates. - // Let's try filtering using the optional constraints. The optional - // constraints must be filtered in the order they occur in |optional|. + // Let's try filtering using the advanced constraints. The advanced + // constraints must be filtered in the order they occur in |advanced|. // But if a constraint produce zero candidates, the constraint is ignored and // the next constraint is tested. - // http://dev.w3.org/2011/webrtc/editor/getusermedia.html#idl-def-Constraints - for (const auto& constraint : optional) { + // http://w3c.github.io/mediacapture-main/getusermedia.html#dfn-selectsettings + for (const auto& constraint_set : constraints.advanced()) { media::VideoCaptureFormats current_candidates = candidates; - FilterFormatsByConstraint(constraint, false, ¤t_candidates); + std::string unsatisfied_constraint; + FilterFormatsByConstraints(constraint_set, ¤t_candidates, + &unsatisfied_constraint); if (!current_candidates.empty()) candidates = current_candidates; } @@ -303,6 +265,8 @@ best_format = &format; } } + DVLOG(3) << "GetBestFormatBasedOnArea chose format " + << media::VideoCaptureFormat::ToString(*best_format); return *best_format; } @@ -337,7 +301,7 @@ return static_cast<MediaStreamVideoSource*>(source.extraData()); } -// static +// static, deprecated bool MediaStreamVideoSource::IsConstraintSupported(const std::string& name) { return std::find(kSupportedConstraints, kSupportedConstraints + arraysize(kSupportedConstraints), @@ -374,16 +338,16 @@ // Tab capture and Screen capture needs the maximum requested height // and width to decide on the resolution. int max_requested_width = 0; - GetMandatoryConstraintValueAsInteger(constraints, kMaxWidth, - &max_requested_width); + if (constraints.basic().width.hasMax()) + max_requested_width = constraints.basic().width.max(); int max_requested_height = 0; - GetMandatoryConstraintValueAsInteger(constraints, kMaxHeight, - &max_requested_height); + if (constraints.basic().height.hasMax()) + max_requested_height = constraints.basic().height.max(); double max_requested_frame_rate = kDefaultFrameRate; - GetConstraintValueAsDouble(constraints, kMaxFrameRate, - &max_requested_frame_rate); + if (constraints.basic().frameRate.hasMax()) + max_requested_frame_rate = constraints.basic().frameRate.max(); state_ = RETRIEVING_CAPABILITIES; GetCurrentSupportedFormats( @@ -459,6 +423,7 @@ ¤t_format_, &fulfilled_constraints)) { SetReadyState(blink::WebMediaStreamSource::ReadyStateEnded); + DVLOG(3) << "OnSupportedFormats failed to find an usable format"; // This object can be deleted after calling FinalizeAddTrack. See comment // in the header file. FinalizeAddTrack(); @@ -480,7 +445,9 @@ media::VideoCaptureFormat* best_format, blink::WebMediaConstraints* fulfilled_constraints) { DCHECK(CalledOnValidThread()); - // Find the first constraints that we can fulfill. + DVLOG(3) << "MediaStreamVideoSource::FindBestFormatWithConstraints " + << "with " << formats.size() << " formats"; + // Find the first track descriptor that can fulfil the constraints. for (const auto& track : track_descriptors_) { const blink::WebMediaConstraints& track_constraints = track.constraints; @@ -488,11 +455,12 @@ // no mandatory constraints have been specified. That just means that // we will start with whatever format is native to the source. if (formats.empty() && !HasMandatoryConstraints(track_constraints)) { + DVLOG(3) << "No mandatory constraints and no formats"; *fulfilled_constraints = track_constraints; *best_format = media::VideoCaptureFormat(); return true; } - blink::WebString unsatisfied_constraint; + std::string unsatisfied_constraint; const media::VideoCaptureFormats filtered_formats = FilterFormats(track_constraints, formats, &unsatisfied_constraint); if (filtered_formats.empty()) @@ -501,8 +469,10 @@ // A request with constraints that can be fulfilled. *fulfilled_constraints = track_constraints; *best_format = GetBestCaptureFormat(filtered_formats, track_constraints); + DVLOG(3) << "Found a track that matches the constraints"; return true; } + DVLOG(3) << "No usable format found"; return false; } @@ -536,12 +506,14 @@ track_descriptors.swap(track_descriptors_); for (const auto& track : track_descriptors) { MediaStreamRequestResult result = MEDIA_DEVICE_OK; - blink::WebString unsatisfied_constraint; + std::string unsatisfied_constraint; if (HasMandatoryConstraints(track.constraints) && FilterFormats(track.constraints, formats, &unsatisfied_constraint) .empty()) { result = MEDIA_DEVICE_CONSTRAINT_NOT_SATISFIED; + DVLOG(3) << "FinalizeAddTrack() ignoring device on constraint " + << unsatisfied_constraint; } if (state_ != STARTED && result == MEDIA_DEVICE_OK) @@ -557,8 +529,8 @@ &min_aspect_ratio, &max_aspect_ratio); double max_frame_rate = 0.0f; - GetConstraintValueAsDouble(track.constraints, - kMaxFrameRate, &max_frame_rate); + if (track.constraints.basic().frameRate.hasMax()) + max_frame_rate = track.constraints.basic().frameRate.max(); track_adapter_->AddTrack(track.track, track.frame_callback, max_width, max_height, min_aspect_ratio, max_aspect_ratio, @@ -568,7 +540,8 @@ DVLOG(3) << "FinalizeAddTrack() result " << result; if (!track.callback.is_null()) - track.callback.Run(this, result, unsatisfied_constraint); + track.callback.Run(this, result, + blink::WebString::fromUTF8(unsatisfied_constraint)); } }
diff --git a/content/renderer/media/media_stream_video_source_unittest.cc b/content/renderer/media/media_stream_video_source_unittest.cc index b2afab4f..2b3abc8 100644 --- a/content/renderer/media/media_stream_video_source_unittest.cc +++ b/content/renderer/media/media_stream_video_source_unittest.cc
@@ -13,9 +13,10 @@ #include "content/child/child_process.h" #include "content/renderer/media/media_stream_video_source.h" #include "content/renderer/media/media_stream_video_track.h" -#include "content/renderer/media/mock_media_constraint_factory.h" +#include "content/renderer/media/mock_constraint_factory.h" #include "content/renderer/media/mock_media_stream_video_sink.h" #include "content/renderer/media/mock_media_stream_video_source.h" +#include "media/base/limits.h" #include "media/base/video_frame.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/WebKit/public/web/WebHeap.h" @@ -296,10 +297,10 @@ // Test that the capture output is CIF if we set max constraints to CIF. // and the capture device support CIF. TEST_F(MediaStreamVideoSourceTest, MandatoryConstraintCif5Fps) { - MockMediaConstraintFactory factory; - factory.AddMandatory(MediaStreamVideoSource::kMaxWidth, 352); - factory.AddMandatory(MediaStreamVideoSource::kMaxHeight, 288); - factory.AddMandatory(MediaStreamVideoSource::kMaxFrameRate, 5); + MockConstraintFactory factory; + factory.basic().width.setMax(352); + factory.basic().height.setMax(288); + factory.basic().frameRate.setMax(5.0); CreateTrackAndStartSource(factory.CreateWebMediaConstraints(), 352, 288, 5); } @@ -307,11 +308,11 @@ // Test that the capture output is 720P if the camera support it and the // optional constraint is set to 720P. TEST_F(MediaStreamVideoSourceTest, MandatoryMinVgaOptional720P) { - MockMediaConstraintFactory factory; - factory.AddMandatory(MediaStreamVideoSource::kMinWidth, 640); - factory.AddMandatory(MediaStreamVideoSource::kMinHeight, 480); - factory.AddOptional(MediaStreamVideoSource::kMinWidth, 1280); - factory.AddOptional(MediaStreamVideoSource::kMinAspectRatio, 1280.0 / 720); + MockConstraintFactory factory; + factory.basic().width.setMin(640); + factory.basic().height.setMin(480); + factory.AddAdvanced().width.setMin(1280); + factory.AddAdvanced().aspectRatio.setMin(1280.0 / 720); CreateTrackAndStartSource(factory.CreateWebMediaConstraints(), 1280, 720, 30); } @@ -320,11 +321,11 @@ // require it even if an optional constraint request a higher resolution // that don't have this aspect ratio. TEST_F(MediaStreamVideoSourceTest, MandatoryAspectRatio4To3) { - MockMediaConstraintFactory factory; - factory.AddMandatory(MediaStreamVideoSource::kMinWidth, 640); - factory.AddMandatory(MediaStreamVideoSource::kMinHeight, 480); - factory.AddMandatory(MediaStreamVideoSource::kMaxAspectRatio, 640.0 / 480); - factory.AddOptional(MediaStreamVideoSource::kMinWidth, 1280); + MockConstraintFactory factory; + factory.basic().width.setMin(640); + factory.basic().height.setMin(480); + factory.basic().aspectRatio.setMax(640.0 / 480); + factory.AddAdvanced().width.setMin(1280); TestSourceCropFrame(1280, 720, factory.CreateWebMediaConstraints(), 960, 720); @@ -332,8 +333,8 @@ // Test that AddTrack succeeds if the mandatory min aspect ratio it set to 2. TEST_F(MediaStreamVideoSourceTest, MandatoryAspectRatio2) { - MockMediaConstraintFactory factory; - factory.AddMandatory(MediaStreamVideoSource::kMinAspectRatio, 2); + MockConstraintFactory factory; + factory.basic().aspectRatio.setMin(2.0); TestSourceCropFrame(MediaStreamVideoSource::kDefaultWidth, MediaStreamVideoSource::kDefaultHeight, @@ -341,18 +342,9 @@ } TEST_F(MediaStreamVideoSourceTest, MinAspectRatioLargerThanMaxAspectRatio) { - MockMediaConstraintFactory factory; - factory.AddMandatory(MediaStreamVideoSource::kMinAspectRatio, 2); - factory.AddMandatory(MediaStreamVideoSource::kMaxAspectRatio, 1); - blink::WebMediaStreamTrack track = CreateTrack( - "123", factory.CreateWebMediaConstraints()); - mock_source()->CompleteGetSupportedFormats(); - EXPECT_EQ(1, NumberOfFailedConstraintsCallbacks()); -} - -TEST_F(MediaStreamVideoSourceTest, MaxAspectRatioZero) { - MockMediaConstraintFactory factory; - factory.AddOptional(MediaStreamVideoSource::kMaxAspectRatio, 0); + MockConstraintFactory factory; + factory.basic().aspectRatio.setMin(2.0); + factory.basic().aspectRatio.setMax(1.0); blink::WebMediaStreamTrack track = CreateTrack( "123", factory.CreateWebMediaConstraints()); mock_source()->CompleteGetSupportedFormats(); @@ -360,9 +352,9 @@ } TEST_F(MediaStreamVideoSourceTest, MinWidthLargerThanMaxWidth) { - MockMediaConstraintFactory factory; - factory.AddMandatory(MediaStreamVideoSource::kMinWidth, 640); - factory.AddMandatory(MediaStreamVideoSource::kMaxWidth, 320); + MockConstraintFactory factory; + factory.basic().width.setMin(640); + factory.basic().width.setMax(320); blink::WebMediaStreamTrack track = CreateTrack( "123", factory.CreateWebMediaConstraints()); mock_source()->CompleteGetSupportedFormats(); @@ -370,9 +362,10 @@ } TEST_F(MediaStreamVideoSourceTest, MinHeightLargerThanMaxHeight) { - MockMediaConstraintFactory factory; - factory.AddMandatory(MediaStreamVideoSource::kMinHeight, 480); - factory.AddMandatory(MediaStreamVideoSource::kMaxHeight, 360); + MockConstraintFactory factory; + factory.basic().height.setMin(480); + factory.basic().height.setMax(360); + blink::WebMediaStreamTrack track = CreateTrack( "123", factory.CreateWebMediaConstraints()); mock_source()->CompleteGetSupportedFormats(); @@ -380,9 +373,9 @@ } TEST_F(MediaStreamVideoSourceTest, MinFrameRateLargerThanMaxFrameRate) { - MockMediaConstraintFactory factory; - factory.AddMandatory(MediaStreamVideoSource::kMinFrameRate, 25); - factory.AddMandatory(MediaStreamVideoSource::kMaxFrameRate, 15); + MockConstraintFactory factory; + factory.basic().frameRate.setMin(25); + factory.basic().frameRate.setMax(15); blink::WebMediaStreamTrack track = CreateTrack( "123", factory.CreateWebMediaConstraints()); mock_source()->CompleteGetSupportedFormats(); @@ -392,7 +385,7 @@ // Test that its safe to release the last reference of a blink track and the // source during the callback if adding a track succeeds. TEST_F(MediaStreamVideoSourceTest, ReleaseTrackAndSourceOnSuccessCallBack) { - MockMediaConstraintFactory factory; + MockConstraintFactory factory; { blink::WebMediaStreamTrack track = CreateTrack("123", factory.CreateWebMediaConstraints()); @@ -406,8 +399,8 @@ // Test that its safe to release the last reference of a blink track and the // source during the callback if adding a track fails. TEST_F(MediaStreamVideoSourceTest, ReleaseTrackAndSourceOnFailureCallBack) { - MockMediaConstraintFactory factory; - factory.AddMandatory(MediaStreamVideoSource::kMinWidth, 99999); + MockConstraintFactory factory; + factory.basic().width.setMin(99999); { blink::WebMediaStreamTrack track = CreateTrack("123", factory.CreateWebMediaConstraints()); @@ -420,8 +413,8 @@ // Test that the source ignores an optional aspect ratio that is higher than // supported. TEST_F(MediaStreamVideoSourceTest, OptionalAspectRatioTooHigh) { - MockMediaConstraintFactory factory; - factory.AddOptional(MediaStreamVideoSource::kMinAspectRatio, 2); + MockConstraintFactory factory; + factory.AddAdvanced().aspectRatio.setMin(2.0); blink::WebMediaStreamTrack track = CreateTrack( "123", factory.CreateWebMediaConstraints()); mock_source()->CompleteGetSupportedFormats(); @@ -452,20 +445,21 @@ } TEST_F(MediaStreamVideoSourceTest, InvalidMandatoryConstraint) { - MockMediaConstraintFactory factory; - factory.AddMandatory("weird key", 640); + MockConstraintFactory factory; + // Use a constraint that is only known for audio. + factory.basic().echoCancellation.setExact(true); blink::WebMediaStreamTrack track = CreateTrack( "123", factory.CreateWebMediaConstraints()); mock_source()->CompleteGetSupportedFormats(); EXPECT_EQ(MEDIA_DEVICE_CONSTRAINT_NOT_SATISFIED, error_type()); - EXPECT_EQ("weird key", error_name()); + EXPECT_EQ("echoCancellation", error_name()); EXPECT_EQ(1, NumberOfFailedConstraintsCallbacks()); } // Test that the source ignores an unknown optional constraint. TEST_F(MediaStreamVideoSourceTest, InvalidOptionalConstraint) { - MockMediaConstraintFactory factory; - factory.AddOptional("weird key", 640); + MockConstraintFactory factory; + factory.AddAdvanced().echoCancellation.setExact(true); CreateTrackAndStartSource(factory.CreateWebMediaConstraints(), MediaStreamVideoSource::kDefaultWidth, @@ -480,9 +474,9 @@ formats.push_back(media::VideoCaptureFormat( gfx::Size(480, 270), 30, media::PIXEL_FORMAT_I420)); mock_source()->SetSupportedFormats(formats); - MockMediaConstraintFactory factory; - factory.AddMandatory(MediaStreamVideoSource::kMaxWidth, 480); - factory.AddMandatory(MediaStreamVideoSource::kMaxHeight, 270); + MockConstraintFactory factory; + factory.basic().width.setMax(480); + factory.basic().height.setMax(270); blink::WebMediaStreamTrack track = CreateTrackAndStartSource( factory.CreateWebMediaConstraints(), 480, 270, 30); @@ -492,75 +486,75 @@ // Test that optional constraints are applied in order. TEST_F(MediaStreamVideoSourceTest, OptionalConstraints) { - MockMediaConstraintFactory factory; + MockConstraintFactory factory; // Min width of 2056 pixels can not be fulfilled. - factory.AddOptional(MediaStreamVideoSource::kMinWidth, 2056); - factory.AddOptional(MediaStreamVideoSource::kMinWidth, 641); + factory.AddAdvanced().width.setMin(2056); + factory.AddAdvanced().width.setMin(641); // Since min width is set to 641 pixels, max width 640 can not be fulfilled. - factory.AddOptional(MediaStreamVideoSource::kMaxWidth, 640); + factory.AddAdvanced().width.setMax(640); CreateTrackAndStartSource(factory.CreateWebMediaConstraints(), 1280, 720, 30); } // Test that the source crops to the requested max width and // height even though the camera delivers a larger frame. TEST_F(MediaStreamVideoSourceTest, DeliverCroppedVideoFrameOptional640360) { - MockMediaConstraintFactory factory; - factory.AddOptional(MediaStreamVideoSource::kMaxWidth, 640); - factory.AddOptional(MediaStreamVideoSource::kMaxHeight, 360); + MockConstraintFactory factory; + factory.AddAdvanced().width.setMax(640); + factory.AddAdvanced().height.setMax(360); TestSourceCropFrame(640, 480, factory.CreateWebMediaConstraints(), 640, 360); } TEST_F(MediaStreamVideoSourceTest, DeliverCroppedVideoFrameMandatory640360) { - MockMediaConstraintFactory factory; - factory.AddMandatory(MediaStreamVideoSource::kMaxWidth, 640); - factory.AddMandatory(MediaStreamVideoSource::kMaxHeight, 360); + MockConstraintFactory factory; + factory.basic().width.setMax(640); + factory.basic().height.setMax(360); TestSourceCropFrame(640, 480, factory.CreateWebMediaConstraints(), 640, 360); } TEST_F(MediaStreamVideoSourceTest, DeliverCroppedVideoFrameMandatory732489) { - MockMediaConstraintFactory factory; - factory.AddMandatory(MediaStreamVideoSource::kMaxWidth, 732); - factory.AddMandatory(MediaStreamVideoSource::kMaxHeight, 489); - factory.AddMandatory(MediaStreamVideoSource::kMinWidth, 732); - factory.AddMandatory(MediaStreamVideoSource::kMinWidth, 489); + MockConstraintFactory factory; + factory.basic().width.setMax(732); + factory.basic().height.setMax(489); + factory.basic().width.setMin(732); + factory.basic().height.setMin(489); TestSourceCropFrame(1280, 720, factory.CreateWebMediaConstraints(), 732, 489); } // Test that the source crops to the requested max width and // height even though the requested frame has odd size. TEST_F(MediaStreamVideoSourceTest, DeliverCroppedVideoFrame637359) { - MockMediaConstraintFactory factory; - factory.AddOptional(MediaStreamVideoSource::kMaxWidth, 637); - factory.AddOptional(MediaStreamVideoSource::kMaxHeight, 359); + MockConstraintFactory factory; + factory.AddAdvanced().width.setMax(637); + factory.AddAdvanced().height.setMax(359); TestSourceCropFrame(640, 480, factory.CreateWebMediaConstraints(), 637, 359); } TEST_F(MediaStreamVideoSourceTest, DeliverCroppedVideoFrame320320) { - MockMediaConstraintFactory factory; - factory.AddMandatory(MediaStreamVideoSource::kMaxWidth, 320); - factory.AddMandatory(MediaStreamVideoSource::kMaxHeight, 320); - factory.AddMandatory(MediaStreamVideoSource::kMinHeight, 320); - factory.AddMandatory(MediaStreamVideoSource::kMinWidth, 320); + MockConstraintFactory factory; + factory.basic().width.setMax(320); + factory.basic().height.setMax(320); + factory.basic().height.setMin(320); + factory.basic().width.setMax(320); TestSourceCropFrame(640, 480, factory.CreateWebMediaConstraints(), 320, 320); } TEST_F(MediaStreamVideoSourceTest, DeliverSmallerSizeWhenTooLargeMax) { - MockMediaConstraintFactory factory; - factory.AddOptional(MediaStreamVideoSource::kMaxWidth, 1920); - factory.AddOptional(MediaStreamVideoSource::kMaxHeight, 1080); - factory.AddOptional(MediaStreamVideoSource::kMinWidth, 1280); - factory.AddOptional(MediaStreamVideoSource::kMinHeight, 720); + MockConstraintFactory factory; + factory.AddAdvanced().width.setMax(1920); + factory.AddAdvanced().height.setMax(1080); + factory.AddAdvanced().width.setMin(1280); + factory.AddAdvanced().height.setMin(720); TestSourceCropFrame(1280, 720, factory.CreateWebMediaConstraints(), 1280, 720); } TEST_F(MediaStreamVideoSourceTest, TwoTracksWithVGAAndWVGA) { - MockMediaConstraintFactory factory1; - factory1.AddOptional(MediaStreamVideoSource::kMaxWidth, 640); - factory1.AddOptional(MediaStreamVideoSource::kMaxHeight, 480); + MockConstraintFactory factory1; + factory1.AddAdvanced().width.setMax(640); + factory1.AddAdvanced().height.setMax(480); - MockMediaConstraintFactory factory2; - factory2.AddOptional(MediaStreamVideoSource::kMaxHeight, 360); + MockConstraintFactory factory2; + factory2.AddAdvanced().height.setMax(360); TestTwoTracksWithDifferentConstraints(factory1.CreateWebMediaConstraints(), factory2.CreateWebMediaConstraints(), @@ -570,14 +564,13 @@ } TEST_F(MediaStreamVideoSourceTest, TwoTracksWith720AndWVGA) { - MockMediaConstraintFactory factory1; - factory1.AddOptional(MediaStreamVideoSource::kMinWidth, 1280); - factory1.AddOptional(MediaStreamVideoSource::kMinHeight, 720); + MockConstraintFactory factory1; + factory1.AddAdvanced().width.setMin(1280); + factory1.AddAdvanced().height.setMin(720); - - MockMediaConstraintFactory factory2; - factory2.AddMandatory(MediaStreamVideoSource::kMaxWidth, 640); - factory2.AddMandatory(MediaStreamVideoSource::kMaxHeight, 360); + MockConstraintFactory factory2; + factory2.basic().width.setMax(640); + factory2.basic().height.setMax(360); TestTwoTracksWithDifferentConstraints(factory1.CreateWebMediaConstraints(), factory2.CreateWebMediaConstraints(), @@ -587,13 +580,13 @@ } TEST_F(MediaStreamVideoSourceTest, TwoTracksWith720AndW700H700) { - MockMediaConstraintFactory factory1; - factory1.AddOptional(MediaStreamVideoSource::kMinWidth, 1280); - factory1.AddOptional(MediaStreamVideoSource::kMinHeight, 720); + MockConstraintFactory factory1; + factory1.AddAdvanced().width.setMin(1280); + factory1.AddAdvanced().height.setMin(720); - MockMediaConstraintFactory factory2; - factory2.AddMandatory(MediaStreamVideoSource::kMaxWidth, 700); - factory2.AddMandatory(MediaStreamVideoSource::kMaxHeight, 700); + MockConstraintFactory factory2; + factory2.basic().width.setMax(700); + factory2.basic().height.setMax(700); TestTwoTracksWithDifferentConstraints(factory1.CreateWebMediaConstraints(), factory2.CreateWebMediaConstraints(), @@ -603,12 +596,12 @@ } TEST_F(MediaStreamVideoSourceTest, TwoTracksWith720AndMaxAspectRatio4To3) { - MockMediaConstraintFactory factory1; - factory1.AddOptional(MediaStreamVideoSource::kMinWidth, 1280); - factory1.AddOptional(MediaStreamVideoSource::kMinHeight, 720); + MockConstraintFactory factory1; + factory1.AddAdvanced().width.setMin(1280); + factory1.AddAdvanced().height.setMin(720); - MockMediaConstraintFactory factory2; - factory2.AddMandatory(MediaStreamVideoSource::kMaxAspectRatio, 640.0 / 480); + MockConstraintFactory factory2; + factory2.basic().aspectRatio.setMax(640.0 / 480); TestTwoTracksWithDifferentConstraints(factory1.CreateWebMediaConstraints(), factory2.CreateWebMediaConstraints(), @@ -618,12 +611,12 @@ } TEST_F(MediaStreamVideoSourceTest, TwoTracksWithVgaAndMinAspectRatio) { - MockMediaConstraintFactory factory1; - factory1.AddOptional(MediaStreamVideoSource::kMaxWidth, 640); - factory1.AddOptional(MediaStreamVideoSource::kMaxHeight, 480); + MockConstraintFactory factory1; + factory1.AddAdvanced().width.setMax(640); + factory1.AddAdvanced().height.setMax(480); - MockMediaConstraintFactory factory2; - factory2.AddMandatory(MediaStreamVideoSource::kMinAspectRatio, 640.0 / 360); + MockConstraintFactory factory2; + factory2.basic().aspectRatio.setMin(640.0 / 360); TestTwoTracksWithDifferentConstraints(factory1.CreateWebMediaConstraints(), factory2.CreateWebMediaConstraints(), @@ -634,9 +627,9 @@ TEST_F(MediaStreamVideoSourceTest, TwoTracksWithSecondTrackFrameRateHigherThanFirst) { - MockMediaConstraintFactory factory1; - factory1.AddMandatory(MediaStreamVideoSource::kMinFrameRate, 15); - factory1.AddMandatory(MediaStreamVideoSource::kMaxFrameRate, 15); + MockConstraintFactory factory1; + factory1.basic().frameRate.setMin(15); + factory1.basic().frameRate.setMax(15); blink::WebMediaStreamTrack track1 = CreateTrackAndStartSource(factory1.CreateWebMediaConstraints(), @@ -644,8 +637,8 @@ MediaStreamVideoSource::kDefaultHeight, 15); - MockMediaConstraintFactory factory2; - factory2.AddMandatory(MediaStreamVideoSource::kMinFrameRate, 30); + MockConstraintFactory factory2; + factory2.basic().frameRate.setMin(30); blink::WebMediaStreamTrack track2 = CreateTrack( "123", factory2.CreateWebMediaConstraints()); EXPECT_EQ(1, NumberOfFailedConstraintsCallbacks()); @@ -655,9 +648,9 @@ // tracks sinks get the new frame size unless constraints force the frame to be // cropped. TEST_F(MediaStreamVideoSourceTest, SourceChangeFrameSize) { - MockMediaConstraintFactory factory; - factory.AddOptional(MediaStreamVideoSource::kMaxWidth, 800); - factory.AddOptional(MediaStreamVideoSource::kMaxHeight, 700); + MockConstraintFactory factory; + factory.AddAdvanced().width.setMax(800); + factory.AddAdvanced().height.setMax(700); // Expect the source to start capture with the supported resolution. blink::WebMediaStreamTrack track = @@ -746,18 +739,20 @@ // Test that a source producing no frames change the source readyState to muted. // that in a reasonable time frame the muted state turns to false. TEST_F(MediaStreamVideoSourceTest, MutedSource) { - // Setup the source for support a frame rate of 2000fps in order to test + // Setup the source for support a frame rate of 999 fps in order to test // the muted event faster. This is since the frame monitoring uses // PostDelayedTask that is dependent on the source frame rate. + // Note that media::limits::kMaxFramesPerSecond is 1000. media::VideoCaptureFormats formats; formats.push_back(media::VideoCaptureFormat( - gfx::Size(640, 480), 2000, media::PIXEL_FORMAT_I420)); + gfx::Size(640, 480), media::limits::kMaxFramesPerSecond - 1, + media::PIXEL_FORMAT_I420)); SetSourceSupportedFormats(formats); - MockMediaConstraintFactory factory; + MockConstraintFactory factory; blink::WebMediaStreamTrack track = - CreateTrackAndStartSource(factory.CreateWebMediaConstraints(), - 640, 480, 2000); + CreateTrackAndStartSource(factory.CreateWebMediaConstraints(), 640, 480, + media::limits::kMaxFramesPerSecond - 1); MockMediaStreamVideoSink sink; MediaStreamVideoSink::AddToVideoTrack(&sink, sink.GetDeliverFrameCB(), track); EXPECT_EQ(track.source().readyState(),
diff --git a/content/renderer/media/midi_dispatcher.cc b/content/renderer/media/midi_dispatcher.cc index 309b93c..004b1888 100644 --- a/content/renderer/media/midi_dispatcher.cc +++ b/content/renderer/media/midi_dispatcher.cc
@@ -10,9 +10,11 @@ #include "third_party/WebKit/public/platform/WebString.h" #include "third_party/WebKit/public/web/WebSecurityOrigin.h" #include "third_party/WebKit/public/web/WebUserGestureIndicator.h" +#include "third_party/WebKit/public/web/modules/webmidi/WebMIDIOptions.h" #include "third_party/WebKit/public/web/modules/webmidi/WebMIDIPermissionRequest.h" using blink::WebMIDIPermissionRequest; +using blink::WebMIDIOptions; using blink::WebSecurityOrigin; namespace content { @@ -23,8 +25,11 @@ MidiDispatcher::~MidiDispatcher() {} -void MidiDispatcher::requestSysexPermission( - const WebMIDIPermissionRequest& request) { +void MidiDispatcher::requestPermission(const WebMIDIPermissionRequest& request, + const WebMIDIOptions& options) { + if (options.sysex == WebMIDIOptions::SysexPermission::WithoutSysex) + return WebMIDIPermissionRequest(request).setIsAllowed(true); + if (!permission_service_.get()) { render_frame()->GetServiceRegistry()->ConnectToRemoteService( mojo::GetProxy(&permission_service_)); @@ -36,11 +41,11 @@ permission_service_->RequestPermission( PermissionName::MIDI_SYSEX, request.securityOrigin().toString().utf8(), blink::WebUserGestureIndicator::isProcessingUserGesture(), - base::Bind(&MidiDispatcher::OnSysExPermissionSet, base::Unretained(this), + base::Bind(&MidiDispatcher::OnPermissionSet, base::Unretained(this), permission_request_id)); } -void MidiDispatcher::cancelSysexPermissionRequest( +void MidiDispatcher::cancelPermissionRequest( const WebMIDIPermissionRequest& request) { for (Requests::iterator it(&requests_); !it.IsAtEnd(); it.Advance()) { WebMIDIPermissionRequest* value = it.GetCurrentValue(); @@ -51,8 +56,7 @@ } } -void MidiDispatcher::OnSysExPermissionSet(int request_id, - PermissionStatus status) { +void MidiDispatcher::OnPermissionSet(int request_id, PermissionStatus status) { // |request| can be NULL when the request is canceled. WebMIDIPermissionRequest* request = requests_.Lookup(request_id); if (!request)
diff --git a/content/renderer/media/midi_dispatcher.h b/content/renderer/media/midi_dispatcher.h index 703bd4a3..06566fd 100644 --- a/content/renderer/media/midi_dispatcher.h +++ b/content/renderer/media/midi_dispatcher.h
@@ -29,13 +29,13 @@ private: // blink::WebMIDIClient implementation. - void requestSysexPermission( - const blink::WebMIDIPermissionRequest& request) override; - void cancelSysexPermissionRequest( + void requestPermission(const blink::WebMIDIPermissionRequest& request, + const blink::WebMIDIOptions& options) override; + void cancelPermissionRequest( const blink::WebMIDIPermissionRequest& request) override; - // Permission for using system exclusive messages has been set. - void OnSysExPermissionSet(int request_id, PermissionStatus status); + // Permission for using MIDI system has been set. + void OnPermissionSet(int request_id, PermissionStatus status); // Each WebMIDIPermissionRequest object is valid until // cancelSysexPermissionRequest() is called with the object, or used to call
diff --git a/content/renderer/media/mock_constraint_factory.cc b/content/renderer/media/mock_constraint_factory.cc new file mode 100644 index 0000000..4e2b414 --- /dev/null +++ b/content/renderer/media/mock_constraint_factory.cc
@@ -0,0 +1,32 @@ +// 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. + +#include <stddef.h> + +#include "base/macros.h" +#include "base/strings/string_number_conversions.h" +#include "base/strings/utf_string_conversions.h" +#include "content/renderer/media/media_stream_audio_processor_options.h" +#include "content/renderer/media/mock_constraint_factory.h" +#include "third_party/libjingle/source/talk/app/webrtc/mediaconstraintsinterface.h" + +namespace content { + +MockConstraintFactory::MockConstraintFactory() {} + +MockConstraintFactory::~MockConstraintFactory() {} + +blink::WebMediaTrackConstraintSet& MockConstraintFactory::AddAdvanced() { + advanced_.emplace_back(); + return advanced_.back(); +} + +blink::WebMediaConstraints MockConstraintFactory::CreateWebMediaConstraints() + const { + blink::WebMediaConstraints constraints; + constraints.initialize(basic_, advanced_); + return constraints; +} + +} // namespace content
diff --git a/content/renderer/media/mock_constraint_factory.h b/content/renderer/media/mock_constraint_factory.h new file mode 100644 index 0000000..e9d4da0 --- /dev/null +++ b/content/renderer/media/mock_constraint_factory.h
@@ -0,0 +1,33 @@ +// 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. + +#ifndef CONTENT_RENDERER_MEDIA_MOCK_CONSTRAINT_FACTORY_H_ +#define CONTENT_RENDERER_MEDIA_MOCK_CONSTRAINT_FACTORY_H_ + +#include <string> +#include <vector> + +#include "third_party/WebKit/public/platform/WebMediaConstraints.h" + +namespace content { + +class MockConstraintFactory { + public: + MockConstraintFactory(); + ~MockConstraintFactory(); + + blink::WebMediaConstraints CreateWebMediaConstraints() const; + blink::WebMediaTrackConstraintSet& basic() { return basic_; } + blink::WebMediaTrackConstraintSet& AddAdvanced(); + + private: + blink::WebMediaTrackConstraintSet basic_; + std::vector<blink::WebMediaTrackConstraintSet> advanced_; + + DISALLOW_COPY_AND_ASSIGN(MockConstraintFactory); +}; + +} // namespace content + +#endif // CONTENT_RENDERER_MEDIA_MOCK_CONSTRAINT_FACTORY_H_
diff --git a/content/renderer/media/webrtc/mock_peer_connection_dependency_factory.cc b/content/renderer/media/webrtc/mock_peer_connection_dependency_factory.cc index d4e6116..2032c3fb 100644 --- a/content/renderer/media/webrtc/mock_peer_connection_dependency_factory.cc +++ b/content/renderer/media/webrtc/mock_peer_connection_dependency_factory.cc
@@ -310,7 +310,7 @@ } void MockWebRtcVideoTrack::RemoveRenderer(VideoRendererInterface* renderer) { - DCHECK_EQ(renderer_, renderer); + DCHECK(renderer_ == renderer); renderer_ = NULL; }
diff --git a/content/renderer/mojo/service_registry_js_wrapper.cc b/content/renderer/mojo/service_registry_js_wrapper.cc index b23e084..b91a162 100644 --- a/content/renderer/mojo/service_registry_js_wrapper.cc +++ b/content/renderer/mojo/service_registry_js_wrapper.cc
@@ -6,27 +6,12 @@ #include <utility> -#include "base/memory/scoped_ptr.h" #include "content/common/mojo/service_registry_impl.h" #include "content/public/common/service_registry.h" #include "third_party/mojo/src/mojo/edk/js/handle.h" -#include "v8/include/v8.h" namespace content { -namespace { - -void CallJsFactory(scoped_ptr<v8::Persistent<v8::Function>> factory, - mojo::ScopedMessagePipeHandle pipe) { - v8::Isolate* isolate = v8::Isolate::GetCurrent(); - v8::Local<v8::Value> argv[] = { - gin::ConvertToV8(isolate, mojo::Handle(pipe.release().value())) - }; - factory->Get(isolate)->Call(v8::Undefined(isolate), 1, argv); -} - -} // namespace - gin::WrapperInfo ServiceRegistryJsWrapper::kWrapperInfo = { gin::kEmbedderNativeGin}; const char ServiceRegistryJsWrapper::kModuleName[] = @@ -49,9 +34,7 @@ v8::Isolate* isolate) { return Wrappable<ServiceRegistryJsWrapper>::GetObjectTemplateBuilder(isolate). SetMethod("connectToService", - &ServiceRegistryJsWrapper::ConnectToService). - SetMethod("addServiceOverrideForTesting", - &ServiceRegistryJsWrapper::AddServiceOverrideForTesting); + &ServiceRegistryJsWrapper::ConnectToService); } mojo::Handle ServiceRegistryJsWrapper::ConnectToService( @@ -63,20 +46,6 @@ return pipe.handle1.release(); } -void ServiceRegistryJsWrapper::AddServiceOverrideForTesting( - const std::string& service_name, - v8::Local<v8::Function> service_factory) { - ServiceRegistryImpl* registry = - static_cast<ServiceRegistryImpl*>(service_registry_.get()); - if (!registry) - return; - scoped_ptr<v8::Persistent<v8::Function>> factory( - new v8::Persistent<v8::Function>(v8::Isolate::GetCurrent(), - service_factory)); - registry->AddServiceOverrideForTesting( - service_name, base::Bind(&CallJsFactory, base::Passed(&factory))); -} - ServiceRegistryJsWrapper::ServiceRegistryJsWrapper( base::WeakPtr<ServiceRegistry> service_registry) : service_registry_(service_registry) {
diff --git a/content/renderer/mojo/service_registry_js_wrapper.h b/content/renderer/mojo/service_registry_js_wrapper.h index 543d214..73046862 100644 --- a/content/renderer/mojo/service_registry_js_wrapper.h +++ b/content/renderer/mojo/service_registry_js_wrapper.h
@@ -12,11 +12,7 @@ #include "gin/handle.h" #include "gin/object_template_builder.h" #include "gin/wrappable.h" -#include "mojo/public/cpp/system/handle.h" - -namespace v8 { -class Isolate; -} +#include "mojo/public/cpp/system/core.h" namespace content { @@ -37,8 +33,6 @@ v8::Isolate* isolate) override; // JS interface implementation. - void AddServiceOverrideForTesting(const std::string& service_name, - v8::Local<v8::Function> service_factory); mojo::Handle ConnectToService(const std::string& service_name); static gin::WrapperInfo kWrapperInfo;
diff --git a/content/renderer/npapi/webplugin_delegate_proxy.cc b/content/renderer/npapi/webplugin_delegate_proxy.cc index a14a7a9..b8ac39c 100644 --- a/content/renderer/npapi/webplugin_delegate_proxy.cc +++ b/content/renderer/npapi/webplugin_delegate_proxy.cc
@@ -555,7 +555,7 @@ bool WebPluginDelegateProxy::CreateLocalBitmap( std::vector<uint8_t>* memory, - scoped_ptr<skia::PlatformCanvas>* canvas) { + scoped_ptr<SkCanvas>* canvas) { const size_t size = BitmapSizeForPluginRect(plugin_rect_); memory->resize(size); if (memory->size() != size) @@ -569,7 +569,7 @@ bool WebPluginDelegateProxy::CreateSharedBitmap( scoped_ptr<SharedMemoryBitmap>* memory, - scoped_ptr<skia::PlatformCanvas>* canvas) { + scoped_ptr<SkCanvas>* canvas) { *memory = ChildThreadImpl::current() ->shared_bitmap_manager() ->AllocateSharedMemoryBitmap(plugin_rect_.size());
diff --git a/content/renderer/pepper/pepper_plugin_instance_impl.cc b/content/renderer/pepper/pepper_plugin_instance_impl.cc index 5d5679b7e..c9beb71 100644 --- a/content/renderer/pepper/pepper_plugin_instance_impl.cc +++ b/content/renderer/pepper/pepper_plugin_instance_impl.cc
@@ -3004,7 +3004,7 @@ if (!mapper.is_valid()) return 0; - skia::PlatformCanvas* canvas = image_data->GetPlatformCanvas(); + SkCanvas* canvas = image_data->GetPlatformCanvas(); // Note: Do not SkBitmap::copyTo the canvas bitmap directly because it will // ignore the allocated pixels in shared memory and re-allocate a new buffer. canvas->writePixels(image_skia_rep.sk_bitmap(), 0, 0);
diff --git a/content/renderer/pepper/ppb_image_data_impl.cc b/content/renderer/pepper/ppb_image_data_impl.cc index 56cc3731..cf446a1 100644 --- a/content/renderer/pepper/ppb_image_data_impl.cc +++ b/content/renderer/pepper/ppb_image_data_impl.cc
@@ -18,6 +18,7 @@ #include "ppapi/c/ppb_image_data.h" #include "ppapi/thunk/thunk.h" #include "skia/ext/platform_canvas.h" +#include "third_party/skia/include/core/SkCanvas.h" #include "third_party/skia/include/core/SkColorPriv.h" #include "third_party/skia/include/core/SkDevice.h" #include "third_party/skia/include/core/SkPixmap.h" @@ -112,7 +113,7 @@ return backend_->GetSharedMemory(shm, byte_count); } -skia::PlatformCanvas* PPB_ImageData_Impl::GetPlatformCanvas() { +SkCanvas* PPB_ImageData_Impl::GetPlatformCanvas() { return backend_->GetPlatformCanvas(); } @@ -197,7 +198,7 @@ return PP_OK; } -skia::PlatformCanvas* ImageDataPlatformBackend::GetPlatformCanvas() { +SkCanvas* ImageDataPlatformBackend::GetPlatformCanvas() { return mapped_canvas_.get(); } @@ -258,7 +259,7 @@ return PP_OK; } -skia::PlatformCanvas* ImageDataSimpleBackend::GetPlatformCanvas() { +SkCanvas* ImageDataSimpleBackend::GetPlatformCanvas() { return NULL; }
diff --git a/content/renderer/render_view_browsertest.cc b/content/renderer/render_view_browsertest.cc index 80ddf409..8e0566b 100644 --- a/content/renderer/render_view_browsertest.cc +++ b/content/renderer/render_view_browsertest.cc
@@ -59,7 +59,6 @@ #include "third_party/WebKit/public/platform/WebURLResponse.h" #include "third_party/WebKit/public/web/WebDataSource.h" #include "third_party/WebKit/public/web/WebDeviceEmulationParams.h" -#include "third_party/WebKit/public/web/WebHeap.h" #include "third_party/WebKit/public/web/WebHistoryCommitType.h" #include "third_party/WebKit/public/web/WebHistoryItem.h" #include "third_party/WebKit/public/web/WebLocalFrame.h" @@ -88,7 +87,6 @@ #include "url/url_constants.h" using blink::WebFrame; -using blink::WebHeap; using blink::WebInputEvent; using blink::WebLocalFrame; using blink::WebMouseEvent; @@ -173,13 +171,6 @@ RenderViewTest::SetUp(); } - // To avoid flaky leak reports, insist on GCing - // Blink upon shutdown to clear out garbage. - void TearDown() override { - WebHeap::collectGarbageForTesting(); - RenderViewTest::TearDown(); - } - RenderViewImpl* view() { return static_cast<RenderViewImpl*>(view_); } @@ -2652,7 +2643,8 @@ } #if defined(OS_MACOSX) || defined(USE_AURA) -TEST_F(RenderViewImplScaleFactorTest, GetCompositionCharacterBoundsTest) { +TEST_F(RenderViewImplScaleFactorTest, + DISABLED_GetCompositionCharacterBoundsTest) { // http://crbug.com/582016 base::CommandLine::ForCurrentProcess()->AppendSwitch( switches::kEnableUseZoomForDSF); DoSetUp();
diff --git a/content/test/data/media/getusermedia.html b/content/test/data/media/getusermedia.html index fbc3654..0e98cc6 100644 --- a/content/test/data/media/getusermedia.html +++ b/content/test/data/media/getusermedia.html
@@ -334,7 +334,7 @@ } function failedCallback(error) { - failTest('GetUserMedia call failed with code ' + error.code); + failTest('GetUserMedia call failed with error name ' + error.name); } function attachMediaStream(stream, videoElement) { @@ -502,7 +502,8 @@ if (++attempt > maxAttempts) { clearInterval(detectorInterval); failTest("Aspect ratio corrupted. X " + maxLightGreenPixelsX + - " Y " + maxLightGreenPixelsY); + " Y " + maxLightGreenPixelsY + " width " + width + + " height " + height); } else { // We have a bad aspect ratio now; give a chance to shape up.
diff --git a/content/test/gpu/generate_buildbot_json.py b/content/test/gpu/generate_buildbot_json.py new file mode 100755 index 0000000..1194b450 --- /dev/null +++ b/content/test/gpu/generate_buildbot_json.py
@@ -0,0 +1,408 @@ +#!/usr/bin/env python +# 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. + +"""Script to generate chromium.gpu.json and chromium.gpu.fyi.json in +the src/testing/buildbot directory. Maintaining these files by hand is +too unwieldy. +""" + +import copy +import json +import string +import sys + +BUILDERS = [ + 'GPU NextGen Linux Builder', + 'GPU NextGen Linux Builder (dbg)', + 'GPU NextGen Mac Builder', + 'GPU NextGen Mac Builder (dbg)', + 'GPU NextGen Win Builder', + 'GPU NextGen Win Builder (dbg)', +] + +TESTERS = { + 'Linux NextGen Debug (NVIDIA)': { + 'swarming_dimensions': { + 'gpu': '10de:104a', + 'os': 'Linux' + }, + 'build_config': 'Debug', + 'swarming': True, + 'os_type': 'linux', + }, + 'Linux NextGen Release (NVIDIA)': { + 'swarming_dimensions': { + 'gpu': '10de:104a', + 'os': 'Linux' + }, + 'build_config': 'Release', + 'swarming': True, + 'os_type': 'linux', + }, + 'Mac 10.10 Debug (ATI)': { + 'swarming_dimensions': { + 'gpu': '1002:679e', + 'os': 'Mac-10.10' + }, + 'build_config': 'Debug', + 'swarming': False, + 'os_type': 'mac', + }, + 'Mac 10.10 Release (ATI)': { + 'swarming_dimensions': { + 'gpu': '1002:679e', + 'os': 'Mac-10.10' + }, + 'build_config': 'Release', + 'swarming': False, + 'os_type': 'mac', + }, + 'Mac NextGen 10.10 Retina Debug (AMD)': { + 'swarming_dimensions': { + 'gpu': '1002:6821', + 'hidpi': '1', + 'os': 'Mac-10.10' + }, + 'build_config': 'Debug', + 'swarming': True, + 'os_type': 'mac', + }, + 'Mac NextGen 10.10 Retina Release (AMD)': { + 'swarming_dimensions': { + 'gpu': '1002:6821', + 'hidpi': '1', + 'os': 'Mac-10.10' + }, + 'build_config': 'Release', + 'swarming': True, + 'os_type': 'mac', + }, + 'Win7 NextGen Debug (NVIDIA)': { + 'swarming_dimensions': { + 'gpu': '10de:104a', + 'os': 'Windows-2008ServerR2-SP1' + }, + 'build_config': 'Debug', + 'swarming': True, + 'os_type': 'win', + }, + 'Win7 NextGen Release (AMD)': { + 'swarming_dimensions': { + 'gpu': '1002:6779', + 'os': 'Windows-2008ServerR2-SP1' + }, + 'build_config': 'Release', + 'swarming': True, + 'os_type': 'win', + }, + 'Win7 NextGen Release (Intel)': { + 'swarming_dimensions': { + 'gpu': '8086:041a', + 'os': 'Windows-2008ServerR2-SP1' + }, + 'build_config': 'Release', + 'swarming': False, + 'os_type': 'win', + }, + 'Win7 NextGen Release (NVIDIA)': { + 'swarming_dimensions': { + 'gpu': '10de:104a', + 'os': 'Windows-2008ServerR2-SP1' + }, + 'build_config': 'Release', + 'swarming': True, + 'os_type': 'win', + }, + 'Win7 NextGen dEQP (NVIDIA)': { + 'deqp': True, + 'swarming_dimensions': { + 'gpu': '10de:104a', + 'os': 'Windows-2008ServerR2-SP1' + }, + 'build_config': 'Release', + 'swarming': True, + 'os_type': 'win', + }, + 'Win8 NextGen Debug (NVIDIA)': { + 'swarming_dimensions': { + 'gpu': '10de:104a', + 'os': 'Windows-2012ServerR2-SP0' + }, + 'build_config': 'Debug', + 'swarming': True, + 'os_type': 'win', + }, + 'Win8 NextGen Release (NVIDIA)': { + 'swarming_dimensions': { + 'gpu': '10de:104a', + 'os': 'Windows-2012ServerR2-SP0' + }, + 'build_config': 'Release', + 'swarming': True, + 'os_type': 'win', + }, +} + +COMMON_GTESTS = { + 'angle_end2end_tests': {'args': ['--use-gpu-in-tests']}, + 'angle_unittests': {'args': ['--use-gpu-in-tests']}, + 'content_gl_tests': {'args': ['--use-gpu-in-tests']}, + 'gl_tests': {'args': ['--use-gpu-in-tests']}, + 'gl_unittests': {'args': ['--use-gpu-in-tests']}, +} + +RELEASE_ONLY_GTESTS = { + 'tab_capture_end2end_tests': { + 'override_compile_targets': [ + 'tab_capture_end2end_tests_run', + ], + }, +} + +# This requires a hack because the isolate's name is different than +# the executable's name. On the few non-swarmed testers, this causes +# the executable to not be found. It would be better if the Chromium +# recipe supported running isolates locally. crbug.com/581953 + +NON_SWARMED_GTESTS = { + 'tab_capture_end2end_tests': { + 'test': 'browser_tests', + 'args': [ + '--enable-gpu', + '--test-launcher-jobs=1', + '--gtest_filter=CastStreamingApiTestWithPixelOutput.EndToEnd*:' + \ + 'TabCaptureApiPixelTest.EndToEnd*' + ] + } +} + +# Until the media-only tests are extracted from content_unittests and +# these both can be run on the commit queue with +# --require-audio-hardware-for-testing, run them only on the FYI +# waterfall. +# +# Note that the transition to the Chromium recipe has forced the +# removal of the --require-audio-hardware-for-testing flag for the +# time being. See crbug.com/574942. +FYI_ONLY_GTESTS = { + 'audio_unittests': {'args': ['--use-gpu-in-tests']}, + 'content_unittests': {}, + # The gles2_conform_tests are closed-source and deliberately only run + # on the FYI waterfall. + 'gles2_conform_test': {'args': ['--use-gpu-in-tests']}, + 'gles2_conform_d3d9_test': { + 'win_only': True, + 'args': [ + '--use-gpu-in-tests', + '--use-angle=d3d9', + ], + 'test': 'gles2_conform_test', + }, + 'gles2_conform_gl_test': { + 'win_only': True, + 'args': [ + '--use-gpu-in-tests', + '--use-angle=gl', + '--disable-gpu-sandbox', + ], + 'test': 'gles2_conform_test', + } +} + +DEQP_GTESTS = { + 'angle_deqp_gles2_tests': {'swarming_shards': 4}, + 'angle_deqp_gles3_tests': {'swarming_shards': 12}, +} + +TELEMETRY_TESTS = { + 'context_lost': {}, + 'gpu_process_launch_tests': {'target_name': 'gpu_process'}, + 'gpu_rasterization': {}, + 'hardware_accelerated_feature': {}, + 'maps_pixel_test': {'target_name': 'maps'}, + 'memory_test': {}, + 'pixel_test': { + 'target_name': 'pixel', + 'args': [ + '--refimg-cloud-storage-bucket', + 'chromium-gpu-archive/reference-images', + '--os-type', + '${os_type}', + '--build-revision', + '${got_revision}', + '--test-machine-name', + '${buildername}', + ], + 'non_precommit_args': [ + '--upload-refimg-to-cloud-storage', + ], + 'precommit_args': [ + '--download-refimg-from-cloud-storage', + ] + }, + 'screenshot_sync': {}, + 'trace_test': {}, + 'webgl_conformance': {}, + 'webgl_conformance_d3d9_tests': { + 'win_only': True, + 'target_name': 'webgl_conformance', + 'extra_browser_args': [ + '--use-angle=d3d9', + ], + }, + 'webgl_conformance_gl_tests': { + 'win_only': True, + 'target_name': 'webgl_conformance', + 'extra_browser_args': [ + '--use-angle=gl', + ], + }, + 'webgl2_conformance_tests': { + 'target_name': 'webgl_conformance', + 'args': [ + '--webgl-conformance-version=2.0.0', + '--webgl2-only=true', + ], + }, +} + +def substitute_args(tester_config, args): + """Substitutes the ${os_type} variable in |args| from the + tester_config's "os_type" property. + """ + substitutions = { + 'os_type': tester_config['os_type'] + } + return [string.Template(arg).safe_substitute(substitutions) for arg in args] + +def generate_gtest(tester_config, test, test_config): + result = copy.deepcopy(test_config) + if result.get('win_only'): + if tester_config['os_type'] != 'win': + return None + # Don't print this in the JSON. + result.pop('win_only') + if 'test' in result: + result['name'] = test + else: + result['test'] = test + if (not tester_config['swarming']) and test in NON_SWARMED_GTESTS: + # Need to override this result. + result = copy.deepcopy(NON_SWARMED_GTESTS[test]) + result['name'] = test + else: + # Put the swarming dimensions in anyway. If the tester is later + # swarmed, they will come in handy. + result['swarming'] = { + 'can_use_on_swarming_builders': True, + 'dimension_sets': [ + tester_config['swarming_dimensions'] + ], + } + if result.get('swarming_shards'): + result['swarming']['shards'] = result['swarming_shards'] + result.pop('swarming_shards') + # print "generating " + test + return result + +def generate_telemetry_test(tester_config, test, test_config): + if test_config.get('win_only'): + if tester_config['os_type'] != 'win': + return None + test_args = ['-v'] + # --expose-gc allows the WebGL conformance tests to more reliably + # reproduce GC-related bugs in the V8 bindings. + extra_browser_args_string = ( + '--enable-logging=stderr --js-flags=--expose-gc') + if 'extra_browser_args' in test_config: + extra_browser_args_string += ' ' + ' '.join( + test_config['extra_browser_args']) + test_args.append('--extra-browser-args=\"' + extra_browser_args_string + + '\"') + if 'args' in test_config: + test_args.extend(substitute_args(tester_config, test_config['args'])) + # The step name must end in 'test' or 'tests' in order for the + # results to automatically show up on the flakiness dashboard. + # (At least, this was true some time ago.) Continue to use this + # naming convention for the time being to minimize changes. + step_name = test + if not (step_name.endswith('test') or step_name.endswith('tests')): + step_name = '%s_tests' % step_name + # Prepend Telemetry GPU-specific flags. + benchmark_name = test_config.get('target_name') or test + prefix_args = [ + benchmark_name, + '--show-stdout', + '--browser=%s' % tester_config['build_config'].lower() + ] + result = { + 'args': prefix_args + test_args, + 'isolate_name': 'telemetry_gpu_test', + 'name': step_name, + 'override_compile_targets': [ + 'telemetry_gpu_test_run' + ], + 'swarming': { + # Always say this is true regardless of whether the tester + # supports swarming. It doesn't hurt. + 'can_use_on_swarming_builders': True, + 'dimension_sets': [ + tester_config['swarming_dimensions'] + ] + } + } + if 'non_precommit_args' in test_config: + result['non_precommit_args'] = test_config['non_precommit_args'] + if 'precommit_args' in test_config: + result['precommit_args'] = test_config['precommit_args'] + return result + +def generate_gtests(tester_config, test_dictionary): + # The relative ordering of some of the tests is important to + # minimize differences compared to the handwritten JSON files, since + # Python's sorts are stable and there are some tests with the same + # key (see gles2_conform_d3d9_test and similar variants). Avoid + # losing the order by avoiding coalescing the dictionaries into one. + gtests = [] + for test_name, test_config in sorted(test_dictionary.iteritems()): + test = generate_gtest(tester_config, test_name, test_config) + if test: + # generate_gtest may veto the test generation on this platform. + gtests.append(test) + return gtests + +def generate_all_tests(): + tests = {} + for builder in BUILDERS: + tests[builder] = {} + for name, config in TESTERS.iteritems(): + gtests = [] + if config.get('deqp'): + gtests.extend(generate_gtests(config, DEQP_GTESTS)) + else: + gtests.extend(generate_gtests(config, COMMON_GTESTS)) + if config['build_config'] == 'Release': + gtests.extend(generate_gtests(config, RELEASE_ONLY_GTESTS)) + # For the moment we're only generating the FYI waterfall's tests. + gtests.extend(generate_gtests(config, FYI_ONLY_GTESTS)) + isolated_scripts = [] + if not config.get('deqp'): + for test_name, test_config in sorted(TELEMETRY_TESTS.iteritems()): + test = generate_telemetry_test(config, test_name, test_config) + if test: + isolated_scripts.append(test) + cur_tests = {} + if gtests: + cur_tests['gtest_tests'] = sorted(gtests, key=lambda x: x['test']) + if isolated_scripts: + cur_tests['isolated_scripts'] = sorted( + isolated_scripts, key=lambda x: x['name']) + tests[name] = cur_tests + tests['AAAAA1 AUTOGENERATED FILE DO NOT EDIT'] = {} + tests['AAAAA2 See generate_buildbot_json.py to make changes'] = {} + print json.dumps(tests, indent=2, separators=(',', ': '), sort_keys=True) + +if __name__ == "__main__": + sys.exit(generate_all_tests())
diff --git a/content/test/gpu/gpu_tests/trace_test_expectations.py b/content/test/gpu/gpu_tests/trace_test_expectations.py index 764dbce5..5570c1fe 100644 --- a/content/test/gpu/gpu_tests/trace_test_expectations.py +++ b/content/test/gpu/gpu_tests/trace_test_expectations.py
@@ -11,7 +11,10 @@ # Sample Usage: # self.Fail('TraceTest.Canvas2DRedBox', # ['mac', 'amd', ('nvidia', 0x1234)], bug=123) - pass + + # TODO(ccameron): Continue investigating this. + self.Fail('TraceTest.CSS3DBlueBox', ['mac'], bug=577121) + self.Fail('TraceTest.Canvas2DRedBox', ['mac'], bug=577121) class DeviceTraceTestExpectations(GpuTestExpectations): def SetExpectations(self):
diff --git a/device/bluetooth/README.md b/device/bluetooth/README.md index cda6f1dd..9000164 100644 --- a/device/bluetooth/README.md +++ b/device/bluetooth/README.md
@@ -10,18 +10,17 @@ implementations may support only one or the other, even though several classes have interfaces for both, e.g. `BluetoothAdapter` & `BluetoothDevice`. - | | Classic | Low Energy | - |----------|:-------:|:-----------:| - | Android | no | in progress | - | ChromeOS | yes | yes | - | Linux | yes | yes | - | Mac OSX | yes | in progress | - | Windows | some | in progress | +| | Classic | Low Energy | +|----------|:-------:|:-----------:| +| Android | no | in progress | +| ChromeOS | yes | yes | +| Linux | yes | yes | +| Mac OSX | yes | in progress | +| Windows | some | in progress | ChromeOS and Linux are supported via BlueZ, see `*_bluez` files. --------------------------------------------------------------------------------- Maintainer History -------------------------------------------------------------------------------- @@ -41,7 +40,7 @@ Known future work is tracked in the [Refactoring meta issue](https://crbug.com/580406). --------------------------------------------------------------------------------- + Testing -------------------------------------------------------------------------------- @@ -93,7 +92,6 @@ https://chromium.googlesource.com/chromiumos/third_party/autotest/+/master/client/cros/bluetooth/ --------------------------------------------------------------------------------- Android --------------------------------------------------------------------------------
diff --git a/docs/mojo_in_chromium.md b/docs/mojo_in_chromium.md index fe9fda32..58ab08e 100644 --- a/docs/mojo_in_chromium.md +++ b/docs/mojo_in_chromium.md
@@ -1,986 +1,338 @@ # Mojo in Chromium -**THIS DOCUIMENT IS A WORK IN PROGRESS.** As long as this notice exists, you -should probably ignore everything below it. - This document is intended to serve as a Mojo primer for Chromium developers. No -prior knowledge of Mojo is assumed, but you should have a decent grasp of C++ -and be familiar with Chromium's multi-process architecture as well as common -concepts used throughout Chromium such as smart pointers, message loops, -callback binding, and so on. +prior knowledge of Mojo is assumed. [TOC] ## Should I Bother Reading This? If you're planning to build a Chromium feature that needs IPC and you aren't -already using Mojo, you probably want to read this. **Legacy IPC** -- _i.e._, -`foo_messages.h` files, message filters, and the suite of `IPC_MESSAGE_*` macros --- **is on the verge of deprecation.** +already using Mojo, YES! **Legacy IPC is deprecated.** ## Why Mojo? -Mojo provides IPC primitives for pushing messages and data around between -transferrable endpoints which may or may not cross process boundaries; it -simplifies threading with regard to IPC; it standardizes message serialization -in a way that's resilient to versioning issues; and it can be used with relative -ease and consistency across a number of languages including C++, Java, and -`JavaScript` -- all languages which comprise a significant share of Chromium -code. +TL;DR: The long-term intent is to refactor Chromium into a large set of smaller +services. -The messaging protocol doesn't strictly need to be used for IPC though, and -there are some higher-level reasons for this adoption and for the specific -approach to integration outlined in this document. +We can be smarter about: -### Code Health + * Which services we bring up or don't + * How we isolate these services to improve security and stability + * Which binary features we ship to one user or another -At the moment we have fairly weak separation between components, with DEPS being -the strongest line of defense against increasing complexity. +A more robust messaging layer opens the door for a number of interesting +possibilities; in particular it allows us to integrate a large number of +components without link-time interdependencies, and it breaks down the growing +number of interesting cross-language boundaries across the codebase. -A component Foo might hold a reference to some bit of component Bar's internal -state, or it might expect Bar to initialize said internal state in some -particular order. These sorts of problems are reasonably well-mitigated by the -code review process, but they can (and do) still slip through the cracks, and -they have a noticeable cumulative effect on complexity as the code base -continues to grow. - -We think we can make a lasting positive impact on code health by establishing -more concrete boundaries between components, and this is something a library -like Mojo gives us an opportunity to do. - -### Modularity - -In addition to code health -- which alone could be addressed in any number of -ways that don't involve Mojo -- this approach opens doors to build and -distribute parts of Chrome separately from the main binary. - -While we're not currently taking advantage of this capability, doing so remains -a long-term goal due to prohibitive binary size constraints in emerging mobile -markets. Many open questions around the feasibility of this goal should be -answered by the experimental Mandoline project as it unfolds, but the Chromium -project can be technically prepared for such a transition in the meantime. - -### Mandoline - -The Mandoline project is producing a potential replacement for `src/content`. -Because Mandoline components are Mojo apps, and Chromium is now capable of -loading Mojo apps (somethings we'll discuss later), Mojo apps can be shared -between both projects with minimal effort. Developing your feature as or within -a Mojo application can mean you're contributing to both Chromium and Mandoline. +Much has been learned from using Chromium IPC and maintaining Chromium +dependencies in anger over the past several years and we feel there's now a +significant opportunity to make life easier for developers, and to help them +build more and better features, faster, and with much less cost to users. ## Mojo Overview -This section provides a general overview of Mojo and some of its API features. -You can probably skip straight to -[Your First Mojo Application](#Your-First-Mojo-Application) if you just want to -get to some practical sample code. +The Mojo system API provides a small suite of low-level IPC primitives: +**message pipes**, **data pipes**, and **shared buffers**. On top of this API +we've built higher-level bindings APIs to simplify messaging for consumers +writing C++, Java, or JavaScript code. -The Mojo Embedder Development Kit (EDK) provides a suite of low-level IPC -primitives: **message pipes**, **data pipes**, and **shared buffers**. We'll -focus primarily on message pipes and the C++ bindings API in this document. - -_TODO: Java and JS bindings APIs should also be covered here._ +This document focuses primarily on using C++ bindings with message pipes, which +is likely to be the most common usage encountered by Chromium developers. ### Message Pipes -A message pipe is a lightweight primitive for reliable, bidirectional, queued -transfer of relatively small packets of data. Every pipe endpoint is identified -by a **handle** -- a unique process-wide integer identifying the endpoint to the -EDK. +A message pipe is a lightweight primitive for reliable bidirectional transfer of +relatively small packets of data. Unsurprisingly a pipe has two endpoints, and +either endpoint may be transferred over another message pipe. -A single message across a pipe consists of a binary payload and an array of zero -or more handles to be transferred. A pipe's endpoints may live in the same -process or in two different processes. +Because we bootstrap a primordial message pipe between the browser process and +each child process, this in turn means that you can create a new pipe and +ultimately send either end to any process, and the two ends will still be +able to talk to each other seamlessly and exclusively. Goodbye, routing IDs! -Pipes are easy to create. The `mojo::MessagePipe` type (see -`/third_party/mojo/src/mojo/public/cpp/system/message_pipe.h`) provides a nice -class wrapper with each endpoint represented as a scoped handle type (see -members `handle0` and `handle1` and the definition of -`mojo::ScopedMessagePipeHandle`). In the same header you can find -`WriteMessageRaw` and `ReadMessageRaw` definitions. These are in theory all one -needs to begin pushing things from one endpoint to the other. +While message pipes can carry arbitrary packets of unstructured data we +generally use them in conjunction with generated bindings to ensure a +consistent, well-defined, versioned message structure on all endpoints. -While it's worth being aware of `mojo::MessagePipe` and the associated raw I/O -functions, you will rarely if ever have a use for them. Instead you'll typically -use bindings code generated from mojom interface definitions, along with the -public bindings API which mostly hides the underlying pipes. +### Mojom -### Mojom Bindings +Mojom is the IDL for Mojo interfaces. Given a `.mojom` file, the bindings +generator outputs bindings for all three of the currently supported languages. -Mojom is the IDL for Mojo interfaces. When given a mojom file, the bindings -generator outputs a collection of bindings libraries for each supported -language. Mojom syntax is fairly straightforward (TODO: Link to a mojom language -spec?). Consider the example mojom file below: +For example: ``` -// frobinator.mojom -module frob; +// src/components/frob/public/interfaces/frobinator.mojom +module frob.mojom; + interface Frobinator { Frobinate(); }; ``` -This can be used to generate bindings for a very simple `Frobinator` interface. -Bindings are generated at build time and will match the location of the mojom -source file itself, mapped into the generated output directory for your Chromium -build. In this case one can expect to find files named `frobinator.mojom.js`, -`frobinator.mojom.cc`, `frobinator.mojom.h`, _etc._ +would generate the following outputs: -The C++ header (`frobinator.mojom.h`) generated from this mojom will define a -pure virtual class interface named `frob::Frobinator` with a pure virtual method -of signature `void Frobinate()`. Any class which implements this interface is -effectively a `Frobinator` service. - -### C++ Bindings API - -Before we see an example implementation and usage of the Frobinator, there are a -handful of interesting bits in the public C++ bindings API you should be -familiar with. These complement generated bindings code and generally obviate -any need to use a `mojo::MessagePipe` directly. - -In all of the cases below, `T` is the type of a generated bindings class -interface, such as the `frob::Frobinator` discussed above. - -#### `mojo::InterfacePtr<T>` - -Defined in `/third_party/mojo/src/mojo/public/cpp/bindings/interface_ptr.h`. - -`mojo::InterfacePtr<T>` is a typed proxy for a service of type `T`, which can be -bound to a message pipe endpoint. This class implements every interface method -on `T` by serializing a message (encoding the method call and its arguments) and -writing it to the pipe (if bound.) This is the standard way for C++ code to talk -to any Mojo service. - -For illustrative purposes only, we can create a message pipe and bind an -`InterfacePtr` to one end as follows: - -```cpp - mojo::MessagePipe pipe; - mojo::InterfacePtr<frob::Frobinator> frobinator; - frobinator.Bind( - mojo::InterfacePtrInfo<frob::Frobinator>(pipe.handle0.Pass(), 0u)); +``` +out/Debug/gen/components/frob/public/interfaces/frobinator.mojom.cc +out/Debug/gen/components/frob/public/interfaces/frobinator.mojom.h +out/Debug/gen/components/frob/public/interfaces/frobinator.mojom.js +out/Debug/gen/components/frob/public/interfaces/frobinator.mojom.srcjar +... ``` -You could then call `frobinator->Frobinate()` and read the encoded `Frobinate` -message from the other side of the pipe (`handle1`.) You most likely don't want -to do this though, because as you'll soon see there's a nicer way to establish -service pipes. +The generated code hides away all the details of serializing and deserializing +messages on either end of a pipe. -#### `mojo::InterfaceRequest<T>` +The C++ header (`frobinator.mojom.h`) defines an abstract class for each +mojom interface specified. Namespaces are derived from the `module` name. -Defined in `/third_party/mojo/src/mojo/public/cpp/bindings/interface_request.h`. +**NOTE:** Chromium convention for component `foo`'s module name is `foo.mojom`. +This means all mojom-generated C++ typenames for component `foo` will live in +the `foo::mojom` namespace to avoid collisions with non-generated typenames. -`mojo::InterfaceRequest<T>` is a typed container for a message pipe endpoint -that should _eventually_ be bound to a service implementation. An -`InterfaceRequest` doesn't actually _do_ anything, it's just a way of holding -onto an endpoint without losing interface type information. +In this example the generated `frob::mojom::Frobinator` has a single +pure virtual function: -A common usage pattern is to create a pipe, bind one end to an -`InterfacePtr<T>`, and pass the other end off to someone else (say, over some -other message pipe) who is expected to eventually bind it to a concrete service -implementation. `InterfaceRequest<T>` is here for that purpose and is, as we'll -see later, a first-class concept in Mojom interface definitions. - -As with `InterfacePtr<T>`, we can manually bind an `InterfaceRequest<T>` to a -pipe endpoint: - -```cpp -mojo::MessagePipe pipe; - -mojo::InterfacePtr<frob::Frobinator> frobinator; -frobinator.Bind( - mojo::InterfacePtrInfo<frob::Frobinator>(pipe.handle0.Pass(), 0u)); - -mojo::InterfaceRequest<frob::Frobinator> frobinator_request; -frobinator_request.Bind(pipe.handle1.Pass()); ``` +namespace frob { -At this point we could start making calls to `frobinator->Frobinate()` as -before, but they'll just sit in queue waiting for the request side to be bound. -Note that the basic logic in the snippet above is such a common pattern that -there's a convenient API function which does it for us. - -#### `mojo::GetProxy<T>` - -Defined in -`/third_party/mojo/src/mojo/public/cpp/bindings/interface`_request.h`. - -`mojo::GetProxy<T>` is the function you will most commonly use to create a new -message pipe. Its signature is as follows: - -```cpp -template <typename T> -mojo::InterfaceRequest<T> GetProxy(mojo::InterfacePtr<T>* ptr); -``` - -This function creates a new message pipe, binds one end to the given -`InterfacePtr` argument, and binds the other end to a new `InterfaceRequest` -which it then returns. Equivalent to the sample code just above is the following -snippet: - -```cpp - mojo::InterfacePtr<frob::Frobinator> frobinator; - mojo::InterfaceRequest<frob::Frobinator> frobinator_request = - mojo::GetProxy(&frobinator); -``` - -#### `mojo::Binding<T>` - -Defined in `/third_party/mojo/src/mojo/public/cpp/bindings/binding.h`. - -Binds one end of a message pipe to an implementation of service `T`. A message -sent from the other end of the pipe will be read and, if successfully decoded as -a `T` message, will invoke the corresponding call on the bound `T` -implementation. A `Binding<T>` must be constructed over an instance of `T` -(which itself usually owns said `Binding` object), and its bound pipe is usually -taken from a passed `InterfaceRequest<T>`. - -A common usage pattern looks something like this: - -```cpp -#include "components/frob/public/interfaces/frobinator.mojom.h" -#include "third_party/mojo/src/mojo/public/cpp/bindings/binding.h" -#include "third_party/mojo/src/mojo/public/cpp/bindings/interface_request.h" - -class FrobinatorImpl : public frob::Frobinator { +class Frobinator { public: - FrobinatorImpl(mojo::InterfaceRequest<frob::Frobinator> request) - : binding_(this, request.Pass()) {} + virtual void Frobinate() = 0; +}; + +} // namespace frob +``` + +To create a `Frobinator` service, one simply implements `foo::Frobinator` and +provides a means of binding pipes to it. + +### Binding to Pipes + +Let's look at some sample code: + +``` +// src/components/frob/frobinator_impl.cc + +#include "components/frob/public/interfaces/frobinator.mojom.h" +#include "mojo/public/cpp/bindings/binding.h" +#include "mojo/public/cpp/bindings/interface_request.h" + +namespace frob { + +class FrobinatorImpl : public mojom::Frobinator { + public: + FrobinatorImpl(mojo::InterfaceRequest<mojom::Frobinator> request) + : binding_(this, std::move(request)) {} ~FrobinatorImpl() override {} - private: - // frob::Frobinator: - void Frobinate() override { /* ... */ } + // mojom::Frobinator: + void Frobinate() override { DLOG(INFO) << "I can't stop frobinating!"; } - mojo::Binding<frob::Frobinator> binding_; + private: + mojo::Binding<mojom::Frobinator> binding_; }; + +} // namespace frob ``` -And then we could write some code to test this: +The first thing to note is that `mojo::Binding<T>` *binds* one end of a message +pipe to an implementation of a service. This means it watches that end of the +pipe for incoming messages; it knows how to decode messages for interface `T`, +and it dispatches them to methods on the bound `T` implementation. -```cpp -// Fun fact: The bindings generator emits a type alias like this for every -// interface type. frob::FrobinatorPtr is an InterfacePtr<frob::Frobinator>. -frob::FrobinatorPtr frobinator; -scoped_ptr<FrobinatorImpl> impl( - new FrobinatorImpl(mojo::GetProxy(&frobinator))); +`mojo::InterfaceRequest<T>` is essentially semantic sugar for a strongly-typed +message pipe endpoint. A common way to create new message pipes is via the +`GetProxy` call defined in `interface_request.h`: + +``` +mojom::FrobinatorPtr proxy; +mojo::InterfaceRequest<mojom::Frobinator> request = mojo::GetProxy(&proxy); +``` + +This creates a new message pipe with one end owned by `proxy` and the other end +owned by `request`. It has the nice property of attaching common type +information to each end of the pipe. + +Note that `InterfaceRequest<T>` doesn't actually **do** anything. It just scopes +a pipe endpoint and associates it with an interface type at compile time. As +such, other typed service binding primitives such as `mojo::Binding<T>` take +these objects as input when they need an endpoint to bind to. + +`mojom::FrobinatorPtr` is a generated type alias for +`mojo::InterfacePtr<mojom::Frobinator>`. An `InterfacePtr<T>` scopes a message +pipe endpoint as well, but it also internally implements every method on `T` by +serializing a corresponding message and writing it to the pipe. + +Hence we can put this together to talk to a `FrobinatorImpl` over a pipe: + +``` +frob:mojom::FrobinatorPtr frobinator; +frob::FrobinatorImpl impl(GetProxy(&frobinator)); + +// Tada! frobinator->Frobinate(); ``` -This will _eventually_ call `FrobinatorImpl::Frobinate()`. "Eventually," because -the sequence of events when `frobinator->Frobinate()` is called is roughly as -follows: +Behind the scenes this serializes a message corresponding to the `Frobinate` +request and writes it to one end of the pipe. Eventually (and incidentally, +very soon after), `impl`'s internal `mojo::Binding` will decode this message and +dispatch a call to `impl.Frobinate()`. -1. A new message buffer is allocated and filled with an encoded 'Frobinate' - message. -1. The EDK is asked to write this message to the pipe endpoint owned by the - `FrobinatorPtr`. -1. If the call didn't happen on the Mojo IPC thread for this process, EDK hops - to the Mojo IPC thread. -1. The EDK writes the message to the pipe. In this case the pipe endpoints live - in the same process, so this essentially a glorified `memcpy`. If they lived - in different processes this would be the point at which the data moved - across a real IPC channel. -1. The EDK on the other end of the pipe is awoken on the Mojo IPC thread and - alerted to the message arrival. -1. The EDK reads the message. -1. If the bound receiver doesn't live on the Mojo IPC thread, the EDK hops to - the receiver's thread. -1. The message is passed on to the receiver. In this case the receiver is - generated bindings code, via `Binding<T>`. This code decodes and validates - the `Frobinate` message. -1. `FrobinatorImpl::Frobinate()` is called on the bound implementation. +### Responding to Requests -So as you can see, the call to `Frobinate()` may result in up to two thread hops -and one process hop before the service implementation is invoked. +A common idiom in Chromium IPC is to keep track of IPC requests with some kind +of opaque identifier (i.e. an integer *request ID*) so that you can later +respond to a specific request using some nominally related message in the other +direction. -#### `mojo::StrongBinding<T>` - -Defined in `third_party/mojo/src/mojo/public/cpp/bindings/strong_binding.h`. - -`mojo::StrongBinding<T>` is just like `mojo::Binding<T>` with the exception that -a `StrongBinding` takes ownership of the bound `T` instance. The instance is -destroyed whenever the bound message pipe is closed. This is convenient in cases -where you want a service implementation to live as long as the pipe it's -servicing, but like all features with clever lifetime semantics, it should be -used with caution. - -## The Mojo Shell - -Both Chromium and Mandoline run a central **shell** component which is used to -coordinate communication among all Mojo applications (see the next section for -an overview of Mojo applications.) - -Every application receives a proxy to this shell upon initialization, and it is -exclusively through this proxy that an application can request connections to -other applications. The `mojo::Shell` interface provided by this proxy is -defined as follows: +This is baked into mojom interface definitions. We can extend our `Frobinator` +service like so: ``` -module mojo; -interface Shell { - ConnectToApplication(URLRequest application_url, - ServiceProvider&? services, - ServiceProvider? exposed_services); - QuitApplication(); +module frob.mojom; + +interface Frobinator { + Frobinate(); + GetFrobinationLevels() => (int min, int max); }; ``` -and as for the `mojo::ServiceProvider` interface: +and update our implementation: ``` -module mojo; -interface ServiceProvider { - ConnectToService(string interface_name, handle<message_pipe> pipe); -}; -``` - -Definitions for these interfaces can be found in -`/mojo/shell/public/interfaces`. Also note that `mojo::URLRequest` is a -Mojo struct defined in -`/mojo/services/network/public/interfaces/url_loader.mojom`. - -Note that there's some new syntax in the mojom for `ConnectToApplication` above. -The '?' signifies a nullable value and the '&' signifies an interface request -rather than an interface proxy. - -The argument `ServiceProvider&? services` indicates that the caller should pass -an `InterfaceRequest<ServiceProvider>` as the second argument, but that it need -not be bound to a pipe (i.e., it can be "null" in which case it's ignored.) - -The argument `ServiceProvider? exposed_services` indicates that the caller -should pass an `InterfacePtr<ServiceProvider>` as the third argument, but that -it may also be null. - -`ConnectToApplication` asks the shell to establish a connection between the -caller and some other app the shell might know about. In the event that a -connection can be established -- which may involve the shell starting a new -instance of the target app -- the given `services` request (if not null) will be -bound to a service provider in the target app. The target app may in turn use -the passed `exposed_services` proxy (if not null) to request services from the -connecting app. - -### Mojo Applications - -All code which runs in a Mojo environment, apart from the shell itself (see -above), belongs to one Mojo **application** or another**`**`**. The term -"application" in this context is a common source of confusion, but it's really a -simple concept. In essence an application is anything which implements the -following Mojom interface: - -``` -module mojo; -interface Application { - Initialize(Shell shell, string url); - AcceptConnection(string requestor_url, - ServiceProvider&? services, - ServiceProvider? exposed_services, - string resolved_url); - OnQuitRequested() => (bool can_quit); -}; -``` - -Of course, in Chromium and Mandoline environments this interface is obscured -from application code and applications should generally just implement -`mojo::ApplicationDelegate` (defined in -`/mojo/shell/public/cpp/application_delegate.h`.) We'll see a concrete -example of this in the next section, -[Your First Mojo Application](#Your-First-Mojo-Application). - -The takeaway here is that an application can be anything. It's not necessarily a -new process (though at the moment, it's at least a new thread). Applications can -connect to each other, and these connections are the mechanism through which -separate components expose services to each other. - -**NOTE##: This is not true in Chromium today, but it should be eventually. For -some components (like render frames, or arbitrary browser process code) we -provide APIs which allow non-Mojo-app-code to masquerade as a Mojo app and -therefore connect to real Mojo apps through the shell. - -### Other IPC Primitives - -Finally, it's worth making brief mention of the other types of IPC primitives -Mojo provides apart from message pipes. A **data pipe** is a unidirectional -channel for pushing around raw data in bulk, and a **shared buffer** is -(unsurprisingly) a shared memory primitive. Both of these objects use the same -type of transferable handle as message pipe endpoints, and can therefore be -transferred across message pipes, potentially to other processes. - -## Your First Mojo Application - -In this section, we're going to build a simple Mojo application that can be run -in isolation using Mandoline's `mojo_runner` binary. After that we'll add a -service to the app and set up a test suite to connect and test that service. - -### Hello, world! - -So, you're building a new Mojo app and it has to live somewhere. For the -foreseeable future we'll likely be treating `//components` as a sort of -top-level home for new Mojo apps in the Chromium tree. Any component application -you build should probably go there. Let's create some basic files to kick things -off. You may want to start a new local Git branch to isolate any changes you -make while working through this. - -First create a new `//components/hello` directory. Inside this directory we're -going to add the following files: - -**components/hello/main.cc** - -```cpp -#include "base/logging.h" -#include "third_party/mojo/src/mojo/public/c/system/main.h" - -MojoResult MojoMain(MojoHandle shell_handle) { - LOG(ERROR) << "Hello, world!"; - return MOJO_RESULT_OK; -}; -``` - -**components/hello/BUILD.gn** - -``` -import("//mojo/public/mojo_application.gni") - -mojo_native_application("hello") { - sources = [ - "main.cc", - ] - deps = [ - "//base", - "//mojo/environment:chromium", - ] -} -``` - -For the sake of this example you'll also want to add your component as a -dependency somewhere in your local checkout to ensure its build files are -generated. The easiest thing to do there is probably to add a dependency on -`"//components/hello"` in the `"gn_all"` target of the top-level `//BUILD.gn`. - -Assuming you have a GN output directory at `out_gn/Debug`, you can build the -Mojo runner along with your shiny new app: - - ninja -C out_gn/Debug mojo_runner components/hello - -In addition to the `mojo_runner` executable, this will produce a new binary at -`out_gn/Debug/hello/hello.mojo`. This binary is essentially a shared library -which exports your `MojoMain` function. - -`mojo_runner` takes an application URL as its only argument and runs the -corresponding application. In its current state it resolves `mojo`-scheme URLs -such that `"mojo:foo"` maps to the file `"foo/foo.mojo"` relative to the -`mojo_runner` path (_i.e._ your output directory.) This means you can run your -new app with the following command: - - out_gn/Debug/mojo_runner mojo:hello - -You should see our little `"Hello, world!"` error log followed by a hanging -application. You can `^C` to kill it. - -### Exposing Services - -An app that prints `"Hello, world!"` isn't terribly interesting. At a bare -minimum your app should implement `mojo::ApplicationDelegate` and expose at -least one service to connecting applications. - -Let's update `main.cc` with the following contents: - -**components/hello/main.cc** - -```cpp -#include "components/hello/hello_app.h" -#include "mojo/shell/public/cpp/application_runner.h" -#include "third_party/mojo/src/mojo/public/c/system/main.h" - -MojoResult MojoMain(MojoHandle shell_handle) { - mojo::ApplicationRunner runner(new hello::HelloApp); - return runner.Run(shell_handle); -}; -``` - -This is a pretty typical looking `MojoMain`. Most of the time this is all you -want -- a `mojo::ApplicationRunner` constructed over a -`mojo::ApplicationDelegate` instance, `Run()` with the pipe handle received from -the shell. We'll add some new files to the app as well: - -**components/hello/public/interfaces/greeter.mojom** - -``` -module hello; -interface Greeter { - Greet(string name) => (string greeting); -}; -``` - -Note the new arrow syntax on the `Greet` method. This indicates that the caller -expects a response from the service. - -**components/hello/public/interfaces/BUILD.gn** - -``` -import("//third_party/mojo/src/mojo/public/tools/bindings/mojom.gni") - -mojom("interfaces") { - sources = [ - "greeter.mojom", - ] -} -``` - -**components/hello/hello_app.h** - -```cpp -#ifndef COMPONENTS_HELLO_HELLO_APP_H_ -#define COMPONENTS_HELLO_HELLO_APP_H_ - -#include "base/macros.h" -#include "components/hello/public/interfaces/greeter.mojom.h" -#include "mojo/shell/public/cpp/application_delegate.h" -#include "mojo/shell/public/cpp/interface_factory.h" - -namespace hello { - -class HelloApp : public mojo::ApplicationDelegate, - public mojo::InterfaceFactory<Greeter> { +class FrobinatorImpl : public mojom::Frobinator { public: - HelloApp(); - ~HelloApp() override; + // ... - private: - // mojo::ApplicationDelegate: - bool ConfigureIncomingConnection( - mojo::ApplicationConnection* connection) override; - - // mojo::InterfaceFactory<Greeter>: - void Create(mojo::ApplicationConnection* connection, - mojo::InterfaceRequest<Greeter> request) override; - - DISALLOW_COPY_AND_ASSIGN(HelloApp); + // mojom::Frobinator: + void Frobinate() override { /* ... */ } + void GetFrobinationLevels(const GetFrobinationLevelsCallback& callback) { + callback.Run(1, 42); + } }; - -} // namespace hello - -#endif // COMPONENTS_HELLO_HELLO_APP_H_ ``` +When the service implementation runs `callback`, the response arguments are +serialized and sent back over the pipe. The proxy on the other end knows how to +read this response and will in turn dispatch it to a callback on that end: -**components/hello/hello_app.cc** +``` +void ShowLevels(int min, int max) { + DLOG(INFO) << "Frobinator min=" << min << " max=" << max; +} -```cpp +// ... + + mojom::FrobinatorPtr frobinator; + FrobinatorImpl impl(GetProxy(&frobinator)); + + frobinator->GetFrobinatorLevels(base::Bind(&ShowLevels)); +``` + +This does what you'd expect. + +## Exposing Services in Chromium + +There are a number of ways one might expose services across various surfaces of +the browser. One common approach now is to use a +[`content::ServiceRegistry` (link)](https://goo.gl/uEhx06). These come in +pairs generally spanning a process boundary, and they provide primitive service +registration and connection interfaces. For one example, [every +`RenderFrameHost` has a `ServiceRegistry`](https://goo.gl/4YR3j5), as does +[every corresponding `RenderFrame`](https://goo.gl/YhrgXa). These registries are +intertwined. + +The gist is that you can add a service to the local side of the registry -- it's +just a mapping from interface name to factory function -- or you can connect by +name to services registered on the remote side. + +**NOTE:** In this context the "factory function" is simply a callback which +takes a pipe endpoint and does something with it. It's expected that you'll +either bind it to a service implementation of some kind or you will close it, effectively rejecting the connection request. + +We can build a simple browser-side `FrobinatorImpl` service that has access to a +`BrowserContext` for any frame which connects to it: + +``` #include "base/macros.h" -#include "components/hello/hello_app.h" -#include "mojo/shell/public/cpp/application_connection.h" -#include "third_party/mojo/src/mojo/public/cpp/bindings/interface_request.h" -#include "third_party/mojo/src/mojo/public/cpp/bindings/strong_binding.h" +#include "components/frob/public/interfaces/frobinator.mojom.h" +#include "content/public/browser/browser_context.h" +#inlcude "mojo/public/cpp/system/interface_request.h" +#inlcude "mojo/public/cpp/system/message_pipe.h" +#inlcude "mojo/public/cpp/system/strong_binding.h" -namespace hello { +namespace frob { -namespace { - -class GreeterImpl : public Greeter { +class FrobinatorImpl : public mojom::Frobinator { public: - GreeterImpl(mojo::InterfaceRequest<Greeter> request) - : binding_(this, request.Pass()) { + FrobinatorImpl(content::BrowserContext* context, + mojo::InterfaceRequest<mojom::Frobinator> request) + : context_(context), binding_(this, std::move(request)) {} + ~FrobinatorImpl() override {} + + // A factory function to use in conjunction with ServiceRegistry. + static void Create(content::BrowserContext* context, + mojo::InterfaceRequest<mojom::Frobinator> request) { + // See comment below for why this doesn't leak. + new FrobinatorImpl(context, + mojo::MakeRequest<mojom::Frobinator>(std::move(pipe))); } - ~GreeterImpl() override {} - private: - // Greeter: - void Greet(const mojo::String& name, const GreetCallback& callback) override { - callback.Run("Hello, " + std::string(name) + "!"); - } + // mojom::Frobinator: + void Frobinate() override { /* ... */ } - mojo::StrongBinding<Greeter> binding_; + content::BrowserContext* context_; - DISALLOW_COPY_AND_ASSIGN(GreeterImpl); + // A StrongBinding is just like a Binding, except that it takes ownership of + // its bound implementation and deletes itself (and the impl) if and when the + // bound pipe encounters an error or is closed on the other end. + mojo::StrongBinding<mojom::Frobinator> binding_; + + DISALLOW_COPY_AND_ASSIGN(FrobinatorImpl); }; -} // namespace - -HelloApp::HelloApp() { -} - -HelloApp::~HelloApp() { -} - -bool HelloApp::ConfigureIncomingConnection( - mojo::ApplicationConnection* connection) { - connection->AddService<Greeter>(this); - return true; -} - -void HelloApp::Create( - mojo::ApplicationConnection* connection, - mojo::InterfaceRequest<Greeter> request) { - new GreeterImpl(request.Pass()); -} - -} // namespace hello +} // namespace frob ``` -And finally we need to update our app's `BUILD.gn` to add some new sources and -dependencies: - -**components/hello/BUILD.gn** +Now somewhere in the browser we register the Frobinator service with each +`RenderFrameHost` ([this](https://goo.gl/HEFn63) is a popular spot): ``` -import("//mojo/public/mojo_application.gni") - -source_set("lib") { - sources = [ - "hello_app.cc", - "hello_app.h", - ] - deps = [ - "//base", - "//components/hello/public/interfaces", - "//mojo/environment:chromium", - "//mojo/shell/public/cpp", - ] -} - -mojo_native_application("hello") { - sources = [ - "main.cc", - ], - deps = [ ":lib" ] -} +frame_host->GetServiceRegistry()->AddService<frob::mojom::Frobinator>( + base::Bind( + &frob::FrobinatorImpl::Create, + base::Unretained(frame_host->GetProcess()->GetBrowserContext()))); ``` -Note that we build the bulk of our application sources as a static library -separate from the `MojoMain` definition. Following this convention is -particularly useful for Chromium integration, as we'll see later. - -There's a lot going on here and it would be useful to familiarize yourself with -the definitions of `mojo::ApplicationDelegate`, `mojo::ApplicationConnection`, -and `mojo::InterfaceFactory<T>`. The TL;DR though is that if someone connects to -this app and requests a service named `"hello::Greeter"`, the app will create a -new `GreeterImpl` and bind it to that request pipe. From there the connecting -app can call `Greeter` interface methods and they'll be routed to that -`GreeterImpl` instance. - -Although this appears to be a more interesting application, we need some way to -actually connect and test the behavior of our new service. Let's write an app -test! - -### App Tests - -App tests run inside a test application, giving test code access to a shell -which can connect to one or more applications-under-test. - -First let's introduce some test code: - -**components/hello/hello_apptest.cc** - -```cpp -#include "base/bind.h" -#include "base/callback.h" -#include "base/logging.h" -#include "base/macros.h" -#include "base/run_loop.h" -#include "components/hello/public/interfaces/greeter.mojom.h" -#include "mojo/shell/public/cpp/application_impl.h" -#include "mojo/shell/public/cpp/application_test_base.h" - -namespace hello { -namespace { - -class HelloAppTest : public mojo::test::ApplicationTestBase { - public: - HelloAppTest() {} - ~HelloAppTest() override {} - - void SetUp() override { - ApplicationTestBase::SetUp(); - mojo::URLRequestPtr app_url = mojo::URLRequest::New(); - app_url->url = "mojo:hello"; - application_impl()->ConnectToService(app_url.Pass(), &greeter_); - } - - Greeter* greeter() { return greeter_.get(); } - - private: - GreeterPtr greeter_; - - DISALLOW_COPY_AND_ASSIGN(HelloAppTest); -}; - -void ExpectGreeting(const mojo::String& expected_greeting, - const base::Closure& continuation, - const mojo::String& actual_greeting) { - EXPECT_EQ(expected_greeting, actual_greeting); - continuation.Run(); -}; - -TEST_F(HelloAppTest, GreetWorld) { - base::RunLoop loop; - greeter()->Greet("world", base::Bind(&ExpectGreeting, "Hello, world!", - loop.QuitClosure())); - loop.Run(); -} - -} // namespace -} // namespace hello -``` - -We also need to add a new rule to `//components/hello/BUILD.gn`: +And in the render process we can now do something like: ``` -mojo_native_application("apptests") { - output_name = "hello_apptests" - testonly = true - sources = [ - "hello_apptest.cc", - ] - deps = [ - "//base", - "//mojo/shell/public/cpp:test_support", - ] - public_deps = [ - "//components/hello/public/interfaces", - ] - data_deps = [ ":hello" ] -} +mojom::FrobinatorPtr frobinator; +render_frame->GetServiceRegistry()->ConnectToRemoteService( + mojo::GetProxy(&frobinator)); + +// It's IPC! +frobinator->Frobinate(); ``` -Note that the `//components/hello:apptests` target does **not** have a binary -dependency on either `HelloApp` or `GreeterImpl` implementations; instead it -depends only on the component's public interface definitions. +There are now plenty of concrete examples of Mojo usage in the Chromium tree. +Poke around at existing mojom files and see how their implementions are built +and connected. -The `data_deps` entry ensures that `hello.mojo` is up-to-date when `apptests` is -built. This is desirable because the test connects to `"mojo:hello"` which will -in turn load `hello.mojo` from disk. +## Mojo in Blink -You can now build the test suite: +*TODO* - ninja -C out_gn/Debug components/hello:apptests +This is a work in progress. TL;DR: We'll also soon begin using Mojo services +from Blink so that the platform layer can consume browser services +directly via Mojo. The long-term goal there is to eliminate `content/renderer`. -and run it: +## Questions, Discussion, etc. - out_gn/Debug/mojo_runner mojo:hello_apptests - -You should see one test (`HelloAppTest.GreetWorld`) passing. - -One particularly interesting bit of code in this test is in the `SetUp` method: - - mojo::URLRequestPtr app_url = mojo::URLRequest::New(); - app_url->url = "mojo:hello"; - application_impl()->ConnectToService(app_url.Pass(), &greeter_); - -`ConnectToService` is a convenience method provided by `mojo::ApplicationImpl`, -and it's essentially a shortcut for calling out to the shell's -`ConnectToApplication` method with the given application URL (in this case -`"mojo:hello"`) and then connecting to a specific service provided by that app -via its `ServiceProvider`'s `ConnectToService` method. - -Note that generated interface bindings include a constant string to identify -each interface by name; so for example the generated `hello::Greeter` type -defines a static C string: - - const char hello::Greeter::Name_[] = "hello::Greeter"; - -This is exploited by the definition of -`mojo::ApplicationConnection::ConnectToService<T>`, which uses `T::Name_` as the -name of the service to connect to. The type `T` in this context is inferred from -the `InterfacePtr<T>*` argument. You can inspect the definition of -`ConnectToService` in `/mojo/shell/public/cpp/application_connection.h` -for additional clarity. - -We could have instead written this code as: - -```cpp -mojo::URLRequestPtr app_url = mojo::URLRequest::New(); -app_url->url = "mojo::hello"; - -mojo::ServiceProviderPtr services; -application_impl()->shell()->ConnectToApplication( - app_url.Pass(), mojo::GetProxy(&services), - // We pass a null provider since we aren't exposing any of our own - // services to the target app. - mojo::ServiceProviderPtr()); - -mojo::InterfaceRequest<hello::Greeter> greeter_request = - mojo::GetProxy(&greeter_); -services->ConnectToService(hello::Greeter::Name_, - greeter_request.PassMessagePipe()); -``` - -The net result is the same, but 3-line version seems much nicer. - -## Chromium Integration - -Up until now we've been using `mojo_runner` to load and run `.mojo` binaries -dynamically. While this model is used by Mandoline and may eventually be used in -Chromium as well, Chromium is at the moment confined to running statically -linked application code. This means we need some way to register applications -with the browser's Mojo shell. - -It also means that, rather than using the binary output of a -`mojo_native_application` target, some part of Chromium must link against the -app's static library target (_e.g._, `"//components/hello:lib"`) and register a -URL handler to teach the shell how to launch an instance of the app. - -When registering an app URL in Chromium it probably makes sense to use the same -mojo-scheme URL used for the app in Mandoline. For example the media renderer -app is referenced by the `"mojo:media"` URL in both Mandoline and Chromium. In -Mandoline this resolves to a dynamically-loaded `.mojo` binary on disk, but in -Chromium it resolves to a static application loader linked into Chromium. The -net result is the same in both cases: other apps can use the shell to connect to -`"mojo:media"` and use its services. - -This section explores different ways to register and connect to `"mojo:hello"` -in Chromium. - -### In-Process Applications - -Applications can be set up to run within the browser process via -`ContentBrowserClient::RegisterInProcessMojoApplications`. This method populates -a mapping from URL to `base::Callback<scoped_ptr<mojo::ApplicationDelegate>()>` -(_i.e._, a factory function which creates a new `mojo::ApplicationDelegate` -instance), so registering a new app means adding an entry to this map. - -Let's modify `ChromeContentBrowserClient::RegisterInProcessMojoApplications` -(in `//chrome/browser/chrome_content_browser_client.cc`) by adding the following -code: - -```cpp -apps->insert(std::make_pair(GURL("mojo:hello"), - base::Bind(&HelloApp::CreateApp))); -``` - -you'll also want to add the following convenience method to your `HelloApp` -definition in `//components/hello/hello_app.h`: - -```cpp -static scoped_ptr<mojo::ApplicationDelegate> HelloApp::CreateApp() { - return scoped_ptr<mojo::ApplicationDelegate>(new HelloApp); -} -``` - -This introduces a dependency from `//chrome/browser` on to -`//components/hello:lib`, which you can add to the `"browser"` target's deps in -`//chrome/browser/BUILD.gn`. You'll of course also need to include -`"components/hello/hello_app.h"` in `chrome_content_browser_client.cc`. - -That's it! Now if an app comes to the shell asking to connect to `"mojo:hello"` -and app is already running, it'll get connected to our `HelloApp` and have -access to the `Greeter` service. If the app wasn't already running, it will -first be launched on a new thread. - -### Connecting From the Browser - -We've already seen how apps can connect to each other using their own private -shell proxy, but the vast majority of Chromium code doesn't yet belong to a Mojo -application. So how do we use an app's services from arbitrary browser code? We -use `content::MojoAppConnection`, like this: - -```cpp -#include "base/bind.h" -#include "base/logging.h" -#include "components/hello/public/interfaces/greeter.mojom.h" -#include "content/public/browser/mojo_app_connection.h" - -void LogGreeting(const mojo::String& greeting) { - LOG(INFO) << greeting; -} - -void GreetTheWorld() { - scoped_ptr<content::MojoAppConnection> connection = - content::MojoAppConnection::Create("mojo:hello", - content::kBrowserMojoAppUrl); - hello::GreeterPtr greeter; - connection->ConnectToService(&greeter); - greeter->Greet("world", base::Bind(&LogGreeting)); -} -``` - -A `content::MojoAppConnection`, while not thread-safe, may be created and safely -used on any single browser thread. - -You could add the above code to a new browsertest to convince yourself that it -works. In fact you might want to take a peek at -`MojoShellTest.TestBrowserConnection` (in -`/content/browser/mojo_shell_browsertest.cc`) which registers and tests an -in-process Mojo app. - -Finally, note that `MojoAppConnection::Create` takes two URLs. The first is the -target app URL, and the second is the source URL. Since we're not really a Mojo -app, but we are still trusted browser code, the shell will gladly use this URL -as the `requestor_url` when establishing an incoming connection to the target -app. This allows browser code to masquerade as a Mojo app at the given URL. -`content::kBrowserMojoAppUrl` (which is presently `"system:content_browser"`) is -a reasonable default choice when a more specific app identity isn't required. - -### Out-of-Process Applications - -If an app URL isn't registered for in-process loading, the shell assumes it must -be an out-of-process application. If the shell doesn't already have a known -instance of the app running, a new utility process is launched and the -application request is passed onto it. Then if the app URL is registered in the -utility process, the app will be loaded there. - -Similar to in-process registration, a URL mapping needs to be registered in -`ContentUtilityClient::RegisterMojoApplications`. - -Once again you can take a peek at `/content/browser/mojo_shell_browsertest.cc` -for an end-to-end example of testing an out-of-process Mojo app from browser -code. Note that `content_browsertests` runs on `content_shell`, which uses -`ShellContentUtilityClient` as defined -`/content/shell/utility/shell_content_utility_client.cc`. This code registers a -common OOP test app. - -## Unsandboxed Out-of-Process Applications - -By default new utility processes run in a sandbox. If you want your Mojo app to -run out-of-process and unsandboxed (which you **probably do not**), you can -register its URL via -`ContentBrowserClient::RegisterUnsandboxedOutOfProcessMojoApplications`. - -## Connecting From `RenderFrame` - -We can also connect to Mojo apps from a `RenderFrame`. This is made possible by -`RenderFrame`'s `GetServiceRegistry()` interface. The `ServiceRegistry` can be -used to acquire a shell proxy and in turn connect to an app like so: - -```cpp -void GreetWorld(content::RenderFrame* frame) { - mojo::ShellPtr shell; - frame->GetServiceRegistry()->ConnectToRemoteService( - mojo::GetProxy(&shell)); - - mojo::URLRequestPtr request = mojo::URLRequest::New(); - request->url = "mojo:hello"; - - mojo::ServiceProviderPtr hello_services; - shell->ConnectToApplication( - request.Pass(), mojo::GetProxy(&hello_services), nullptr); - - hello::GreeterPtr greeter; - hello_services->ConnectToService( - hello::Greeter::Name_, mojo::GetProxy(&greeter).PassMessagePipe()); -} -``` - -It's important to note that connections made through the frame's shell proxy -will appear to come from the frame's `SiteInstance` URL. For example, if the -frame has loaded `https://example.com/`, `HelloApp`'s incoming -`mojo::ApplicationConnection` in this case will have a remote application URL of -`"https://example.com/"`. This allows apps to expose their services to web -frames on a per-origin basis if needed. - -### Connecting From Java - -TODO - -### Connecting From `JavaScript` - -This is still a work in progress and might not really take shape until the -Blink+Chromium merge. In the meantime there are some end-to-end WebUI examples -in `/content/browser/webui/web_ui_mojo_browsertest.cc`. In particular, -`WebUIMojoTest.ConnectToApplication` connects from a WebUI frame to a test app -running in a new utility process. - -## FAQ - -Nothing here yet! +A good place to find highly concentrated doses of people who know and care +about Mojo in Chromium would be the [chromium-mojo](https://goo.gl/A4ebWB) +mailing list[.](https://goo.gl/L70ihQ)
diff --git a/extensions/browser/api/serial/serial_api.cc b/extensions/browser/api/serial/serial_api.cc index d80008e4..0d477be 100644 --- a/extensions/browser/api/serial/serial_api.cc +++ b/extensions/browser/api/serial/serial_api.cc
@@ -86,14 +86,11 @@ void SerialGetDevicesFunction::Work() { DCHECK_CURRENTLY_ON(BrowserThread::FILE); -// TODO(moshayedi): crbug.com/549257. Add USB support for Aura on Android. -#if !defined(OS_ANDROID) scoped_ptr<device::SerialDeviceEnumerator> enumerator = device::SerialDeviceEnumerator::Create(); mojo::Array<device::serial::DeviceInfoPtr> devices = enumerator->GetDevices(); results_ = serial::GetDevices::Results::Create( devices.To<std::vector<linked_ptr<serial::DeviceInfo> > >()); -#endif } SerialConnectFunction::SerialConnectFunction() {
diff --git a/extensions/browser/guest_view/web_view/web_view_guest.cc b/extensions/browser/guest_view/web_view/web_view_guest.cc index 1b146fa..d692e02d 100644 --- a/extensions/browser/guest_view/web_view/web_view_guest.cc +++ b/extensions/browser/guest_view/web_view/web_view_guest.cc
@@ -134,9 +134,6 @@ #endif case base::TERMINATION_STATUS_PROCESS_WAS_KILLED: return "killed"; -#if defined(OS_ANDROID) - case base::TERMINATION_STATUS_OOM_PROTECTED: -#endif case base::TERMINATION_STATUS_PROCESS_CRASHED: return "crashed"; case base::TERMINATION_STATUS_LAUNCH_FAILED:
diff --git a/extensions/common/BUILD.gn b/extensions/common/BUILD.gn index 4f5496ad..b0f40b5 100644 --- a/extensions/common/BUILD.gn +++ b/extensions/common/BUILD.gn
@@ -71,15 +71,6 @@ "//url", ] - if (is_android) { - deps -= [ "//device/usb" ] - sources -= [ - "api/printer_provider/usb_printer_manifest_data.cc", - "api/printer_provider/usb_printer_manifest_data.h", - "api/printer_provider/usb_printer_manifest_handler.cc", - ] - } - if (enable_nacl) { nacl_sources = rebase_path(extensions_gypi_values.extensions_common_sources_nacl,
diff --git a/extensions/common/api/printer_provider/usb_printer_manifest_handler_android.cc b/extensions/common/api/printer_provider/usb_printer_manifest_handler_android.cc deleted file mode 100644 index 88861c4b..0000000 --- a/extensions/common/api/printer_provider/usb_printer_manifest_handler_android.cc +++ /dev/null
@@ -1,26 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "extensions/common/api/printer_provider/usb_printer_manifest_handler.h" - -#include "extensions/common/extension.h" - -namespace extensions { - -UsbPrinterManifestHandler::UsbPrinterManifestHandler() { -} - -UsbPrinterManifestHandler::~UsbPrinterManifestHandler() { -} - -bool UsbPrinterManifestHandler::Parse(Extension* extension, - base::string16* error) { - return false; -} - -const std::vector<std::string> UsbPrinterManifestHandler::Keys() const { - return std::vector<std::string>(); -} - -} // namespace extensions
diff --git a/extensions/extensions.gypi b/extensions/extensions.gypi index 6049ecb..9128d49 100644 --- a/extensions/extensions.gypi +++ b/extensions/extensions.gypi
@@ -30,7 +30,6 @@ 'common/api/printer_provider/usb_printer_manifest_data.cc', 'common/api/printer_provider/usb_printer_manifest_data.h', 'common/api/printer_provider/usb_printer_manifest_handler.cc', - 'common/api/printer_provider/usb_printer_manifest_handler_android.cc', 'common/api/printer_provider/usb_printer_manifest_handler.h', 'common/api/sockets/sockets_manifest_data.cc', 'common/api/sockets/sockets_manifest_data.h',
diff --git a/google_apis/gaia/gaia_auth_consumer.h b/google_apis/gaia/gaia_auth_consumer.h index b8f70df6..242e58d 100644 --- a/google_apis/gaia/gaia_auth_consumer.h +++ b/google_apis/gaia/gaia_auth_consumer.h
@@ -69,6 +69,7 @@ virtual void OnIssueAuthTokenFailure(const std::string& service, const GoogleServiceAuthError& error) {} + virtual void OnClientOAuthCode(const std::string& auth_code) {} virtual void OnClientOAuthSuccess(const ClientOAuthResult& result) {} virtual void OnClientOAuthFailure(const GoogleServiceAuthError& error) {}
diff --git a/google_apis/gaia/gaia_auth_fetcher.cc b/google_apis/gaia/gaia_auth_fetcher.cc index c807e13..d614cd4 100644 --- a/google_apis/gaia/gaia_auth_fetcher.cc +++ b/google_apis/gaia/gaia_auth_fetcher.cc
@@ -182,8 +182,7 @@ GaiaUrls::GetInstance()->GetCheckConnectionInfoURLWithSource(source)), oauth2_iframe_url_(GaiaUrls::GetInstance()->oauth2_iframe_url()), client_login_to_oauth2_gurl_( - GaiaUrls::GetInstance()->client_login_to_oauth2_url()), - fetch_pending_(false) { + GaiaUrls::GetInstance()->client_login_to_oauth2_url()) { } GaiaAuthFetcher::~GaiaAuthFetcher() {} @@ -526,14 +525,25 @@ void GaiaAuthFetcher::StartCookieForOAuthLoginTokenExchangeWithDeviceId( const std::string& session_index, const std::string& device_id) { + StartCookieForOAuthLoginTokenExchange( + true, + session_index, + GaiaUrls::GetInstance()->oauth2_chrome_client_id(), + device_id); +} + +void GaiaAuthFetcher::StartCookieForOAuthLoginTokenExchange( + bool fetch_token_from_auth_code, + const std::string& session_index, + const std::string& client_id, + const std::string& device_id) { DCHECK(!fetch_pending_) << "Tried to fetch two things at once!"; VLOG(1) << "Starting OAuth login token fetch with cookie jar"; std::string encoded_scope = net::EscapeUrlEncodedData( GaiaConstants::kOAuth1LoginScope, true); - std::string encoded_client_id = net::EscapeUrlEncodedData( - GaiaUrls::GetInstance()->oauth2_chrome_client_id(), true); + std::string encoded_client_id = net::EscapeUrlEncodedData(client_id, true); std::string query_string = base::StringPrintf(kClientLoginToOAuth2URLFormat, encoded_scope.c_str(), encoded_client_id.c_str()); @@ -548,6 +558,7 @@ base::StringPrintf(kDeviceIdHeaderFormat, device_id.c_str()); } + fetch_token_from_auth_code_ = fetch_token_from_auth_code; CreateAndStartGaiaFetcher(std::string(), device_id_header, client_login_to_oauth2_gurl_.Resolve(query_string), net::LOAD_NORMAL); @@ -738,7 +749,10 @@ if (status.is_success() && response_code == net::HTTP_OK) { std::string auth_code; if (ParseClientLoginToOAuth2Response(cookies, &auth_code)) { - StartAuthCodeForOAuth2TokenExchange(auth_code); + if (fetch_token_from_auth_code_) + StartAuthCodeForOAuth2TokenExchange(auth_code); + else + consumer_->OnClientOAuthCode(auth_code); } else { GoogleServiceAuthError auth_error( GoogleServiceAuthError::FromUnexpectedServiceResponse(
diff --git a/google_apis/gaia/gaia_auth_fetcher.h b/google_apis/gaia/gaia_auth_fetcher.h index 9c877b6e..b477913 100644 --- a/google_apis/gaia/gaia_auth_fetcher.h +++ b/google_apis/gaia/gaia_auth_fetcher.h
@@ -104,6 +104,24 @@ const std::string& session_index, const std::string& device_id); + // Start a request to exchange the cookies of a signed-in user session + // and for specified client for an OAuthLogin-scoped oauth2 token. Client is + // determined by its |client_id|. In the case of a session with multiple + // accounts signed in, |session_index| indicate the which of accounts + // within the session. If |fetch_token_from_auth_code| is not set fetching + // process stops after receiving an auth code and ClientOAuthSuccess won't be + // called. + // Resulting refresh token is annotated on the server with |device_id|. Format + // of device_id on the server is at most 64 unicode characters. + // + // Either OnClientOAuthCode or ClientOAuthSuccess or OnClientOAuthFailure + // will be called on the consumer on the original thread. + void StartCookieForOAuthLoginTokenExchange( + bool fetch_token_from_auth_code, + const std::string& session_index, + const std::string& client_id, + const std::string& device_id); + // Start a request to exchange the authorization code for an OAuthLogin-scoped // oauth2 token. // @@ -432,7 +450,8 @@ GURL client_login_to_oauth2_gurl_; std::string request_body_; std::string requested_service_; - bool fetch_pending_; + bool fetch_pending_ = false; + bool fetch_token_from_auth_code_ = false; // Headers used during the Logout call. std::string logout_headers_;
diff --git a/google_apis/gaia/gaia_auth_fetcher_unittest.cc b/google_apis/gaia/gaia_auth_fetcher_unittest.cc index 19ae5df..f281f23 100644 --- a/google_apis/gaia/gaia_auth_fetcher_unittest.cc +++ b/google_apis/gaia/gaia_auth_fetcher_unittest.cc
@@ -171,6 +171,7 @@ MOCK_METHOD1(OnClientLoginSuccess, void(const ClientLoginResult& result)); MOCK_METHOD2(OnIssueAuthTokenSuccess, void(const std::string& service, const std::string& token)); + MOCK_METHOD1(OnClientOAuthCode, void(const std::string& data)); MOCK_METHOD1(OnClientOAuthSuccess, void(const GaiaAuthConsumer::ClientOAuthResult& result)); MOCK_METHOD1(OnMergeSessionSuccess, void(const std::string& data)); @@ -395,6 +396,7 @@ TEST_F(GaiaAuthFetcherTest, OAuthLoginTokenSuccess) { MockGaiaConsumer consumer; + EXPECT_CALL(consumer, OnClientOAuthCode("test-code")).Times(0); EXPECT_CALL(consumer, OnClientOAuthSuccess( GaiaAuthConsumer::ClientOAuthResult("rt1", "at1", 3600))).Times(1); @@ -429,6 +431,37 @@ EXPECT_FALSE(auth.HasPendingFetch()); } +TEST_F(GaiaAuthFetcherTest, OAuthLoginTokenSuccessNoTokenFetch) { + MockGaiaConsumer consumer; + EXPECT_CALL(consumer, OnClientOAuthCode("test-code")).Times(1); + EXPECT_CALL(consumer, OnClientOAuthSuccess( + GaiaAuthConsumer::ClientOAuthResult("", "", 0))).Times(0); + + net::TestURLFetcherFactory factory; + GaiaAuthFetcher auth(&consumer, std::string(), GetRequestContext()); + auth.StartCookieForOAuthLoginTokenExchange( + false, "0", "ABCDE_12345", ""); + net::TestURLFetcher* fetcher = factory.GetFetcherByID(0); + EXPECT_TRUE(NULL != fetcher); + EXPECT_EQ(net::LOAD_NORMAL, fetcher->GetLoadFlags()); + EXPECT_EQ(std::string::npos, + fetcher->GetOriginalURL().query().find("device_type=chrome")); + + net::ResponseCookies cookies; + cookies.push_back(kGetAuthCodeValidCookie); + EXPECT_TRUE(auth.HasPendingFetch()); + MockFetcher mock_fetcher1( + client_login_to_oauth2_source_, + net::URLRequestStatus(net::URLRequestStatus::SUCCESS, 0), + net::HTTP_OK, + cookies, + std::string(), + net::URLFetcher::POST, + &auth); + auth.OnURLFetchComplete(&mock_fetcher1); + EXPECT_FALSE(auth.HasPendingFetch()); +} + TEST_F(GaiaAuthFetcherTest, OAuthLoginTokenWithCookies_DeviceId) { MockGaiaConsumer consumer; net::TestURLFetcherFactory factory;
diff --git a/ios/chrome/browser/bookmarks/bookmarks_utils.cc b/ios/chrome/browser/bookmarks/bookmarks_utils.cc index 97dc51aa..9d4f378 100644 --- a/ios/chrome/browser/bookmarks/bookmarks_utils.cc +++ b/ios/chrome/browser/bookmarks/bookmarks_utils.cc
@@ -12,6 +12,9 @@ #include "ios/chrome/browser/pref_names.h" #include "ios/public/provider/chrome/browser/browser_state/chrome_browser_state.h" +using bookmarks::BookmarkModel; +using bookmarks::BookmarkNode; + void RecordBookmarkLaunch(BookmarkLaunchLocation launch_location) { DCHECK(launch_location < BOOKMARK_LAUNCH_LOCATION_COUNT); UMA_HISTOGRAM_ENUMERATION("Stars.LaunchLocation", launch_location, @@ -19,7 +22,7 @@ } bool RemoveAllUserBookmarksIOS(ios::ChromeBrowserState* browser_state) { - bookmarks::BookmarkModel* bookmark_model = + BookmarkModel* bookmark_model = ios::BookmarkModelFactory::GetForBrowserState(browser_state); if (!bookmark_model->loaded()) @@ -40,3 +43,55 @@ return true; } + +std::vector<const BookmarkNode*> PrimaryPermanentNodes(BookmarkModel* model) { + DCHECK(model->loaded()); + std::vector<const BookmarkNode*> nodes; + nodes.push_back(model->mobile_node()); + nodes.push_back(model->bookmark_bar_node()); + nodes.push_back(model->other_node()); + return nodes; +} + +std::vector<const BookmarkNode*> RootLevelFolders(BookmarkModel* model) { + std::vector<const BookmarkNode*> root_level_folders; + + // Find the direct folder children of the primary permanent nodes. + std::vector<const BookmarkNode*> primary_permanent_nodes = + PrimaryPermanentNodes(model); + for (const BookmarkNode* parent : primary_permanent_nodes) { + int child_count = parent->child_count(); + for (int i = 0; i < child_count; ++i) { + const BookmarkNode* node = parent->GetChild(i); + if (node->is_folder() && node->IsVisible()) + root_level_folders.push_back(node); + } + } + return root_level_folders; +} + +bool IsPrimaryPermanentNode(const BookmarkNode* node, BookmarkModel* model) { + std::vector<const BookmarkNode*> primary_nodes(PrimaryPermanentNodes(model)); + if (std::find(primary_nodes.begin(), primary_nodes.end(), node) != + primary_nodes.end()) { + return true; + } + return false; +} + +const BookmarkNode* RootLevelFolderForNode(const BookmarkNode* node, + BookmarkModel* model) { + // This helper function doesn't work for managed bookmarks. This checks that + // |node| is editable by the user, which currently covers all the other + // bookmarks except the managed bookmarks. + DCHECK(model->client()->CanBeEditedByUser(node)); + + const std::vector<const BookmarkNode*> root_folders(RootLevelFolders(model)); + const BookmarkNode* top = node; + while (top && + std::find(root_folders.begin(), root_folders.end(), top) == + root_folders.end()) { + top = top->parent(); + } + return top; +}
diff --git a/ios/chrome/browser/bookmarks/bookmarks_utils.h b/ios/chrome/browser/bookmarks/bookmarks_utils.h index 39cd066..0684a8d4 100644 --- a/ios/chrome/browser/bookmarks/bookmarks_utils.h +++ b/ios/chrome/browser/bookmarks/bookmarks_utils.h
@@ -5,8 +5,16 @@ #ifndef IOS_CHROME_BROWSER_BOOKMARKS_BOOKMARKS_UTILS_H_ #define IOS_CHROME_BROWSER_BOOKMARKS_BOOKMARKS_UTILS_H_ +#include <set> +#include <vector> + #include "base/compiler_specific.h" +namespace bookmarks { +class BookmarkModel; +class BookmarkNode; +} + namespace ios { class ChromeBrowserState; } @@ -32,4 +40,27 @@ bool RemoveAllUserBookmarksIOS(ios::ChromeBrowserState* browser_state) WARN_UNUSED_RESULT; +// Returns the permanent nodes whose url children are considered uncategorized +// and whose folder children should be shown in the bookmark menu. +// |model| must be loaded. +std::vector<const bookmarks::BookmarkNode*> PrimaryPermanentNodes( + bookmarks::BookmarkModel* model); + +// Returns an unsorted vector of folders that are considered to be at the "root" +// level of the bookmark hierarchy. Functionally, this means all direct +// descendants of PrimaryPermanentNodes. +std::vector<const bookmarks::BookmarkNode*> RootLevelFolders( + bookmarks::BookmarkModel* model); + +// Returns whether |node| is a primary permanent node in the sense of +// |PrimaryPermanentNodes|. +bool IsPrimaryPermanentNode(const bookmarks::BookmarkNode* node, + bookmarks::BookmarkModel* model); + +// Returns the root level folder in which this node is directly, or indirectly +// via subfolders, located. +const bookmarks::BookmarkNode* RootLevelFolderForNode( + const bookmarks::BookmarkNode* node, + bookmarks::BookmarkModel* model); + #endif // IOS_CHROME_BROWSER_BOOKMARKS_BOOKMARKS_UTILS_H_
diff --git a/ios/chrome/browser/content_settings/host_content_settings_map_factory.cc b/ios/chrome/browser/content_settings/host_content_settings_map_factory.cc index dc74ceb..980b06c 100644 --- a/ios/chrome/browser/content_settings/host_content_settings_map_factory.cc +++ b/ios/chrome/browser/content_settings/host_content_settings_map_factory.cc
@@ -43,7 +43,8 @@ GetForBrowserState(browser_state->GetOriginalChromeBrowserState()); } return make_scoped_refptr(new HostContentSettingsMap( - browser_state->GetPrefs(), browser_state->IsOffTheRecord())); + browser_state->GetPrefs(), browser_state->IsOffTheRecord(), + false /* guest_profile */)); } web::BrowserState* HostContentSettingsMapFactory::GetBrowserStateToUse(
diff --git a/ios/chrome/browser/ssl/ios_chrome_security_state_model_client.cc b/ios/chrome/browser/ssl/ios_chrome_security_state_model_client.cc index 47d85bf..d005c40 100644 --- a/ios/chrome/browser/ssl/ios_chrome_security_state_model_client.cc +++ b/ios/chrome/browser/ssl/ios_chrome_security_state_model_client.cc
@@ -98,4 +98,8 @@ state->cert_status = ssl.cert_status; state->connection_status = ssl.connection_status; state->security_bits = ssl.security_bits; + state->displayed_mixed_content = + (ssl.content_status & web::SSLStatus::DISPLAYED_INSECURE_CONTENT) + ? true + : false; }
diff --git a/mash/task_viewer/task_viewer_application_delegate.cc b/mash/task_viewer/task_viewer_application_delegate.cc index 48595fe..8a4674e8 100644 --- a/mash/task_viewer/task_viewer_application_delegate.cc +++ b/mash/task_viewer/task_viewer_application_delegate.cc
@@ -38,8 +38,9 @@ public views::ButtonListener, public mojo::shell::mojom::ApplicationManagerListener { public: - explicit TaskViewer(ListenerRequest request) + TaskViewer(ListenerRequest request, scoped_ptr<mojo::AppRefCount> app) : binding_(this, std::move(request)), + app_(std::move(app)), table_view_(nullptr), table_view_parent_(nullptr), kill_button_( @@ -199,6 +200,7 @@ } mojo::Binding<mojo::shell::mojom::ApplicationManagerListener> binding_; + scoped_ptr<mojo::AppRefCount> app_; views::TableView* table_view_; views::View* table_view_parent_; @@ -229,7 +231,8 @@ ListenerRequest request = GetProxy(&listener); application_manager->AddListener(std::move(listener)); - TaskViewer* task_viewer = new TaskViewer(std::move(request)); + TaskViewer* task_viewer = new TaskViewer( + std::move(request), app->app_lifetime_helper()->CreateAppRefCount()); views::Widget* window = views::Widget::CreateWindowWithBounds( task_viewer, gfx::Rect(10, 10, 500, 500)); window->Show();
diff --git a/mash/wm/window_manager_application.cc b/mash/wm/window_manager_application.cc index eb3dfa60..eece106 100644 --- a/mash/wm/window_manager_application.cc +++ b/mash/wm/window_manager_application.cc
@@ -80,9 +80,9 @@ tracing_.Initialize(app); window_manager_.reset(new WindowManagerImpl()); // Don't bind to the WindowManager immediately. Wait for OnEmbed() first. - mus::mojom::WindowManagerPtr window_manager; - requests_.push_back( - make_scoped_ptr(new mojo::InterfaceRequest<mus::mojom::WindowManager>( + mus::mojom::WindowManagerDeprecatedPtr window_manager; + requests_.push_back(make_scoped_ptr( + new mojo::InterfaceRequest<mus::mojom::WindowManagerDeprecated>( mojo::GetProxy(&window_manager)))); user_window_controller_.reset(new UserWindowControllerImpl()); mus::CreateSingleWindowTreeHost( @@ -94,7 +94,7 @@ mojo::ApplicationConnection* connection) { connection->AddService<mash::wm::mojom::UserWindowController>(this); connection->AddService<mus::mojom::AcceleratorRegistrar>(this); - connection->AddService<mus::mojom::WindowManager>(this); + connection->AddService<mus::mojom::WindowManagerDeprecated>(this); return true; } @@ -192,13 +192,13 @@ void WindowManagerApplication::Create( mojo::ApplicationConnection* connection, - mojo::InterfaceRequest<mus::mojom::WindowManager> request) { + mojo::InterfaceRequest<mus::mojom::WindowManagerDeprecated> request) { if (root_) { window_manager_binding_.AddBinding(window_manager_.get(), std::move(request)); } else { - requests_.push_back( - make_scoped_ptr(new mojo::InterfaceRequest<mus::mojom::WindowManager>( + requests_.push_back(make_scoped_ptr( + new mojo::InterfaceRequest<mus::mojom::WindowManagerDeprecated>( std::move(request)))); } }
diff --git a/mash/wm/window_manager_application.h b/mash/wm/window_manager_application.h index 0f06e73..4d3646b 100644 --- a/mash/wm/window_manager_application.h +++ b/mash/wm/window_manager_application.h
@@ -52,7 +52,7 @@ public mus::mojom::WindowTreeHostClient, public mus::WindowTreeDelegate, public mojo::InterfaceFactory<mash::wm::mojom::UserWindowController>, - public mojo::InterfaceFactory<mus::mojom::WindowManager>, + public mojo::InterfaceFactory<mus::mojom::WindowManagerDeprecated>, public mojo::InterfaceFactory<mus::mojom::AcceleratorRegistrar> { public: WindowManagerApplication(); @@ -99,10 +99,10 @@ mojo::InterfaceRequest<mus::mojom::AcceleratorRegistrar> request) override; - // InterfaceFactory<mus::mojom::WindowManager>: - void Create( - mojo::ApplicationConnection* connection, - mojo::InterfaceRequest<mus::mojom::WindowManager> request) override; + // InterfaceFactory<mus::mojom::WindowManagerDeprecated>: + void Create(mojo::ApplicationConnection* connection, + mojo::InterfaceRequest<mus::mojom::WindowManagerDeprecated> + request) override; // mus::WindowObserver: void OnWindowDestroyed(mus::Window* window) override; @@ -127,8 +127,10 @@ // |window_manager_| is created once OnEmbed() is called. Until that time // |requests_| stores any pending WindowManager interface requests. scoped_ptr<WindowManagerImpl> window_manager_; - mojo::WeakBindingSet<mus::mojom::WindowManager> window_manager_binding_; - std::vector<scoped_ptr<mojo::InterfaceRequest<mus::mojom::WindowManager>>> + mojo::WeakBindingSet<mus::mojom::WindowManagerDeprecated> + window_manager_binding_; + std::vector< + scoped_ptr<mojo::InterfaceRequest<mus::mojom::WindowManagerDeprecated>>> requests_; // |user_window_controller_| is created once OnEmbed() is called. Until that
diff --git a/mash/wm/window_manager_apptest.cc b/mash/wm/window_manager_apptest.cc index 0d44e52..f38d7b2 100644 --- a/mash/wm/window_manager_apptest.cc +++ b/mash/wm/window_manager_apptest.cc
@@ -25,11 +25,12 @@ ~WindowManagerAppTest() override {} protected: - void ConnectToWindowManager(mus::mojom::WindowManagerPtr* window_manager) { + void ConnectToWindowManager( + mus::mojom::WindowManagerDeprecatedPtr* window_manager) { application_impl()->ConnectToService("mojo:desktop_wm", window_manager); } - mus::Window* OpenWindow(mus::mojom::WindowManager* window_manager) { + mus::Window* OpenWindow(mus::mojom::WindowManagerDeprecated* window_manager) { mus::mojom::WindowTreeClientPtr window_tree_client; mojo::InterfaceRequest<mus::mojom::WindowTreeClient> window_tree_client_request = GetProxy(&window_tree_client); @@ -52,7 +53,7 @@ }; TEST_F(WindowManagerAppTest, OpenWindow) { - mus::mojom::WindowManagerPtr connection; + mus::mojom::WindowManagerDeprecatedPtr connection; ConnectToWindowManager(&connection); ASSERT_TRUE(OpenWindow(connection.get()));
diff --git a/mash/wm/window_manager_impl.h b/mash/wm/window_manager_impl.h index bc36ca6..13ac114fa8 100644 --- a/mash/wm/window_manager_impl.h +++ b/mash/wm/window_manager_impl.h
@@ -21,7 +21,7 @@ using WindowManagerErrorCodeCallback = const mojo::Callback<void(mus::mojom::WindowManagerErrorCode)>; -class WindowManagerImpl : public mus::mojom::WindowManager, +class WindowManagerImpl : public mus::mojom::WindowManagerDeprecated, public mus::WindowObserver, public mus::WindowManagerDelegate { public:
diff --git a/net/http/http_network_transaction_unittest.cc b/net/http/http_network_transaction_unittest.cc index 9bda396..758b32e 100644 --- a/net/http/http_network_transaction_unittest.cc +++ b/net/http/http_network_transaction_unittest.cc
@@ -65,6 +65,7 @@ #include "net/proxy/proxy_resolver.h" #include "net/proxy/proxy_service.h" #include "net/socket/client_socket_factory.h" +#include "net/socket/client_socket_pool.h" #include "net/socket/client_socket_pool_manager.h" #include "net/socket/connection_attempts.h" #include "net/socket/mock_client_socket_pool_manager.h" @@ -587,6 +588,7 @@ int RequestSocket(const std::string& group_name, const void* socket_params, RequestPriority priority, + ClientSocketPool::RespectLimits respect_limits, ClientSocketHandle* handle, const CompletionCallback& callback, const BoundNetLog& net_log) override {
diff --git a/net/http/http_proxy_client_socket_pool.cc b/net/http/http_proxy_client_socket_pool.cc index f0f8795..5368ab9 100644 --- a/net/http/http_proxy_client_socket_pool.cc +++ b/net/http/http_proxy_client_socket_pool.cc
@@ -51,11 +51,6 @@ proxy_delegate_(proxy_delegate) { DCHECK((transport_params.get() == NULL && ssl_params.get() != NULL) || (transport_params.get() != NULL && ssl_params.get() == NULL)); - if (transport_params_.get()) { - ignore_limits_ = transport_params->ignore_limits(); - } else { - ignore_limits_ = ssl_params->ignore_limits(); - } } const HostResolver::RequestInfo& HttpProxySocketParams::destination() const { @@ -81,6 +76,7 @@ HttpProxyConnectJob::HttpProxyConnectJob( const std::string& group_name, RequestPriority priority, + ClientSocketPool::RespectLimits respect_limits, const scoped_refptr<HttpProxySocketParams>& params, const base::TimeDelta& timeout_duration, TransportClientSocketPool* transport_pool, @@ -90,11 +86,13 @@ : ConnectJob(group_name, base::TimeDelta() /* The socket takes care of timeouts */, priority, + respect_limits, delegate, BoundNetLog::Make(net_log, NetLog::SOURCE_CONNECT_JOB)), client_socket_(new HttpProxyClientSocketWrapper( group_name, priority, + respect_limits, timeout_duration, base::TimeDelta::FromSeconds(kHttpProxyConnectJobTimeoutInSeconds), transport_pool, @@ -177,14 +175,10 @@ const std::string& group_name, const PoolBase::Request& request, ConnectJob::Delegate* delegate) const { - return scoped_ptr<ConnectJob>(new HttpProxyConnectJob(group_name, - request.priority(), - request.params(), - ConnectionTimeout(), - transport_pool_, - ssl_pool_, - delegate, - net_log_)); + return scoped_ptr<ConnectJob>(new HttpProxyConnectJob( + group_name, request.priority(), request.respect_limits(), + request.params(), ConnectionTimeout(), transport_pool_, ssl_pool_, + delegate, net_log_)); } base::TimeDelta @@ -217,15 +211,18 @@ HttpProxyClientSocketPool::~HttpProxyClientSocketPool() { } -int HttpProxyClientSocketPool::RequestSocket( - const std::string& group_name, const void* socket_params, - RequestPriority priority, ClientSocketHandle* handle, - const CompletionCallback& callback, const BoundNetLog& net_log) { +int HttpProxyClientSocketPool::RequestSocket(const std::string& group_name, + const void* socket_params, + RequestPriority priority, + RespectLimits respect_limits, + ClientSocketHandle* handle, + const CompletionCallback& callback, + const BoundNetLog& net_log) { const scoped_refptr<HttpProxySocketParams>* casted_socket_params = static_cast<const scoped_refptr<HttpProxySocketParams>*>(socket_params); return base_.RequestSocket(group_name, *casted_socket_params, priority, - handle, callback, net_log); + respect_limits, handle, callback, net_log); } void HttpProxyClientSocketPool::RequestSockets(
diff --git a/net/http/http_proxy_client_socket_pool.h b/net/http/http_proxy_client_socket_pool.h index 44f9ab6..64c13f1 100644 --- a/net/http/http_proxy_client_socket_pool.h +++ b/net/http/http_proxy_client_socket_pool.h
@@ -70,7 +70,6 @@ } const HostResolver::RequestInfo& destination() const; bool tunnel() const { return tunnel_; } - bool ignore_limits() const { return ignore_limits_; } ProxyDelegate* proxy_delegate() const { return proxy_delegate_; @@ -88,7 +87,6 @@ HttpAuthCache* const http_auth_cache_; HttpAuthHandlerFactory* const http_auth_handler_factory_; const bool tunnel_; - bool ignore_limits_; ProxyDelegate* proxy_delegate_; DISALLOW_COPY_AND_ASSIGN(HttpProxySocketParams); @@ -100,6 +98,7 @@ public: HttpProxyConnectJob(const std::string& group_name, RequestPriority priority, + ClientSocketPool::RespectLimits respect_limits, const scoped_refptr<HttpProxySocketParams>& params, const base::TimeDelta& timeout_duration, TransportClientSocketPool* transport_pool, @@ -152,6 +151,7 @@ int RequestSocket(const std::string& group_name, const void* connect_params, RequestPriority priority, + RespectLimits respect_limits, ClientSocketHandle* handle, const CompletionCallback& callback, const BoundNetLog& net_log) override;
diff --git a/net/http/http_proxy_client_socket_pool_unittest.cc b/net/http/http_proxy_client_socket_pool_unittest.cc index 97d7270f..cc3069d 100644 --- a/net/http/http_proxy_client_socket_pool_unittest.cc +++ b/net/http/http_proxy_client_socket_pool_unittest.cc
@@ -211,7 +211,6 @@ return new TransportSocketParams( HostPortPair(kHttpProxyHost, 80), false, - false, OnHostResolutionCallback(), TransportSocketParams::COMBINE_CONNECT_AND_WRITE_DEFAULT); } @@ -223,7 +222,6 @@ new TransportSocketParams( HostPortPair(kHttpsProxyHost, 443), false, - false, OnHostResolutionCallback(), TransportSocketParams::COMBINE_CONNECT_AND_WRITE_DEFAULT), NULL, @@ -347,6 +345,7 @@ scoped_ptr<TestProxyDelegate> proxy_delegate(new TestProxyDelegate()); int rv = handle_.Init("a", CreateNoTunnelParams(proxy_delegate.get()), LOW, + ClientSocketPool::RespectLimits::ENABLED, CompletionCallback(), &pool_, BoundNetLog()); EXPECT_EQ(OK, rv); EXPECT_TRUE(handle_.is_initialized()); @@ -361,9 +360,9 @@ // (non-SSL) socket request on Init. TEST_P(HttpProxyClientSocketPoolTest, SetSocketRequestPriorityOnInit) { Initialize(NULL, 0, NULL, 0, NULL, 0, NULL, 0); - EXPECT_EQ(OK, - handle_.Init("a", CreateNoTunnelParams(NULL), HIGHEST, - CompletionCallback(), &pool_, BoundNetLog())); + EXPECT_EQ(OK, handle_.Init("a", CreateNoTunnelParams(NULL), HIGHEST, + ClientSocketPool::RespectLimits::ENABLED, + CompletionCallback(), &pool_, BoundNetLog())); EXPECT_EQ(HIGHEST, GetLastTransportRequestPriority()); } @@ -405,6 +404,7 @@ arraysize(spdy_writes)); int rv = handle_.Init("a", CreateTunnelParams(NULL), LOW, + ClientSocketPool::RespectLimits::ENABLED, callback_.callback(), &pool_, BoundNetLog()); EXPECT_EQ(ERR_IO_PENDING, rv); EXPECT_FALSE(handle_.is_initialized()); @@ -454,6 +454,7 @@ scoped_ptr<TestProxyDelegate> proxy_delegate(new TestProxyDelegate()); int rv = handle_.Init("a", CreateTunnelParams(proxy_delegate.get()), LOW, + ClientSocketPool::RespectLimits::ENABLED, callback_.callback(), &pool_, BoundNetLog()); EXPECT_EQ(OK, rv); EXPECT_TRUE(handle_.is_initialized()); @@ -507,6 +508,7 @@ scoped_ptr<TestProxyDelegate> proxy_delegate(new TestProxyDelegate()); int rv = handle_.Init("a", CreateTunnelParams(proxy_delegate.get()), LOW, + ClientSocketPool::RespectLimits::ENABLED, callback_.callback(), &pool_, BoundNetLog()); EXPECT_EQ(ERR_IO_PENDING, rv); EXPECT_FALSE(handle_.is_initialized()); @@ -547,6 +549,7 @@ EXPECT_EQ(ERR_IO_PENDING, handle_.Init("a", CreateTunnelParams(NULL), MEDIUM, + ClientSocketPool::RespectLimits::ENABLED, callback_.callback(), &pool_, BoundNetLog())); EXPECT_EQ(MEDIUM, GetLastTransportRequestPriority()); @@ -561,6 +564,7 @@ socket_factory()->AddSocketDataProvider(data_.get()); int rv = handle_.Init("a", CreateTunnelParams(NULL), LOW, + ClientSocketPool::RespectLimits::ENABLED, callback_.callback(), &pool_, BoundNetLog()); EXPECT_EQ(ERR_IO_PENDING, rv); EXPECT_FALSE(handle_.is_initialized()); @@ -586,6 +590,7 @@ socket_factory()->AddSSLSocketDataProvider(ssl_data_.get()); int rv = handle_.Init("a", CreateTunnelParams(NULL), LOW, + ClientSocketPool::RespectLimits::ENABLED, callback_.callback(), &pool_, BoundNetLog()); EXPECT_EQ(ERR_IO_PENDING, rv); EXPECT_FALSE(handle_.is_initialized()); @@ -611,6 +616,7 @@ socket_factory()->AddSSLSocketDataProvider(ssl_data_.get()); int rv = handle_.Init("a", CreateTunnelParams(NULL), LOW, + ClientSocketPool::RespectLimits::ENABLED, callback_.callback(), &pool_, BoundNetLog()); EXPECT_EQ(ERR_IO_PENDING, rv); EXPECT_FALSE(handle_.is_initialized()); @@ -650,6 +656,7 @@ AddAuthToCache(); int rv = handle_.Init("a", CreateTunnelParams(NULL), LOW, + ClientSocketPool::RespectLimits::ENABLED, callback_.callback(), &pool_, BoundNetLog()); EXPECT_EQ(ERR_IO_PENDING, rv); EXPECT_FALSE(handle_.is_initialized()); @@ -688,6 +695,7 @@ NULL, 0, NULL, 0); int rv = handle_.Init("a", CreateTunnelParams(NULL), LOW, + ClientSocketPool::RespectLimits::ENABLED, callback_.callback(), &pool_, BoundNetLog()); EXPECT_EQ(ERR_IO_PENDING, rv); EXPECT_FALSE(handle_.is_initialized()); @@ -728,6 +736,7 @@ AddAuthToCache(); int rv = handle_.Init("a", CreateTunnelParams(NULL), LOW, + ClientSocketPool::RespectLimits::ENABLED, callback_.callback(), &pool_, BoundNetLog()); EXPECT_EQ(ERR_IO_PENDING, rv); EXPECT_FALSE(handle_.is_initialized()); @@ -789,6 +798,7 @@ AddAuthToCache(); int rv = handle_.Init("a", CreateTunnelParams(NULL), LOW, + ClientSocketPool::RespectLimits::ENABLED, callback_.callback(), &pool_, BoundNetLog()); EXPECT_EQ(ERR_IO_PENDING, rv); EXPECT_FALSE(handle_.is_initialized());
diff --git a/net/http/http_proxy_client_socket_wrapper.cc b/net/http/http_proxy_client_socket_wrapper.cc index 1a56a5c4..d1595187d 100644 --- a/net/http/http_proxy_client_socket_wrapper.cc +++ b/net/http/http_proxy_client_socket_wrapper.cc
@@ -29,6 +29,7 @@ HttpProxyClientSocketWrapper::HttpProxyClientSocketWrapper( const std::string& group_name, RequestPriority priority, + ClientSocketPool::RespectLimits respect_limits, base::TimeDelta connect_timeout_duration, base::TimeDelta proxy_negotiation_timeout_duration, TransportClientSocketPool* transport_pool, @@ -46,6 +47,7 @@ : next_state_(STATE_NONE), group_name_(group_name), priority_(priority), + respect_limits_(respect_limits), connect_timeout_duration_(connect_timeout_duration), proxy_negotiation_timeout_duration_(proxy_negotiation_timeout_duration), transport_pool_(transport_pool), @@ -404,7 +406,7 @@ next_state_ = STATE_TCP_CONNECT_COMPLETE; transport_socket_handle_.reset(new ClientSocketHandle()); return transport_socket_handle_->Init( - group_name_, transport_params_, priority_, + group_name_, transport_params_, priority_, respect_limits_, base::Bind(&HttpProxyClientSocketWrapper::OnIOComplete, base::Unretained(this)), transport_pool_, net_log_); @@ -436,7 +438,7 @@ next_state_ = STATE_SSL_CONNECT_COMPLETE; transport_socket_handle_.reset(new ClientSocketHandle()); return transport_socket_handle_->Init( - group_name_, ssl_params_, priority_, + group_name_, ssl_params_, priority_, respect_limits_, base::Bind(&HttpProxyClientSocketWrapper::OnIOComplete, base::Unretained(this)), ssl_pool_, net_log_); @@ -587,7 +589,7 @@ // TODO(mmenke): This may still result in waiting in line, if there are // other HIGHEST priority requests. Consider a workaround for // that. Starting the new request before releasing the old - // socket and using LOAD_IGNORE_LIMITS would do the trick, + // socket and using RespectLimits::Disabled would work, // without exceding the the socket pool limits (Since the old // socket would free up the extra socket slot when destroyed). priority_ = HIGHEST;
diff --git a/net/http/http_proxy_client_socket_wrapper.h b/net/http/http_proxy_client_socket_wrapper.h index 70e3882..e3a98ff7 100644 --- a/net/http/http_proxy_client_socket_wrapper.h +++ b/net/http/http_proxy_client_socket_wrapper.h
@@ -55,6 +55,7 @@ HttpProxyClientSocketWrapper( const std::string& group_name, RequestPriority priority, + ClientSocketPool::RespectLimits respect_limits, base::TimeDelta connect_timeout_duration, base::TimeDelta proxy_negotiation_timeout_duration, TransportClientSocketPool* transport_pool, @@ -168,6 +169,7 @@ const std::string group_name_; RequestPriority priority_; + ClientSocketPool::RespectLimits respect_limits_; const base::TimeDelta connect_timeout_duration_; const base::TimeDelta proxy_negotiation_timeout_duration_;
diff --git a/net/http/http_stream_factory_impl_unittest.cc b/net/http/http_stream_factory_impl_unittest.cc index 0d89cf1..08864fd 100644 --- a/net/http/http_stream_factory_impl_unittest.cc +++ b/net/http/http_stream_factory_impl_unittest.cc
@@ -374,6 +374,7 @@ int RequestSocket(const std::string& group_name, const void* socket_params, RequestPriority priority, + ClientSocketPool::RespectLimits respect_limits, ClientSocketHandle* handle, const CompletionCallback& callback, const BoundNetLog& net_log) override {
diff --git a/net/http/transport_security_state_static.h b/net/http/transport_security_state_static.h index 7c49944..c2cd68a3 100644 --- a/net/http/transport_security_state_static.h +++ b/net/http/transport_security_state_static.h
@@ -738,5054 +738,5058 @@ // Otherwise it's a pointer to the n'th element of the array. static const uint8_t kHSTSHuffmanTree[] = { 0xf5, 0xe7, 0xf9, 0xe6, 0x01, 0xe4, 0x00, 0x02, 0xf2, 0xe9, 0x03, 0x04, - 0xb2, 0xb4, 0xb5, 0xb7, 0xb8, 0x07, 0x08, 0xf1, 0x06, 0x09, 0xb9, 0xb6, - 0x0b, 0xb3, 0xb1, 0xb0, 0x0c, 0x0d, 0x0e, 0xfa, 0x0a, 0x0f, 0xf7, 0x10, - 0xed, 0x11, 0x12, 0xef, 0x80, 0x13, 0x05, 0x14, 0xad, 0xae, 0xeb, 0x16, - 0xe3, 0x17, 0xe1, 0x18, 0x19, 0xff, 0xf8, 0xea, 0x1b, 0xf6, 0xe2, 0x1c, - 0xec, 0x1d, 0xe5, 0x1e, 0xf3, 0xee, 0xe8, 0xf0, 0xf4, 0x21, 0x20, 0x22, - 0x1f, 0x23, 0x1a, 0x24, 0x15, 0x25, + 0xb2, 0xb4, 0xa0, 0xb5, 0x07, 0xb7, 0xb8, 0x08, 0x09, 0xf1, 0x06, 0x0a, + 0xb9, 0xb6, 0x0c, 0xb3, 0xb1, 0xb0, 0x0d, 0x0e, 0x0f, 0xfa, 0x0b, 0x10, + 0xf7, 0x11, 0xed, 0x12, 0x13, 0xef, 0x80, 0x14, 0x05, 0x15, 0xad, 0xae, + 0xeb, 0x17, 0xe3, 0x18, 0xe1, 0x19, 0x1a, 0xff, 0xf8, 0xea, 0x1c, 0xf6, + 0xe2, 0x1d, 0xec, 0x1e, 0xe5, 0x1f, 0xf3, 0xee, 0xe8, 0xf0, 0xf4, 0x22, + 0x21, 0x23, 0x20, 0x24, 0x1b, 0x25, 0x16, 0x26, }; static const uint8_t kPreloadedHSTSData[] = { - 0xfb, 0x41, 0x77, 0x0a, 0xa2, 0x25, 0x5e, 0xe9, 0xe9, 0x65, 0xa7, 0xe1, - 0xe8, 0x4c, 0x69, 0x73, 0x76, 0x2a, 0xcb, 0xbf, 0x02, 0xcb, 0xd2, 0x2d, - 0xd5, 0x97, 0x7d, 0xe5, 0x97, 0xff, 0xd1, 0xd8, 0x91, 0x38, 0xbf, 0x4a, - 0x33, 0xcb, 0x2e, 0x7e, 0x2c, 0xa9, 0x1f, 0xe8, 0xc6, 0x0d, 0x3e, 0xff, - 0x63, 0x45, 0x1e, 0xe9, 0xac, 0xbf, 0xe7, 0x91, 0x66, 0xf2, 0xce, 0x2c, - 0xbf, 0xf8, 0x0c, 0xe9, 0x67, 0xde, 0x27, 0xea, 0xcb, 0xff, 0xf4, 0x89, - 0xfc, 0xec, 0xe4, 0x0e, 0x3b, 0x12, 0x59, 0x5c, 0x44, 0xb8, 0x88, 0x97, - 0x67, 0x16, 0x5e, 0x77, 0x0a, 0xa2, 0x2d, 0x54, 0x8f, 0x8b, 0x09, 0x02, - 0x2d, 0x76, 0xb8, 0xb2, 0x86, 0x9b, 0xb6, 0xa3, 0x31, 0xe1, 0x75, 0xde, - 0xf2, 0xcb, 0xff, 0xe7, 0xee, 0x16, 0xb5, 0x9f, 0x4b, 0xc6, 0xc5, 0x95, - 0x23, 0xe6, 0x00, 0xbd, 0xc1, 0x85, 0x97, 0xfe, 0x03, 0x88, 0x59, 0x36, - 0xa1, 0xa5, 0x97, 0x13, 0x4b, 0x2b, 0x0f, 0xb7, 0xa2, 0xcd, 0x20, 0x5f, - 0xfe, 0x94, 0x61, 0x78, 0x0e, 0x3e, 0x40, 0xab, 0x2e, 0x7d, 0xeb, 0x2f, - 0xa0, 0x2c, 0x02, 0xcb, 0x0c, 0xcd, 0xd1, 0x0c, 0x5f, 0xbe, 0x1e, 0x9e, - 0x4b, 0x2f, 0xf0, 0x3f, 0x2c, 0xd8, 0x49, 0x2c, 0xa8, 0x3d, 0xfe, 0x94, - 0xde, 0x21, 0xc2, 0xcb, 0x86, 0x35, 0x97, 0xf6, 0xa1, 0x98, 0x4c, 0x59, - 0x7f, 0x88, 0xf8, 0x65, 0xf4, 0x96, 0x56, 0x8f, 0x79, 0xa2, 0xcb, 0x8f, - 0x65, 0x97, 0xfd, 0xe0, 0x69, 0xf8, 0xf9, 0xd5, 0x97, 0x46, 0xea, 0xca, - 0x19, 0xf4, 0x18, 0xbb, 0x0e, 0x2b, 0x13, 0x2e, 0x37, 0x57, 0x84, 0x5d, - 0xff, 0xc1, 0xd4, 0x0b, 0x05, 0xe6, 0xd1, 0xb4, 0x6e, 0x96, 0x5f, 0xf7, - 0x63, 0x59, 0xd3, 0xf8, 0x96, 0x5f, 0xdd, 0x20, 0x38, 0xa1, 0x59, 0x7f, - 0x46, 0xb0, 0x6f, 0x25, 0x94, 0x34, 0x49, 0x19, 0xc0, 0x85, 0xd7, 0x17, - 0x16, 0x54, 0x26, 0x59, 0x90, 0xe6, 0x23, 0x0b, 0xfe, 0x08, 0x9e, 0x39, - 0x35, 0x9d, 0x59, 0x7f, 0xfe, 0xf4, 0x7b, 0x99, 0x31, 0x43, 0x35, 0xa8, - 0xf9, 0x65, 0xff, 0xa3, 0xbd, 0x89, 0x78, 0x53, 0xd2, 0xcb, 0x6e, 0xac, - 0xbe, 0xd7, 0x31, 0xa5, 0x97, 0xc5, 0x1f, 0x09, 0x06, 0xdf, 0x05, 0x2b, - 0x64, 0x56, 0x93, 0xb5, 0xfe, 0x09, 0xf3, 0x5a, 0x89, 0x2c, 0xbf, 0xff, - 0x67, 0xfc, 0x3f, 0x9a, 0xc0, 0xc1, 0x01, 0xe4, 0xb2, 0xff, 0xe8, 0xc2, - 0xf7, 0x3d, 0x98, 0xd7, 0x16, 0x54, 0x2a, 0x2d, 0xc3, 0xb3, 0x8c, 0x0f, - 0xa4, 0x64, 0x67, 0xe5, 0x6b, 0xc2, 0xe3, 0x7a, 0xcb, 0x9b, 0xdb, 0xd6, - 0x5d, 0x9f, 0x24, 0xb4, 0x24, 0xb7, 0xfa, 0x34, 0xff, 0x8b, 0xdf, 0xef, - 0x66, 0xbf, 0x61, 0xf1, 0x24, 0xf3, 0x53, 0x7f, 0x4b, 0xa7, 0xbf, 0x26, - 0x59, 0x50, 0x7e, 0xce, 0x8d, 0x7f, 0x74, 0xc3, 0x0c, 0x35, 0x97, 0xfa, - 0x3f, 0xd9, 0xe5, 0x1b, 0xab, 0x2c, 0x50, 0x7c, 0x64, 0x59, 0x69, 0xed, - 0xdb, 0x30, 0xe1, 0xba, 0x1d, 0x6e, 0x03, 0x11, 0x09, 0xcd, 0x8b, 0xb2, - 0x3a, 0x81, 0x61, 0x3a, 0x18, 0x47, 0xfc, 0x5e, 0x70, 0x83, 0x9a, 0x10, - 0x9a, 0x21, 0xec, 0x69, 0x25, 0x1a, 0xff, 0x25, 0x30, 0x01, 0x6d, 0xa2, - 0x0d, 0xc8, 0x71, 0x89, 0x08, 0x3b, 0xff, 0xff, 0x9d, 0x93, 0xcf, 0x5a, - 0x06, 0xb5, 0x05, 0x82, 0x9f, 0x7b, 0x82, 0x2c, 0xbf, 0xfc, 0xda, 0x0a, - 0xd6, 0xee, 0xc3, 0x6c, 0xce, 0x9d, 0xdd, 0xc5, 0x97, 0xc1, 0x77, 0x0a, - 0xa2, 0xa2, 0x5f, 0x9c, 0xa4, 0x6c, 0x59, 0x5a, 0x3d, 0x46, 0x17, 0x5f, - 0x77, 0x35, 0x8b, 0x2f, 0x1c, 0xcd, 0xeb, 0x2a, 0x0f, 0x07, 0xa4, 0x37, - 0xe0, 0xbf, 0x63, 0xab, 0x2f, 0xff, 0xe0, 0x13, 0x8b, 0x3b, 0xc2, 0xc1, - 0x4b, 0x3a, 0x6c, 0x59, 0x70, 0x04, 0x59, 0x7c, 0x31, 0xc3, 0x16, 0x5f, - 0xff, 0x4b, 0x66, 0xd2, 0x1b, 0x9d, 0x83, 0xa9, 0xd3, 0xbb, 0xb8, 0xb2, - 0xa1, 0x13, 0xe6, 0x31, 0xf9, 0x15, 0xff, 0xfc, 0x02, 0x71, 0x67, 0x78, - 0x58, 0x29, 0x67, 0x4d, 0x8b, 0x2f, 0xb5, 0xac, 0xdc, 0x59, 0x4c, 0x44, - 0x13, 0xae, 0xdf, 0xff, 0x9e, 0x45, 0x1c, 0xcf, 0x82, 0x4f, 0x9f, 0x05, - 0x65, 0xa7, 0xc9, 0x5c, 0x2e, 0x42, 0xdc, 0x2c, 0x66, 0x42, 0xc2, 0x7e, - 0xc3, 0xf3, 0x90, 0xb1, 0xde, 0x45, 0x7f, 0xd8, 0xc9, 0xfb, 0x98, 0x47, - 0xe5, 0x97, 0xfe, 0x89, 0xfd, 0x37, 0x97, 0x8f, 0x65, 0x94, 0x33, 0xfc, - 0xe1, 0xe5, 0xec, 0x6b, 0x16, 0x5e, 0x04, 0x6c, 0xb2, 0xfe, 0x79, 0x7d, - 0xc8, 0xd9, 0x65, 0xff, 0x3f, 0xc5, 0x9b, 0xf4, 0x7c, 0x59, 0x7e, 0x38, - 0x93, 0xc9, 0x65, 0x0d, 0x11, 0xec, 0x2f, 0xe9, 0xd5, 0xfd, 0x9b, 0x0e, - 0x30, 0x6b, 0x2f, 0x87, 0xd3, 0x99, 0x65, 0x61, 0xe8, 0x39, 0x6d, 0xf8, - 0x9d, 0xbf, 0x36, 0x59, 0x79, 0xa7, 0xea, 0xcb, 0xa0, 0x6b, 0x2a, 0x0d, - 0x9f, 0x47, 0x6f, 0xf9, 0xcb, 0xdc, 0xd6, 0x43, 0x16, 0x5f, 0x8c, 0x88, - 0x1b, 0xab, 0x2f, 0xfb, 0x98, 0x3c, 0xd4, 0xa3, 0x4b, 0x2a, 0x0f, 0x87, - 0x45, 0x36, 0xd9, 0x65, 0x41, 0xb3, 0xc2, 0x1b, 0xf1, 0x47, 0xff, 0xc2, - 0xcb, 0x9c, 0x0b, 0x2c, 0x4b, 0x2f, 0xdb, 0x69, 0xdf, 0xcb, 0x28, 0xcd, - 0xc3, 0x88, 0x5f, 0x74, 0xfb, 0x3d, 0xb0, 0xad, 0x90, 0x63, 0x99, 0x0a, - 0xc1, 0x61, 0x00, 0x12, 0x09, 0x97, 0x58, 0x41, 0xd8, 0x65, 0xf8, 0x7d, - 0xa2, 0x8d, 0xc4, 0xeb, 0xf6, 0x82, 0xee, 0x15, 0x45, 0x7a, 0xbf, 0x1b, - 0x78, 0x41, 0xb2, 0xcb, 0xa2, 0x4b, 0x2e, 0x8f, 0xd6, 0x5f, 0xdb, 0x09, - 0xb8, 0xe5, 0xfa, 0xcb, 0xff, 0x39, 0x7f, 0x9e, 0x82, 0x3f, 0xd6, 0x54, - 0x1f, 0x86, 0xe1, 0x9d, 0xa7, 0xe2, 0x64, 0x3a, 0x34, 0x72, 0xcf, 0xc5, - 0x84, 0x84, 0x3d, 0xff, 0xd3, 0xde, 0x53, 0xf3, 0x41, 0x77, 0x0a, 0xa2, - 0x46, 0x5f, 0xfe, 0x9e, 0xc7, 0x94, 0xfc, 0xd0, 0x5d, 0xc2, 0xa8, 0x9e, - 0x17, 0xff, 0xa7, 0xb1, 0xe5, 0x3f, 0x34, 0x17, 0x70, 0xaa, 0x27, 0xf5, - 0xff, 0xe9, 0xec, 0x79, 0x4f, 0xcd, 0x05, 0xdc, 0x2a, 0x8a, 0x19, 0x7f, - 0xf3, 0x1e, 0x53, 0xf3, 0x41, 0x77, 0x0a, 0xa2, 0x88, 0x5f, 0xfa, 0x53, - 0xc1, 0xc9, 0xd1, 0xc8, 0x92, 0xca, 0x9e, 0x89, 0x58, 0x52, 0xbf, 0xf4, - 0xc7, 0xdf, 0xb3, 0xc3, 0xc6, 0x2c, 0xbf, 0x8f, 0xc7, 0xa7, 0xfd, 0x65, - 0xf6, 0x7b, 0x3f, 0x59, 0x7e, 0x20, 0x3c, 0xb8, 0xb2, 0xf1, 0x3c, 0xf9, - 0x1f, 0xb1, 0x16, 0xf8, 0x8a, 0xfd, 0xa0, 0xbb, 0x85, 0x51, 0x48, 0xaf, - 0xfe, 0xee, 0xf7, 0xd7, 0x1f, 0xbc, 0x8d, 0x96, 0x5f, 0xfc, 0xff, 0x73, - 0xad, 0x47, 0xf3, 0x84, 0x62, 0xcb, 0xfe, 0x89, 0x46, 0xb6, 0x8d, 0x6c, - 0xb2, 0xf3, 0xca, 0x7e, 0x26, 0x00, 0xe6, 0x9f, 0xa3, 0x92, 0x5d, 0xff, - 0xfd, 0xbe, 0x78, 0x81, 0xcf, 0x41, 0x7b, 0x8e, 0x40, 0xc5, 0x97, 0xff, - 0xa5, 0x3f, 0x4f, 0xfb, 0xf8, 0xf5, 0x8c, 0x59, 0x7f, 0xc6, 0x18, 0x67, - 0x3d, 0x12, 0x59, 0x7f, 0x03, 0x5f, 0xce, 0x1c, 0xcb, 0x2e, 0xfe, 0x7c, - 0x8f, 0xaf, 0x87, 0x17, 0xf4, 0xb3, 0xbd, 0x79, 0x2c, 0xbf, 0xff, 0xb0, - 0x7d, 0x81, 0x27, 0xf8, 0x9f, 0xfe, 0x72, 0x3f, 0x49, 0x69, 0xf0, 0xb8, - 0x2e, 0x18, 0x5b, 0x32, 0x34, 0x0e, 0xa7, 0xba, 0xf7, 0xf0, 0xb7, 0xf1, - 0x8e, 0xe1, 0x6d, 0xff, 0xf7, 0x63, 0xa6, 0x2f, 0x39, 0x85, 0xfe, 0xe6, - 0x2c, 0xbe, 0x0b, 0xb8, 0x55, 0x12, 0x82, 0xff, 0xd1, 0xfb, 0x1e, 0x5d, - 0x87, 0xd2, 0xca, 0x92, 0x2f, 0xf4, 0xa6, 0x45, 0xd7, 0xff, 0x89, 0xfd, - 0xc1, 0x08, 0x12, 0x2c, 0x62, 0xcb, 0xee, 0x38, 0xf1, 0x65, 0xff, 0xe7, - 0xd8, 0xf5, 0xa3, 0xfa, 0x5e, 0x7f, 0x96, 0x5f, 0x4f, 0x79, 0x4f, 0xc4, - 0x72, 0xb0, 0xbf, 0x89, 0x3b, 0x84, 0x35, 0xb3, 0xa1, 0x46, 0x95, 0x31, - 0x88, 0x71, 0xae, 0x86, 0x5f, 0xc9, 0xc6, 0x0d, 0xbb, 0x2e, 0x1b, 0x51, - 0xf6, 0x31, 0x63, 0xaa, 0x9f, 0xad, 0x36, 0xd6, 0xb9, 0x0e, 0xf0, 0x4e, - 0x1d, 0xb7, 0xca, 0x32, 0xbf, 0xfd, 0x3d, 0x8f, 0x29, 0xf9, 0xa0, 0xbb, - 0x85, 0x51, 0x39, 0xaf, 0xff, 0x4f, 0x63, 0xca, 0x7e, 0x68, 0x2e, 0xe1, - 0x54, 0x51, 0x2b, 0xfe, 0x03, 0xea, 0x4d, 0xc7, 0x7f, 0xe6, 0xb2, 0xf1, - 0xfd, 0xc5, 0x97, 0x8a, 0x18, 0xb2, 0xff, 0x89, 0xfe, 0xf3, 0xfa, 0x4e, - 0xb2, 0xb6, 0x3f, 0x03, 0x1d, 0xfc, 0x6e, 0xfe, 0x3e, 0x4d, 0x23, 0xfd, - 0x65, 0xfd, 0x83, 0x10, 0x6e, 0xc5, 0x97, 0xfa, 0x36, 0x13, 0x71, 0xcb, - 0xf5, 0x97, 0x4a, 0x78, 0xd3, 0x77, 0xc8, 0x59, 0x74, 0xc3, 0x79, 0x78, - 0x85, 0xd7, 0xff, 0xa7, 0xf0, 0xb3, 0xf8, 0xff, 0x5a, 0x86, 0x96, 0x56, - 0x91, 0x5d, 0xfb, 0x05, 0x69, 0x57, 0xef, 0x16, 0x81, 0x29, 0xfe, 0xfd, - 0xa0, 0xbb, 0x85, 0x51, 0x0e, 0x2f, 0xe0, 0x07, 0x47, 0x04, 0xb2, 0xfc, - 0x65, 0xe8, 0x62, 0xcb, 0x4f, 0xc4, 0x43, 0x74, 0xd3, 0x70, 0xb2, 0xff, - 0xc6, 0x3c, 0x61, 0x67, 0xde, 0x75, 0x97, 0xfd, 0x1a, 0xc0, 0xf6, 0x3e, - 0x92, 0xca, 0x59, 0x7f, 0xf1, 0x38, 0xa1, 0xe9, 0xeb, 0x50, 0xd2, 0xcb, - 0x88, 0x96, 0x5f, 0x05, 0xdc, 0x2a, 0x88, 0xbd, 0x7f, 0xb3, 0xef, 0xf8, - 0xe7, 0xb2, 0xcb, 0xf1, 0x3f, 0xef, 0xc5, 0x97, 0xec, 0x9a, 0x4f, 0xc5, - 0x95, 0x32, 0x31, 0xf4, 0x2a, 0x45, 0xde, 0x35, 0x10, 0x9e, 0xfe, 0xc1, - 0xf7, 0x3f, 0x75, 0x97, 0xd0, 0x06, 0xdf, 0x16, 0x57, 0x0f, 0x4d, 0xa2, - 0xdb, 0x84, 0xe2, 0xcb, 0x49, 0x65, 0x41, 0xa9, 0x71, 0x8b, 0x8b, 0x65, - 0x97, 0xfd, 0xe2, 0x86, 0x08, 0x3e, 0xc2, 0xcb, 0xf3, 0xc9, 0x91, 0x25, - 0x95, 0x07, 0xee, 0x62, 0xfd, 0x39, 0xbe, 0x9a, 0x4f, 0x25, 0x97, 0x73, - 0xe5, 0x97, 0xde, 0x94, 0x0a, 0x92, 0xfb, 0x07, 0xee, 0x2c, 0xac, 0x44, - 0x03, 0x08, 0xdc, 0x60, 0x88, 0xef, 0xf1, 0x67, 0xd2, 0xe1, 0x8a, 0xb2, - 0xfc, 0xff, 0x01, 0xfc, 0xb2, 0xed, 0xc2, 0x59, 0x7e, 0x7d, 0xbd, 0x9d, - 0x59, 0x69, 0xf0, 0xb9, 0x23, 0xb1, 0xec, 0x8e, 0x46, 0x17, 0x91, 0x86, - 0x4d, 0x09, 0xe6, 0x26, 0x76, 0x12, 0xc5, 0x0a, 0xde, 0x1d, 0x00, 0xd3, - 0x79, 0x46, 0xe0, 0xcd, 0xff, 0xff, 0xf1, 0x3c, 0xfc, 0x03, 0x6c, 0xc5, - 0x3f, 0x77, 0x0e, 0x5c, 0x9d, 0x82, 0xc4, 0x96, 0x5f, 0xb3, 0x8c, 0x1c, - 0x2c, 0xbf, 0xf3, 0xca, 0x7e, 0x68, 0x2e, 0xe1, 0x54, 0x4c, 0x8b, 0x4f, - 0x0a, 0x3d, 0xf5, 0x08, 0x46, 0x13, 0xde, 0xf6, 0x31, 0x65, 0xdd, 0x62, - 0xcb, 0xf6, 0x82, 0xee, 0x15, 0x45, 0xbc, 0xb4, 0xf8, 0x3e, 0x71, 0x8e, - 0x60, 0xbd, 0xff, 0xe9, 0xec, 0x79, 0x4f, 0xcd, 0x05, 0xdc, 0x2a, 0x8a, - 0x4d, 0x73, 0x76, 0xdc, 0xac, 0xbf, 0xf7, 0x00, 0xff, 0x6b, 0x40, 0x9b, - 0x8b, 0x2e, 0x67, 0xcb, 0x2f, 0xec, 0xf1, 0x44, 0x31, 0x65, 0xfd, 0xf7, - 0xe2, 0x69, 0xff, 0x59, 0x77, 0x67, 0xb6, 0x11, 0xb1, 0x84, 0x2c, 0x42, - 0xe8, 0xc3, 0x95, 0xd4, 0x32, 0x3f, 0x65, 0x39, 0x97, 0x91, 0xe6, 0xf2, - 0x14, 0x9b, 0xcd, 0x44, 0x8c, 0xca, 0xff, 0x4f, 0xcd, 0x05, 0xdc, 0x2a, - 0x88, 0x75, 0x7e, 0xd0, 0x5d, 0xc2, 0xa8, 0x96, 0x17, 0xd9, 0xfb, 0x0d, - 0x65, 0xfa, 0x7b, 0x1e, 0x53, 0xf0, 0xf5, 0xb7, 0x0d, 0x2f, 0xf4, 0xfc, - 0xd0, 0x5d, 0xc2, 0xa8, 0x8c, 0x17, 0xfa, 0x78, 0x25, 0x9c, 0x7e, 0x2c, - 0xbf, 0xff, 0x3f, 0xfb, 0x99, 0x3c, 0x9f, 0xd2, 0xcf, 0x60, 0xd6, 0x5f, - 0xff, 0x8d, 0x87, 0xa9, 0xfe, 0xdc, 0xce, 0xfa, 0x3e, 0x69, 0x65, 0x12, - 0x3a, 0xb8, 0x6b, 0xe5, 0x9b, 0xe9, 0xf2, 0xce, 0x2c, 0xbf, 0xff, 0xe9, - 0x72, 0x78, 0x7a, 0xf3, 0x07, 0xb9, 0xa6, 0xeb, 0xb3, 0x33, 0x8b, 0x2f, - 0xd9, 0xef, 0xe0, 0x2b, 0x2f, 0xff, 0x47, 0x8f, 0xf8, 0x90, 0xfb, 0x04, - 0x15, 0x97, 0xed, 0x05, 0xdc, 0x2a, 0x88, 0xf5, 0x7d, 0xc7, 0xfb, 0x7a, - 0xcb, 0xa5, 0x3f, 0x0f, 0x67, 0xc6, 0x97, 0xff, 0xf3, 0xcf, 0x20, 0x67, - 0x70, 0xbf, 0xc2, 0xf7, 0x71, 0x65, 0xa7, 0xfc, 0x9e, 0x2c, 0xce, 0x5a, - 0x28, 0x78, 0x51, 0x11, 0x7d, 0xfb, 0x41, 0x77, 0x0a, 0xa2, 0xc3, 0x5f, - 0xe9, 0x14, 0x67, 0x30, 0x96, 0x5c, 0x72, 0x59, 0x69, 0xf8, 0x7f, 0x5f, - 0x1a, 0x7e, 0x61, 0x7a, 0x0b, 0x65, 0x97, 0xe2, 0x8f, 0xe4, 0xc5, 0x95, - 0xd3, 0xc4, 0xf0, 0xe5, 0xff, 0xff, 0x44, 0x72, 0x7f, 0x86, 0x6c, 0xfa, - 0x5c, 0xfa, 0x59, 0xad, 0x96, 0x5d, 0x1a, 0x9e, 0x88, 0xe2, 0x22, 0xbf, - 0xd3, 0xf3, 0x41, 0x77, 0x0a, 0xa2, 0xe7, 0x5f, 0xff, 0xff, 0xfd, 0x0d, - 0xaa, 0x5b, 0x07, 0xb3, 0xa7, 0x77, 0x72, 0x7e, 0xc0, 0x15, 0xb8, 0x43, - 0x63, 0xed, 0xb6, 0x0b, 0x27, 0x4e, 0xee, 0xe2, 0xca, 0x85, 0xf3, 0x6d, - 0xa1, 0x2f, 0x24, 0x5c, 0x8c, 0xac, 0x25, 0xe7, 0x1f, 0x4b, 0x21, 0xa5, - 0xd8, 0xc2, 0xbc, 0x5e, 0xde, 0x83, 0x7f, 0xa7, 0xe6, 0x82, 0xee, 0x15, - 0x44, 0x3c, 0xbf, 0xfb, 0x7e, 0x8f, 0x90, 0x37, 0x23, 0x62, 0xcb, 0xe0, - 0xbb, 0x85, 0x51, 0x13, 0x2f, 0xff, 0xf6, 0x8b, 0x36, 0xc1, 0xe3, 0x40, - 0xd6, 0x07, 0xb1, 0xbd, 0x65, 0xf0, 0x19, 0x83, 0x59, 0x6c, 0x84, 0x42, - 0xb7, 0xb1, 0xd8, 0x0b, 0x2f, 0xf7, 0x80, 0xff, 0x76, 0x37, 0xac, 0xad, - 0x26, 0x48, 0x50, 0xb3, 0xe1, 0x57, 0x84, 0x6f, 0xf9, 0xdc, 0xbf, 0xd1, - 0xc0, 0xab, 0x2f, 0x10, 0x36, 0x59, 0x7e, 0xff, 0x93, 0xb0, 0x6b, 0x2f, - 0xf1, 0xb5, 0x85, 0x9f, 0x79, 0x65, 0x19, 0xef, 0x68, 0xae, 0xff, 0xfd, - 0x1a, 0xff, 0xb1, 0xbe, 0x68, 0x86, 0x73, 0x06, 0xb2, 0xff, 0xbb, 0xd8, - 0xdf, 0x2c, 0xd4, 0x2c, 0xb7, 0xba, 0x89, 0x27, 0x58, 0xbf, 0xe3, 0xf1, - 0xfb, 0x3f, 0x8d, 0x2c, 0xbe, 0xdb, 0xa0, 0xd9, 0x65, 0x62, 0x21, 0x5c, - 0xa0, 0x07, 0x17, 0xe7, 0xd9, 0x91, 0xa5, 0x97, 0x0f, 0xab, 0x2f, 0xff, - 0x7a, 0x59, 0xad, 0x3c, 0xb1, 0x90, 0x15, 0x95, 0x87, 0xc0, 0xe2, 0xf7, - 0xfd, 0x12, 0xc3, 0x2c, 0x81, 0x56, 0x5f, 0xff, 0xbb, 0x1a, 0xff, 0x98, - 0x3f, 0x01, 0xc3, 0x9a, 0x59, 0x53, 0x22, 0x33, 0xc6, 0xd7, 0x79, 0x8b, - 0x2f, 0xfc, 0x26, 0xdc, 0x83, 0xfb, 0xd0, 0xc5, 0x97, 0xff, 0x71, 0xdc, - 0x38, 0x18, 0x28, 0x0a, 0xcb, 0x67, 0x51, 0x05, 0xc4, 0x1b, 0xd1, 0xae, - 0x2c, 0xbf, 0xe8, 0x90, 0x99, 0xae, 0x63, 0x4b, 0x2f, 0xf4, 0xa0, 0x53, - 0xeb, 0xec, 0xb2, 0xb6, 0x3e, 0xe3, 0x3a, 0xac, 0x4e, 0x47, 0xe2, 0x4e, - 0xc2, 0x67, 0xf2, 0x80, 0x42, 0x2a, 0xff, 0x87, 0x9b, 0xf4, 0xfb, 0xfa, - 0x6b, 0x2f, 0xcd, 0x02, 0x35, 0xb2, 0xcb, 0x1c, 0xe3, 0xe6, 0x68, 0xf2, - 0xfa, 0x5d, 0x13, 0x8b, 0x2e, 0x71, 0x15, 0x10, 0xba, 0xde, 0xf8, 0xf2, - 0x00, 0x49, 0x7e, 0xee, 0x6c, 0x02, 0x59, 0x7c, 0xfa, 0x8d, 0xeb, 0x28, - 0x67, 0x97, 0xf9, 0x45, 0xfa, 0x69, 0x63, 0x92, 0xcb, 0xe2, 0x20, 0x0a, - 0xb2, 0xd3, 0xe1, 0x91, 0x2d, 0x91, 0xb4, 0x0a, 0x84, 0x67, 0x1a, 0x7b, - 0xec, 0x67, 0x0e, 0x5c, 0x50, 0x88, 0xe4, 0xa3, 0xdf, 0x42, 0xf0, 0x0e, - 0x5b, 0xdd, 0x37, 0x08, 0xc4, 0x27, 0xbf, 0xf6, 0x81, 0xb6, 0x76, 0x62, - 0x81, 0xac, 0xbe, 0x18, 0x90, 0x4b, 0x2f, 0xff, 0xe3, 0xf0, 0x34, 0xfc, - 0xc2, 0xee, 0x61, 0x4b, 0x8b, 0x2a, 0x0f, 0xe9, 0xc8, 0xaf, 0xc0, 0xd7, - 0xf3, 0xa1, 0x65, 0xdd, 0x75, 0x97, 0x18, 0xab, 0x2c, 0x05, 0x95, 0x86, - 0xfa, 0x61, 0x6e, 0x0b, 0xdd, 0xef, 0x2c, 0xbd, 0xff, 0x27, 0xc2, 0x71, - 0x1d, 0x85, 0xd7, 0x08, 0x3c, 0xd2, 0x21, 0x75, 0xff, 0xf6, 0x1c, 0xb9, - 0x3f, 0x3e, 0x93, 0xec, 0x20, 0x56, 0x54, 0x22, 0xe7, 0xac, 0xb7, 0xfc, - 0xdd, 0xb6, 0x35, 0x9e, 0x3e, 0x81, 0x65, 0xf7, 0x0f, 0x66, 0xc2, 0xcb, - 0xf0, 0x08, 0x8e, 0x4b, 0x29, 0xbb, 0x44, 0x7b, 0x74, 0x85, 0xc2, 0x7b, - 0xff, 0x37, 0x6d, 0x83, 0xda, 0x27, 0x07, 0x98, 0xb2, 0xe6, 0xd0, 0x96, - 0x5e, 0xee, 0x69, 0x65, 0x37, 0x68, 0x81, 0x6e, 0x92, 0xba, 0x37, 0x7e, - 0xcf, 0x1e, 0xb1, 0x65, 0xff, 0x67, 0x84, 0xd9, 0xf4, 0x73, 0x2c, 0xbf, - 0xa4, 0xda, 0x6c, 0xd8, 0x6e, 0x0d, 0xc5, 0x65, 0xfe, 0xce, 0x73, 0x0c, - 0x82, 0xb2, 0x9b, 0xa4, 0x6b, 0xb6, 0x09, 0x9b, 0x93, 0xb2, 0x45, 0xbf, - 0x9b, 0xb1, 0x3b, 0xdc, 0xd9, 0x65, 0xba, 0xb2, 0x9b, 0xb3, 0xc6, 0x01, - 0xad, 0xf0, 0xf0, 0xa6, 0x59, 0x71, 0xf9, 0x65, 0xbc, 0x66, 0xe3, 0xa4, - 0x57, 0xfb, 0xef, 0x7d, 0x20, 0x10, 0xab, 0x2f, 0xfd, 0x13, 0x16, 0x6f, - 0x76, 0x30, 0xd6, 0x53, 0x9f, 0xb0, 0x0d, 0xef, 0xff, 0xfe, 0xe8, 0x06, - 0x79, 0xa9, 0x8b, 0x37, 0xf7, 0x07, 0x1c, 0xe4, 0x0a, 0xb2, 0xff, 0xf1, - 0xcd, 0x2c, 0xfa, 0x53, 0x98, 0xee, 0x4b, 0x2e, 0x76, 0xf5, 0x97, 0xff, - 0xfb, 0x99, 0xe9, 0xdd, 0xc0, 0xc3, 0x45, 0x83, 0xe9, 0xcc, 0xb2, 0xcd, - 0x8c, 0x4f, 0xe4, 0x58, 0x4e, 0x04, 0x87, 0xae, 0x8e, 0x99, 0xe1, 0x9b, - 0xb7, 0x05, 0x59, 0x7c, 0xf2, 0x8f, 0xd6, 0x5f, 0xba, 0xfe, 0x79, 0x2c, - 0xbf, 0x8f, 0x45, 0x99, 0xa5, 0x97, 0x83, 0xb7, 0x56, 0x5f, 0xa3, 0x8d, - 0xad, 0xbb, 0x6e, 0xd6, 0x5c, 0xc6, 0x2c, 0xae, 0x1e, 0x78, 0x0e, 0x2f, - 0xd1, 0xc0, 0x74, 0xd6, 0x54, 0xe4, 0x5b, 0x49, 0xb7, 0x84, 0x57, 0xfd, - 0xc2, 0xcf, 0xa4, 0x4f, 0xb2, 0xcb, 0xf7, 0x00, 0xe5, 0xfa, 0xcb, 0x32, - 0x71, 0xf0, 0xf8, 0xe6, 0xf7, 0x0f, 0xf5, 0x95, 0x87, 0x8e, 0x65, 0x57, - 0x9a, 0x69, 0xa4, 0x97, 0xe7, 0x2f, 0x77, 0x12, 0x4f, 0x34, 0x17, 0xff, - 0xff, 0x46, 0xd3, 0xb8, 0x08, 0xfb, 0xdd, 0xc6, 0x67, 0x8a, 0x3f, 0xfe, - 0x16, 0x5f, 0x7a, 0x6c, 0xf2, 0xcb, 0x0d, 0x65, 0x0d, 0x15, 0x4e, 0xec, - 0x02, 0x3a, 0x1a, 0x6a, 0x3f, 0xa0, 0x14, 0x38, 0xaf, 0xdd, 0x26, 0xe3, - 0xb8, 0xde, 0xb2, 0xe7, 0x75, 0x96, 0xe9, 0x9e, 0x4b, 0x9a, 0x5f, 0xff, - 0xdf, 0xea, 0x27, 0x6a, 0x3d, 0xf4, 0xa0, 0x5d, 0x3b, 0x4b, 0x2f, 0xfc, - 0x73, 0x4e, 0xec, 0x1e, 0x81, 0xba, 0xb2, 0xa1, 0x14, 0xbf, 0xb0, 0xdf, - 0xda, 0x36, 0xfd, 0x73, 0x8b, 0x2f, 0xe2, 0x07, 0x8f, 0x68, 0x59, 0x7f, - 0xe3, 0x16, 0x0a, 0x39, 0x06, 0xc5, 0x97, 0xed, 0xe0, 0x96, 0x71, 0x65, - 0xf7, 0xe6, 0x40, 0x59, 0x58, 0x79, 0x80, 0x2a, 0xbe, 0xc1, 0xe6, 0xcb, - 0x2f, 0xb7, 0x67, 0x43, 0x74, 0xb2, 0xed, 0x42, 0xca, 0x1a, 0xf1, 0x6e, - 0x11, 0x04, 0x9f, 0xe8, 0x70, 0x9c, 0xa2, 0xbd, 0xd7, 0xf9, 0xa1, 0x97, - 0xa2, 0x36, 0x18, 0xf4, 0xb4, 0xa1, 0x11, 0xe2, 0x1d, 0xe4, 0x4d, 0xe5, - 0x97, 0x8b, 0x3c, 0xb2, 0xff, 0xf7, 0xd2, 0xe7, 0x20, 0xfe, 0xf7, 0xa1, - 0x8b, 0x28, 0x8f, 0x9d, 0xa1, 0xbb, 0xff, 0x8b, 0xc5, 0x9b, 0xdc, 0xc3, - 0x84, 0xb2, 0xfa, 0x30, 0x66, 0xb2, 0x8c, 0xf8, 0x9a, 0x42, 0xbc, 0x0f, - 0x71, 0x65, 0xff, 0x44, 0x9a, 0x7d, 0x7a, 0x31, 0x65, 0xff, 0xff, 0xff, - 0x72, 0x77, 0x73, 0x68, 0x6b, 0xe9, 0x72, 0x70, 0x03, 0xad, 0x44, 0xe9, - 0x85, 0xfa, 0x74, 0xee, 0xee, 0x2c, 0xbf, 0xbe, 0x9d, 0x36, 0x60, 0x56, - 0x54, 0x27, 0xaf, 0x90, 0x84, 0x09, 0x11, 0x0e, 0xf8, 0xe0, 0x10, 0xab, - 0xbf, 0xa5, 0x26, 0x4d, 0x0d, 0xeb, 0x2d, 0xfa, 0xca, 0x23, 0xc4, 0x01, - 0x95, 0xe2, 0xdc, 0x85, 0x97, 0x6e, 0x37, 0x6b, 0x2f, 0xf3, 0xfd, 0xfe, - 0x8f, 0xef, 0xd6, 0x5f, 0xf8, 0x0c, 0x8c, 0xe1, 0x66, 0xf7, 0x59, 0x5d, - 0x3f, 0x5e, 0x1b, 0xde, 0x9d, 0x20, 0xac, 0xa8, 0x4c, 0x53, 0x08, 0x45, - 0x1e, 0x38, 0x4a, 0x30, 0x8a, 0xff, 0xfe, 0xd4, 0xe2, 0xcd, 0xf9, 0xa9, - 0x4e, 0x81, 0xbc, 0xdc, 0x59, 0x7f, 0xf6, 0x34, 0xde, 0xc0, 0x1b, 0x30, - 0xbf, 0x59, 0x7f, 0xff, 0xef, 0xa0, 0x52, 0xc1, 0xf4, 0xe6, 0x9d, 0xcc, - 0xfa, 0x5a, 0xc6, 0x96, 0x51, 0xa2, 0xe8, 0x92, 0x2b, 0x13, 0x3c, 0x28, - 0xc6, 0xef, 0xbc, 0x08, 0xd9, 0x65, 0xfd, 0x27, 0xd7, 0x0c, 0x6b, 0x2f, - 0xec, 0xee, 0x32, 0x02, 0xb2, 0xa0, 0xf6, 0x64, 0x5b, 0x7e, 0x3d, 0x1e, - 0xfc, 0x59, 0x46, 0x8c, 0x5f, 0x3e, 0x37, 0x90, 0xdf, 0x6e, 0x66, 0xa1, - 0x65, 0xff, 0xfd, 0xf4, 0xb8, 0xcc, 0x29, 0xcd, 0xe7, 0xdd, 0x8f, 0x34, - 0xb2, 0xdb, 0xab, 0x2b, 0x0f, 0xd4, 0x2c, 0x37, 0xff, 0xfe, 0x6a, 0x71, - 0x60, 0x7a, 0x65, 0x80, 0xfb, 0xd3, 0x9d, 0xac, 0x15, 0x65, 0xfe, 0x14, - 0x60, 0x8e, 0x94, 0x2c, 0xbf, 0xa5, 0xc1, 0x41, 0x1f, 0x2c, 0xbe, 0xc1, - 0xbc, 0x96, 0x57, 0xc7, 0xa2, 0xd1, 0x85, 0xf6, 0xa2, 0x36, 0x59, 0x7d, - 0x34, 0x79, 0xd6, 0x5c, 0xed, 0x70, 0xf1, 0x00, 0x45, 0x7b, 0x7f, 0x84, - 0x59, 0x50, 0x9d, 0x66, 0x39, 0x1c, 0x21, 0x09, 0xa1, 0xa2, 0xeb, 0xff, - 0xf1, 0x60, 0xfa, 0x06, 0xb8, 0x7e, 0xe9, 0xbf, 0xeb, 0x2f, 0xf1, 0x66, - 0xf9, 0xd2, 0x64, 0x96, 0x56, 0x91, 0x1b, 0xc5, 0x6b, 0xb9, 0xbd, 0x65, - 0x41, 0xbc, 0x01, 0x1d, 0xf7, 0xfe, 0x3d, 0x96, 0x5f, 0xef, 0x74, 0xcb, - 0xf1, 0x18, 0xb2, 0xff, 0xfe, 0xe9, 0xe1, 0x61, 0x8f, 0x23, 0xf7, 0x0b, - 0xe9, 0x65, 0xfe, 0xda, 0x18, 0x51, 0xf7, 0xeb, 0x2a, 0x48, 0xc1, 0xf8, - 0xd5, 0xd5, 0xef, 0xdd, 0x9c, 0xf9, 0xc5, 0x95, 0x07, 0xb3, 0x86, 0x17, - 0xff, 0x3e, 0xa5, 0x3b, 0xc5, 0x12, 0xcf, 0x2c, 0xa8, 0x5e, 0x5e, 0xc8, - 0x76, 0xfc, 0x64, 0x70, 0x99, 0xd4, 0x79, 0xbd, 0x8c, 0x59, 0xc8, 0x0a, - 0x33, 0xe0, 0x10, 0x5b, 0x75, 0x65, 0xbc, 0xb2, 0xe8, 0xfd, 0x65, 0xff, - 0xe3, 0x03, 0x6e, 0x27, 0x70, 0x1f, 0xb3, 0x3c, 0xb2, 0xbe, 0x3e, 0x8d, - 0x0b, 0xdf, 0xfa, 0x03, 0xc8, 0x3f, 0xbd, 0x0c, 0x59, 0x4b, 0x2f, 0x68, - 0x1b, 0xab, 0x2a, 0x46, 0xaf, 0xc1, 0x74, 0x48, 0x8a, 0x03, 0x4d, 0xf7, - 0xfc, 0xdb, 0xcb, 0x2f, 0xfc, 0xe2, 0xce, 0xf3, 0xb9, 0x4e, 0xd9, 0x65, - 0x41, 0xf4, 0x11, 0x2d, 0xe7, 0xf7, 0x16, 0x5c, 0x0d, 0x96, 0x54, 0x8d, - 0xa6, 0x87, 0x2f, 0xd9, 0x2e, 0xbc, 0x96, 0x5c, 0x5e, 0x98, 0xf2, 0x3a, - 0x43, 0x7f, 0x9c, 0x84, 0xef, 0x60, 0x6b, 0x2f, 0xe0, 0x06, 0x70, 0xfe, - 0x69, 0x65, 0xfe, 0x6b, 0xb8, 0x5f, 0x40, 0xab, 0x2f, 0xf0, 0x7b, 0x9e, - 0xd6, 0x34, 0xb2, 0xa0, 0xfa, 0x4c, 0xd6, 0xed, 0x49, 0x65, 0x42, 0x66, - 0x9f, 0x17, 0x19, 0x9e, 0xa1, 0x38, 0xc2, 0x0b, 0xfb, 0x83, 0x27, 0x7e, - 0xac, 0xbf, 0xda, 0x81, 0xc7, 0x62, 0x4b, 0x2f, 0xff, 0xfc, 0x7f, 0x79, - 0xfa, 0x58, 0x3e, 0x9c, 0xdc, 0x0e, 0x19, 0x4c, 0xb2, 0xff, 0xfa, 0x3d, - 0x38, 0x80, 0xdf, 0x3b, 0x3d, 0xb9, 0x9e, 0x59, 0x46, 0x8f, 0x7d, 0x19, - 0x01, 0xb2, 0xe7, 0xf2, 0xcb, 0xff, 0xbb, 0x02, 0xce, 0xf1, 0x3f, 0xa3, - 0xcb, 0x2f, 0xf4, 0xef, 0xa4, 0x7d, 0x03, 0x16, 0x57, 0x51, 0x27, 0xf8, - 0xb1, 0x23, 0x5f, 0x9a, 0x7e, 0xcc, 0xdd, 0xac, 0xbf, 0xec, 0x1c, 0xef, - 0x0a, 0x6d, 0x71, 0x65, 0xb3, 0x47, 0xd9, 0xbc, 0xbe, 0xff, 0xda, 0x9a, - 0x77, 0x20, 0xf6, 0x7f, 0x2c, 0xa8, 0x4c, 0x1c, 0x70, 0x9c, 0x01, 0x4d, - 0xcf, 0xfa, 0xcb, 0xff, 0xe9, 0xc5, 0x1c, 0x8d, 0x8b, 0x07, 0xd3, 0x99, - 0x65, 0xff, 0xff, 0xdc, 0xd1, 0x44, 0xd3, 0x84, 0xf1, 0xcb, 0x3e, 0xf6, - 0x6f, 0x2c, 0xe2, 0xca, 0xd2, 0x32, 0x09, 0x46, 0xbc, 0x98, 0x08, 0x21, - 0xbf, 0x4b, 0x2f, 0x7a, 0x70, 0xab, 0x2e, 0x9a, 0x4b, 0x2a, 0x0f, 0x0f, - 0xe0, 0xbd, 0x10, 0x5f, 0xfc, 0x5e, 0xe6, 0xf3, 0xf4, 0x61, 0x4c, 0xb2, - 0xfd, 0xa3, 0xe4, 0x7c, 0xb2, 0xb0, 0xfb, 0x5d, 0x16, 0xff, 0x6c, 0xd8, - 0x9a, 0x47, 0xee, 0x2c, 0xba, 0x3f, 0x59, 0x7e, 0x2f, 0x77, 0x1b, 0xd6, - 0x5f, 0xa6, 0xe3, 0xe8, 0x55, 0x97, 0x9d, 0xad, 0x41, 0xea, 0x61, 0x55, - 0xfe, 0x31, 0x5e, 0x45, 0x0c, 0x59, 0x52, 0x4c, 0xa4, 0xc8, 0x26, 0x3a, - 0xd3, 0x5f, 0x4c, 0xaf, 0x8c, 0x2f, 0xa5, 0x97, 0x98, 0xed, 0x2c, 0xb7, - 0x24, 0x6f, 0x9c, 0x86, 0xff, 0x18, 0xf0, 0xa5, 0xdc, 0x59, 0x7f, 0xdd, - 0x3d, 0x4d, 0xd7, 0xcd, 0x2c, 0xbf, 0xff, 0xff, 0xbf, 0xe1, 0x63, 0xfd, - 0x38, 0x7d, 0x04, 0xe2, 0xcf, 0xa5, 0x80, 0xd8, 0xb1, 0xfe, 0x59, 0x41, - 0x46, 0x41, 0x9c, 0xde, 0x77, 0x0a, 0xa2, 0x98, 0x54, 0x26, 0xd3, 0xb1, - 0x36, 0x43, 0xe4, 0x24, 0x57, 0xfe, 0xc2, 0xfa, 0x5c, 0xf4, 0x6a, 0x65, - 0x97, 0xfe, 0x7f, 0xb0, 0xf4, 0x6c, 0x81, 0x56, 0x5e, 0xc3, 0xfd, 0x65, - 0xb1, 0x65, 0xef, 0x8b, 0x3f, 0x35, 0x9b, 0xc7, 0x28, 0xd1, 0xbf, 0xa4, - 0x07, 0x6a, 0xbd, 0x80, 0xd2, 0xcb, 0xb6, 0x99, 0x65, 0x9a, 0x59, 0x71, - 0x8d, 0x65, 0x6e, 0x9a, 0x8e, 0x09, 0x5c, 0x39, 0x96, 0x5f, 0xf6, 0xb0, - 0x7d, 0x86, 0x98, 0x05, 0x97, 0x0b, 0xb2, 0xca, 0x84, 0x68, 0x62, 0x0b, - 0x09, 0x3a, 0x30, 0xd1, 0xd5, 0xcc, 0xfd, 0x65, 0xed, 0x75, 0xe7, 0x1f, - 0x0f, 0xe9, 0x37, 0xfa, 0x77, 0xd2, 0x28, 0xce, 0x2c, 0xaf, 0x93, 0xb8, - 0x38, 0xd3, 0x5c, 0xda, 0xff, 0xfd, 0xf9, 0xf2, 0x77, 0x5f, 0x9e, 0x89, - 0xb9, 0xdc, 0x59, 0x4b, 0x2f, 0xe0, 0x18, 0xcc, 0x8d, 0x65, 0x85, 0x33, - 0x6c, 0xc0, 0xbb, 0xf3, 0xf3, 0xaf, 0x25, 0x97, 0xee, 0xbc, 0x8d, 0x8b, - 0x2b, 0x47, 0xeb, 0xd2, 0x76, 0x89, 0xef, 0xe3, 0xeb, 0x9e, 0xd0, 0xb2, - 0xf4, 0xa3, 0xe5, 0x97, 0xff, 0xe2, 0xcf, 0xbd, 0x3b, 0xaf, 0xbe, 0x70, - 0xfa, 0x0d, 0x96, 0x5f, 0xbb, 0x1b, 0x63, 0x4b, 0x2c, 0xc8, 0x44, 0x38, - 0xd7, 0xaf, 0xbd, 0x2c, 0xf2, 0xca, 0x84, 0xd2, 0xb0, 0xc3, 0xe2, 0xc7, - 0x85, 0x20, 0x0a, 0x2f, 0xdf, 0x04, 0xa3, 0x7a, 0xcb, 0xf9, 0xf5, 0x34, - 0x8f, 0xab, 0x2f, 0xf0, 0x36, 0xe9, 0xef, 0xc9, 0x96, 0x5f, 0xf9, 0xfe, - 0xe0, 0x9d, 0xec, 0x10, 0x56, 0x56, 0x23, 0x3d, 0xca, 0xb8, 0x5c, 0x03, - 0x7b, 0xb9, 0xc5, 0x96, 0xc5, 0x97, 0xfe, 0x98, 0xc5, 0x3f, 0x16, 0x37, - 0xce, 0xd1, 0xa7, 0xde, 0x2f, 0x7f, 0xff, 0x8b, 0x03, 0xef, 0x47, 0xb9, - 0x31, 0x63, 0x53, 0xa1, 0xba, 0x59, 0x7f, 0xe0, 0xc3, 0x3b, 0x9c, 0xc3, - 0x25, 0x95, 0x08, 0xa4, 0xeb, 0x45, 0xfb, 0x51, 0xbe, 0x34, 0xb2, 0xfe, - 0x72, 0x9c, 0x38, 0x25, 0x95, 0x09, 0xbc, 0x64, 0x60, 0x06, 0x44, 0x02, - 0x9b, 0xfe, 0x86, 0x82, 0x7b, 0x67, 0xde, 0x59, 0x4d, 0xcb, 0x6a, 0x4c, - 0xda, 0xc5, 0x21, 0xe7, 0x68, 0x56, 0xca, 0x11, 0x43, 0x8f, 0x43, 0x13, - 0xc5, 0x8c, 0x8c, 0x31, 0xe4, 0xfd, 0x19, 0xb1, 0xb6, 0x4d, 0x1e, 0x2e, - 0xa3, 0xf2, 0x64, 0x64, 0x3d, 0x8f, 0x9b, 0xf3, 0x62, 0x94, 0x9d, 0xc8, - 0xc7, 0x7d, 0x1e, 0xd6, 0xf4, 0x1b, 0xfe, 0xd3, 0xb5, 0x39, 0xc6, 0xfb, - 0x2c, 0xbf, 0x9d, 0xa9, 0x88, 0xc6, 0xb2, 0xf1, 0xec, 0xc5, 0x97, 0xfb, - 0xee, 0xe7, 0xec, 0x80, 0xac, 0xbf, 0xff, 0xc3, 0xcd, 0x9c, 0xbd, 0xc8, - 0x0c, 0xe6, 0x30, 0xc8, 0x2b, 0x2f, 0xe1, 0xf1, 0xe3, 0xe9, 0x2c, 0xa8, - 0x44, 0x83, 0xb1, 0x5f, 0xe9, 0xba, 0x70, 0xc7, 0x1a, 0xcb, 0xfd, 0x3b, - 0x58, 0x7d, 0x81, 0xac, 0xa8, 0x3e, 0x72, 0x33, 0xa1, 0x53, 0xf4, 0xd1, - 0xe7, 0x4b, 0x9c, 0x74, 0xa1, 0x8a, 0x08, 0x44, 0x5f, 0x61, 0x0b, 0xba, - 0xb2, 0xff, 0xff, 0xfd, 0xd3, 0xf7, 0x73, 0x51, 0xbe, 0x73, 0x00, 0xdf, - 0x3b, 0x3e, 0x96, 0x00, 0xbf, 0xe2, 0xcb, 0x78, 0xd1, 0x67, 0xc2, 0x5b, - 0xfc, 0xf2, 0x9b, 0xa7, 0xf7, 0x96, 0x5f, 0xfa, 0x03, 0x38, 0x9f, 0x8c, - 0x82, 0x59, 0x7f, 0xfb, 0xa6, 0x1e, 0xe4, 0xee, 0x03, 0xb1, 0xba, 0xb2, - 0xfe, 0x28, 0xfa, 0x46, 0x4b, 0x29, 0x65, 0xfe, 0xce, 0x96, 0x7b, 0xa6, - 0xb2, 0x86, 0x7d, 0x04, 0x59, 0xe0, 0xbb, 0xfe, 0xf4, 0x4b, 0x93, 0x4a, - 0x36, 0x59, 0x6c, 0xc4, 0xc8, 0x3e, 0x85, 0xbf, 0x8b, 0xaf, 0xff, 0xbd, - 0xdc, 0xfe, 0x73, 0x23, 0x3c, 0x3c, 0x25, 0x96, 0x69, 0x65, 0xfc, 0xe3, - 0xd6, 0x81, 0xb2, 0xcb, 0xf4, 0x61, 0x7b, 0x71, 0x65, 0x0a, 0x7d, 0x41, - 0x12, 0x61, 0x7d, 0xf7, 0x8f, 0x58, 0xb2, 0xdf, 0x4e, 0x3d, 0x1c, 0x30, - 0xb7, 0x31, 0x33, 0x67, 0x8c, 0x32, 0x86, 0xac, 0xc9, 0x86, 0xa5, 0x1a, - 0xf7, 0xa3, 0x71, 0xbf, 0xff, 0xfe, 0xcf, 0xa4, 0x7c, 0x2c, 0xdf, 0xdc, - 0x9b, 0xb0, 0x53, 0x4e, 0x70, 0x9e, 0xf5, 0x97, 0xff, 0xff, 0xda, 0x86, - 0x8b, 0x37, 0xf7, 0x35, 0xac, 0xf7, 0x1b, 0xfd, 0x1c, 0xe9, 0xe2, 0xcb, - 0xff, 0xfe, 0xc2, 0x16, 0x76, 0xa3, 0x79, 0xfb, 0x98, 0x29, 0xe9, 0xfe, - 0x59, 0x44, 0x9b, 0x7f, 0xa1, 0x06, 0x24, 0x20, 0x68, 0xd3, 0xf4, 0x04, - 0x77, 0x37, 0xff, 0x8c, 0x73, 0x98, 0x73, 0xa0, 0x6f, 0x37, 0x16, 0x5f, - 0xba, 0x7e, 0xc6, 0x2c, 0xb4, 0x96, 0x53, 0x60, 0xdc, 0x48, 0x9e, 0xda, - 0x84, 0x55, 0xed, 0x08, 0x6b, 0xf4, 0xa3, 0xe9, 0x71, 0x65, 0xff, 0xff, - 0xff, 0xb0, 0x85, 0x9c, 0x7d, 0x04, 0xf9, 0x8f, 0xd0, 0xc2, 0x71, 0x7a, - 0x73, 0xf3, 0xbf, 0x7f, 0x03, 0x49, 0x7f, 0xff, 0xf0, 0x4d, 0xa1, 0x83, - 0x53, 0x81, 0x1b, 0x70, 0x3d, 0x07, 0x7e, 0x76, 0x96, 0x5c, 0x0d, 0xbe, - 0x4d, 0x14, 0xca, 0x79, 0x0a, 0x2b, 0xf8, 0x52, 0xcf, 0x74, 0xd6, 0x5c, - 0x3c, 0x59, 0x50, 0xc8, 0x1b, 0xec, 0xea, 0x73, 0xc3, 0x50, 0xa3, 0x73, - 0x02, 0x1e, 0xe1, 0x6d, 0x9b, 0xd6, 0x59, 0x8b, 0x2f, 0xf3, 0xcb, 0x18, - 0xe5, 0xfa, 0xcb, 0xec, 0xec, 0x4c, 0xb2, 0xf3, 0x03, 0x39, 0xb9, 0x3e, - 0x5e, 0x88, 0xb9, 0x95, 0xff, 0xff, 0xed, 0x04, 0xb3, 0x7c, 0xee, 0x1e, - 0x17, 0xf3, 0x8b, 0x37, 0x96, 0x73, 0x7a, 0xcb, 0xfd, 0x8e, 0xc9, 0xdb, - 0x90, 0xc5, 0x97, 0xff, 0xa5, 0x1c, 0xe8, 0x35, 0x9e, 0xf1, 0xb1, 0x65, - 0x05, 0x10, 0x3f, 0x1b, 0xdf, 0xff, 0x81, 0x13, 0x8b, 0x07, 0xd3, 0x14, - 0x70, 0x2f, 0xeb, 0x2b, 0x13, 0x7d, 0xd4, 0x60, 0x04, 0x49, 0x7f, 0xfe, - 0x32, 0xf7, 0x71, 0xbf, 0xd3, 0x66, 0xeb, 0x97, 0xeb, 0x2f, 0x9a, 0x9d, - 0xc9, 0x96, 0x5b, 0xcb, 0x2a, 0x0d, 0xc3, 0x93, 0xdf, 0xf8, 0xb6, 0x2c, - 0xdf, 0xc0, 0x47, 0xcb, 0x2f, 0xfb, 0xb1, 0xf4, 0xe6, 0xe3, 0xbf, 0xf3, - 0x59, 0x7e, 0xf7, 0xd2, 0x3d, 0xc5, 0x94, 0x33, 0xf1, 0xe2, 0x2d, 0x42, - 0x35, 0x36, 0x85, 0x95, 0x1a, 0x7c, 0x7c, 0x35, 0xf4, 0x24, 0xc1, 0x0f, - 0x3b, 0xff, 0x9a, 0xce, 0x02, 0x05, 0xe4, 0x6a, 0x65, 0x97, 0xda, 0x93, - 0x8d, 0x65, 0xce, 0x15, 0x97, 0xed, 0x66, 0xe1, 0xfe, 0xb2, 0xff, 0xa4, - 0x1e, 0x9f, 0x48, 0x1b, 0x2c, 0xad, 0x8f, 0x94, 0x8a, 0xef, 0x7b, 0x1b, - 0x6b, 0x29, 0xb0, 0x8b, 0xd8, 0x7b, 0xc2, 0x2b, 0xdb, 0x99, 0xd5, 0x97, - 0x0b, 0x0b, 0x2e, 0xc1, 0xac, 0xa6, 0xe9, 0x78, 0x2f, 0x67, 0x99, 0x4b, - 0xa7, 0xc4, 0x77, 0x47, 0xe4, 0x37, 0xfc, 0x64, 0x01, 0xfd, 0xe2, 0xf7, - 0xe3, 0xf7, 0x33, 0xf5, 0x97, 0xee, 0xe6, 0xf3, 0xde, 0xb2, 0xff, 0xff, - 0xc4, 0xfe, 0xec, 0x4d, 0x38, 0xb3, 0xa7, 0xee, 0x00, 0x20, 0x85, 0x97, - 0x67, 0xeb, 0x2f, 0xfe, 0x2f, 0xcb, 0x0e, 0x6e, 0xc1, 0x0a, 0xb2, 0x8c, - 0xf6, 0xdc, 0x5e, 0xfe, 0x97, 0x3c, 0x71, 0xf2, 0xcb, 0xf4, 0x17, 0x5e, - 0x4b, 0x2f, 0x40, 0xe1, 0x65, 0x0c, 0xf0, 0x58, 0x4d, 0x4b, 0x2f, 0x40, - 0xe1, 0x65, 0xfb, 0x3d, 0xc7, 0x9a, 0x71, 0xe4, 0x41, 0x13, 0x02, 0xef, - 0x9b, 0x96, 0xd6, 0xd9, 0x6e, 0x56, 0x5f, 0x1b, 0x90, 0xd6, 0x59, 0xa9, - 0xc7, 0xae, 0x33, 0x7b, 0xfb, 0xfc, 0x7f, 0xa5, 0xc5, 0x95, 0x24, 0x7f, - 0x1c, 0x29, 0x38, 0x57, 0x7f, 0xfe, 0xd0, 0x35, 0xa8, 0x2c, 0x14, 0xfb, - 0xdc, 0x11, 0x65, 0xf7, 0x60, 0x04, 0xb2, 0xf8, 0x0f, 0xf7, 0x96, 0x54, - 0x95, 0xdf, 0x0c, 0xa3, 0x0a, 0xc5, 0x86, 0x47, 0xc4, 0x13, 0x47, 0x6b, - 0xa3, 0x46, 0x2b, 0x74, 0x86, 0xcd, 0xeb, 0x29, 0x65, 0xfd, 0x8c, 0x1f, - 0x73, 0x8b, 0x2f, 0xee, 0x04, 0x2e, 0x42, 0xac, 0xa6, 0xd0, 0xf9, 0xb6, - 0x0b, 0xf1, 0x6d, 0xfe, 0x29, 0xdb, 0xfe, 0x97, 0x26, 0x59, 0x76, 0xdf, - 0x2c, 0xbf, 0x75, 0xf7, 0x63, 0xf5, 0x94, 0x33, 0xfe, 0x73, 0xa6, 0xf1, - 0x9b, 0xfa, 0x62, 0xce, 0xbf, 0x96, 0x5f, 0xc2, 0x9f, 0xdc, 0x07, 0x16, - 0x56, 0x8f, 0x74, 0x8b, 0x6a, 0x13, 0x62, 0xc8, 0x59, 0x9c, 0x23, 0xaf, - 0xf6, 0xb0, 0x73, 0x4a, 0x37, 0x56, 0x5f, 0x68, 0x78, 0x4b, 0x2f, 0xbf, - 0xe6, 0xe8, 0x56, 0x51, 0x9e, 0x40, 0x08, 0x6f, 0xdf, 0xe7, 0x84, 0xd9, - 0x65, 0xfe, 0x6b, 0xd9, 0xd9, 0xdf, 0x71, 0x65, 0x41, 0xf1, 0xb9, 0x5d, - 0x36, 0x55, 0x9b, 0xca, 0x3d, 0xc3, 0x38, 0xeb, 0xf9, 0x42, 0x12, 0xfe, - 0xee, 0x06, 0x50, 0xc5, 0x97, 0xfb, 0xb9, 0x27, 0x2c, 0xf9, 0x65, 0x61, - 0xef, 0xf8, 0xb6, 0xff, 0xff, 0x89, 0xff, 0xe6, 0xd8, 0x65, 0xe2, 0xcd, - 0xf3, 0xb8, 0xd1, 0x2c, 0xbf, 0xbb, 0x85, 0xf4, 0x0a, 0xb2, 0x89, 0x17, - 0x3e, 0x21, 0x69, 0xaa, 0xe1, 0xb7, 0xac, 0xbd, 0x87, 0x32, 0xcb, 0xff, - 0x1e, 0x4d, 0x3b, 0x91, 0xd7, 0xdd, 0x59, 0x7f, 0xd8, 0xff, 0x77, 0x3d, - 0xfb, 0xac, 0xbf, 0xfe, 0x97, 0x01, 0x85, 0x38, 0xb3, 0xbd, 0x71, 0xac, - 0xbf, 0xef, 0xb2, 0x3e, 0x98, 0xa1, 0x8b, 0x2f, 0xef, 0xb9, 0xdc, 0x7d, - 0x2c, 0xbf, 0xff, 0xf1, 0xb3, 0x47, 0x9f, 0x10, 0x3d, 0x1d, 0x9d, 0xbc, - 0xfd, 0x34, 0x2c, 0xa7, 0x44, 0xf7, 0x8b, 0xab, 0x64, 0xf8, 0x86, 0x38, - 0x2a, 0x1f, 0xc7, 0x3d, 0x50, 0xf4, 0x36, 0x2f, 0xff, 0xb1, 0xf6, 0xec, - 0x1f, 0xb9, 0x1b, 0x67, 0x16, 0x5f, 0xf6, 0x6b, 0x68, 0x3d, 0x61, 0x2c, - 0xb3, 0x16, 0x4e, 0x36, 0xf7, 0x8b, 0x06, 0xb2, 0xa0, 0xdf, 0x7c, 0x47, - 0x7d, 0x2d, 0xc0, 0x79, 0x65, 0xfd, 0xf7, 0x33, 0x08, 0x55, 0x97, 0xcc, - 0x12, 0x3f, 0x59, 0x7f, 0xfb, 0x61, 0xe9, 0xc2, 0x59, 0xbf, 0x47, 0xc5, - 0x95, 0x08, 0xc4, 0xc2, 0x63, 0x2e, 0x01, 0x25, 0xfd, 0xee, 0xbc, 0xc2, - 0x31, 0x65, 0xcf, 0xd5, 0x97, 0xf7, 0xa3, 0xf9, 0x67, 0x16, 0x53, 0x9f, - 0xa7, 0xe6, 0x04, 0x2d, 0x78, 0x1f, 0x7e, 0xb2, 0xfe, 0xe4, 0x7d, 0xfe, - 0xa1, 0x65, 0xc3, 0x35, 0x95, 0x0b, 0xae, 0xbb, 0x18, 0x64, 0x7f, 0x81, - 0x60, 0x38, 0x62, 0x6a, 0x1c, 0xaf, 0x0a, 0xe2, 0x2e, 0xe0, 0xfe, 0xf2, - 0xfb, 0xe3, 0x64, 0x75, 0x65, 0xf9, 0xfb, 0x38, 0x70, 0xb2, 0xba, 0x79, - 0x5e, 0x21, 0xbf, 0xbc, 0x51, 0x2c, 0xf2, 0xcb, 0xec, 0x27, 0x92, 0xcb, - 0xef, 0x70, 0x4e, 0x4e, 0x3c, 0xc6, 0xc9, 0x65, 0xfe, 0xf1, 0xed, 0x9d, - 0x07, 0x96, 0x5f, 0x7b, 0x90, 0x2a, 0xcb, 0x4c, 0xb2, 0xfe, 0xc0, 0x67, - 0x43, 0xb2, 0xcb, 0x7d, 0x07, 0x81, 0xc1, 0x2b, 0xdd, 0x81, 0xac, 0xa8, - 0x45, 0x3e, 0x31, 0xcc, 0x51, 0x7c, 0xc6, 0x7d, 0xf2, 0xcb, 0xfa, 0x5e, - 0x3d, 0x89, 0xd6, 0x5f, 0xdd, 0x79, 0x33, 0x46, 0xb2, 0xff, 0xe1, 0x45, - 0x7f, 0x73, 0xc5, 0x1f, 0x49, 0x65, 0xfd, 0xe2, 0x89, 0x67, 0x96, 0x54, - 0x1f, 0x9c, 0x91, 0xee, 0x3e, 0x2c, 0xb3, 0x16, 0x5e, 0xd6, 0x7c, 0xb2, - 0xf6, 0x1e, 0xcb, 0x2f, 0xa1, 0x8c, 0x35, 0x96, 0xcd, 0x8d, 0xef, 0x87, - 0x28, 0x68, 0xa8, 0xe8, 0xb7, 0xe2, 0x24, 0xb5, 0x7f, 0xf9, 0xc5, 0xf0, - 0xb0, 0x52, 0xce, 0x9b, 0x16, 0x5f, 0x8f, 0x9c, 0x86, 0x2c, 0xa3, 0x45, - 0x71, 0x1e, 0xef, 0x4a, 0xa8, 0x5c, 0x52, 0xc6, 0xe1, 0x50, 0x4e, 0x1b, - 0x6c, 0x2f, 0x72, 0x5f, 0xcb, 0x4a, 0x14, 0x00, 0x8d, 0xde, 0xfc, 0x33, - 0x27, 0x1a, 0xcb, 0xdc, 0x1f, 0xcb, 0x2e, 0xfc, 0x2b, 0x2f, 0xff, 0x64, - 0xdd, 0x82, 0x14, 0xb3, 0xdd, 0x02, 0xca, 0x14, 0xf8, 0xba, 0x31, 0x7c, - 0x10, 0x3c, 0x96, 0x54, 0xe4, 0x62, 0xca, 0x10, 0x1f, 0x11, 0xd1, 0xa6, - 0x47, 0xa8, 0x75, 0xdf, 0xff, 0xe3, 0xcf, 0xa5, 0xcf, 0x76, 0x19, 0x06, - 0x39, 0xd0, 0xdd, 0x2c, 0xbf, 0xce, 0x53, 0x83, 0xcf, 0xc6, 0xb2, 0xff, - 0xc0, 0xe4, 0xe6, 0x09, 0xd7, 0xec, 0x2c, 0xbf, 0x67, 0x81, 0x9f, 0x2c, - 0xbc, 0x2e, 0x7c, 0xb2, 0xe8, 0x9a, 0x71, 0xe3, 0x78, 0xa2, 0x89, 0x17, - 0x00, 0x84, 0x45, 0xff, 0xff, 0xf8, 0x05, 0x39, 0xa7, 0xfa, 0x5a, 0x7f, - 0xe7, 0x70, 0x11, 0xf7, 0x70, 0xcb, 0x05, 0x59, 0x7f, 0xff, 0xbc, 0x0c, - 0x29, 0xc7, 0x9e, 0x28, 0xfe, 0x76, 0x18, 0xd6, 0x5f, 0xf3, 0x31, 0x93, - 0x99, 0xbb, 0xbe, 0x4b, 0x2b, 0x48, 0xa3, 0x63, 0x15, 0xff, 0xf6, 0xb5, - 0x9e, 0xe7, 0x4f, 0x27, 0x77, 0xf8, 0x59, 0x46, 0x7e, 0xa0, 0x23, 0xbf, - 0xff, 0xa3, 0xb8, 0x31, 0x41, 0x1d, 0xcf, 0x43, 0x1f, 0xcb, 0x2b, 0x15, - 0x0e, 0xf6, 0x3a, 0x20, 0x10, 0xdf, 0xb0, 0x82, 0x23, 0x16, 0x5f, 0xfd, - 0xdc, 0x82, 0x98, 0xb3, 0xdc, 0x75, 0x96, 0x97, 0x8f, 0xa9, 0xbc, 0xa2, - 0xff, 0xfc, 0x3c, 0x64, 0xe6, 0xff, 0x47, 0x26, 0x93, 0xeb, 0x65, 0x97, - 0xa6, 0x3d, 0xd5, 0x97, 0xff, 0xf7, 0x8f, 0x6c, 0x1c, 0xe6, 0x3c, 0xb4, - 0x7b, 0x3b, 0x16, 0x5f, 0xed, 0x9d, 0x85, 0x1a, 0x99, 0x65, 0xff, 0x7d, - 0x82, 0xfe, 0xcc, 0x9d, 0xac, 0x44, 0x91, 0xaf, 0x5f, 0x7e, 0xef, 0x32, - 0xcb, 0x42, 0xcb, 0xd8, 0x5b, 0x4e, 0x36, 0x61, 0x23, 0xbf, 0xfe, 0xc0, - 0x6a, 0x74, 0xdd, 0x00, 0xa7, 0x84, 0x2a, 0xcb, 0xff, 0xe7, 0xf4, 0x68, - 0x0c, 0x3e, 0x4e, 0xe4, 0xb8, 0xb2, 0xff, 0xb5, 0xb4, 0x6d, 0xb0, 0x35, - 0xb2, 0xcb, 0xff, 0x4e, 0x9b, 0xa0, 0x14, 0xf0, 0x85, 0x59, 0x7f, 0x8a, - 0x77, 0x01, 0xb8, 0x0d, 0x2c, 0xac, 0x3f, 0xc0, 0x21, 0xd4, 0x23, 0x6f, - 0x90, 0xba, 0xbf, 0x0f, 0x3e, 0x72, 0x59, 0x7f, 0xfb, 0x69, 0xdc, 0xe8, - 0x27, 0x7b, 0x9c, 0x8d, 0x2c, 0xbf, 0xfe, 0xec, 0x6d, 0x38, 0xb3, 0x7b, - 0xf7, 0xb1, 0xf2, 0xcb, 0xff, 0xfe, 0xfb, 0x87, 0x8d, 0x4e, 0xee, 0x7b, - 0x99, 0xb4, 0xec, 0x31, 0xac, 0xa1, 0xa3, 0x03, 0x15, 0x2f, 0xf8, 0xb3, - 0x58, 0x1c, 0x31, 0xac, 0xbf, 0xb6, 0xf4, 0xc5, 0x0c, 0x59, 0x7f, 0xd1, - 0x34, 0xe7, 0x89, 0xa2, 0x65, 0x97, 0xff, 0xf6, 0x6d, 0x86, 0x32, 0x07, - 0x67, 0x40, 0xde, 0x6e, 0x2c, 0xbf, 0xec, 0x6b, 0x3a, 0x7a, 0xeb, 0xac, - 0xa8, 0x55, 0x21, 0x84, 0xe7, 0x18, 0x8f, 0x48, 0x9c, 0xd8, 0x8b, 0xf8, - 0x79, 0xe5, 0xda, 0xd9, 0x95, 0xb6, 0x36, 0x71, 0x61, 0xdc, 0x19, 0x48, - 0x9f, 0x42, 0x84, 0xca, 0xe6, 0x5d, 0xd4, 0x2c, 0x99, 0x08, 0x7e, 0x9a, - 0x12, 0xa7, 0x23, 0x2d, 0xf4, 0xab, 0x7b, 0xfd, 0xe2, 0xcf, 0x77, 0x36, - 0x59, 0x7f, 0xe7, 0xd7, 0x73, 0xd0, 0x47, 0xfa, 0xcb, 0xff, 0xe2, 0xcd, - 0xa7, 0x7e, 0x0f, 0x66, 0x33, 0xf6, 0x96, 0x5f, 0x4b, 0xc7, 0xb2, 0xcb, - 0xfe, 0xc6, 0xbe, 0x97, 0x27, 0x78, 0xd6, 0x5f, 0xfa, 0x51, 0x9f, 0xf7, - 0x30, 0x82, 0xb2, 0xff, 0xf7, 0x4c, 0x87, 0x38, 0x40, 0x96, 0x77, 0x16, - 0x5f, 0xf3, 0xfb, 0x93, 0x48, 0x05, 0xe5, 0x95, 0x88, 0xc2, 0x98, 0xf7, - 0xf4, 0xbb, 0xfe, 0xe9, 0xb2, 0x30, 0xbd, 0xc5, 0x97, 0xff, 0xf8, 0x1e, - 0xd0, 0x26, 0x9d, 0xe9, 0xba, 0x0f, 0xfc, 0x78, 0xde, 0xb2, 0xfa, 0x03, - 0x0c, 0x9c, 0x8d, 0x30, 0x98, 0x91, 0xbd, 0x42, 0xb0, 0x10, 0x99, 0xe8, - 0xf5, 0xd5, 0x48, 0x8d, 0xbe, 0x3d, 0x2b, 0xff, 0xfb, 0x58, 0xec, 0x9c, - 0x2b, 0xfd, 0xdc, 0xef, 0x63, 0xcb, 0x2f, 0xb3, 0x53, 0x49, 0x65, 0xff, - 0xc7, 0xf4, 0xb9, 0x38, 0x67, 0xbe, 0x06, 0xb2, 0xf7, 0xd1, 0xba, 0xb2, - 0x85, 0x3e, 0x97, 0x49, 0xbf, 0xec, 0x9a, 0x59, 0xdc, 0xdf, 0xc5, 0x97, - 0xff, 0xe1, 0xf4, 0x1c, 0x9d, 0xd3, 0xf7, 0x73, 0x51, 0xbd, 0x65, 0xfd, - 0x9f, 0x16, 0x67, 0xeb, 0x2b, 0x11, 0x0e, 0x4b, 0x57, 0x43, 0x31, 0x39, - 0x11, 0x61, 0x19, 0xa2, 0x22, 0x86, 0x15, 0xa1, 0x65, 0xf1, 0xe9, 0xfe, - 0x59, 0x71, 0xf8, 0xcd, 0x97, 0x04, 0x2f, 0xf9, 0xc8, 0x3d, 0x36, 0x14, - 0x2c, 0xbf, 0xf8, 0x64, 0xf3, 0x4d, 0x1e, 0xff, 0x38, 0xb2, 0xf4, 0x30, - 0x45, 0x97, 0xff, 0x1e, 0xf3, 0x1c, 0xe8, 0x98, 0x6e, 0xd2, 0xcb, 0xff, - 0xff, 0xc4, 0x62, 0xf5, 0xe6, 0x9c, 0x40, 0x6f, 0x9d, 0x9f, 0x4b, 0x00, - 0x5f, 0xf1, 0x65, 0xfb, 0xa7, 0x05, 0xb2, 0xca, 0x62, 0x2a, 0x37, 0xc2, - 0x06, 0xf9, 0x86, 0x6d, 0x2c, 0xa8, 0x3c, 0xc7, 0x2a, 0xa2, 0x4d, 0xeb, - 0x83, 0xbe, 0x8c, 0xf6, 0xff, 0x6a, 0x36, 0xe9, 0xe0, 0xd6, 0x5f, 0x44, - 0xdc, 0x35, 0x95, 0x25, 0x55, 0x83, 0x2b, 0xc3, 0x63, 0x8f, 0x03, 0x46, - 0xc4, 0x67, 0x7f, 0xff, 0xd9, 0x34, 0xa3, 0x42, 0xb0, 0x8f, 0xe9, 0x70, - 0x7a, 0x3d, 0x96, 0x5e, 0x98, 0x03, 0x59, 0x50, 0xda, 0xa3, 0x65, 0x2c, - 0x0c, 0xe5, 0xf0, 0xe9, 0x7f, 0xb1, 0xf7, 0xbc, 0xb3, 0x02, 0x5c, 0x03, - 0x55, 0xf1, 0x78, 0xf7, 0xac, 0xbe, 0x90, 0x1f, 0xcb, 0x2a, 0x0f, 0x17, - 0x08, 0xef, 0xbd, 0xc7, 0xfd, 0x65, 0xff, 0xdd, 0x39, 0xc7, 0xa0, 0x6c, - 0xfa, 0x0a, 0xcb, 0xe3, 0xeb, 0xec, 0xb2, 0xfb, 0x7c, 0x7a, 0x16, 0x5f, - 0xb9, 0x9e, 0x3e, 0x2c, 0xbf, 0xf8, 0xfd, 0xd3, 0xcc, 0x19, 0x63, 0x4b, - 0x2f, 0xfe, 0x3e, 0x44, 0xd9, 0xd3, 0xd7, 0x5d, 0x65, 0xed, 0x18, 0xab, - 0x2f, 0xff, 0x81, 0x87, 0xdc, 0x0f, 0x4e, 0x73, 0x4c, 0x0a, 0xcb, 0xde, - 0xc6, 0x96, 0x5e, 0xc0, 0x6c, 0x47, 0xdf, 0xe5, 0x2b, 0xf0, 0x1b, 0x64, - 0xfe, 0x59, 0x7e, 0xd9, 0xcb, 0xdc, 0x59, 0x7f, 0x75, 0xf6, 0x9d, 0x2f, - 0x2c, 0xbf, 0x9e, 0x61, 0x39, 0x18, 0xb2, 0xfc, 0xfa, 0x2f, 0x8d, 0x65, - 0x42, 0x36, 0x70, 0xac, 0xca, 0x3a, 0x63, 0xe2, 0xeb, 0xdd, 0x72, 0x59, - 0x43, 0x56, 0xeb, 0x84, 0x02, 0x91, 0x85, 0x1c, 0xc8, 0xa6, 0x23, 0x61, - 0x3f, 0x50, 0x9d, 0x0c, 0xa1, 0x19, 0xe8, 0xc3, 0x1a, 0x47, 0xbe, 0x2f, - 0x43, 0x16, 0x5f, 0xb3, 0xe1, 0xfc, 0x2a, 0xcb, 0xff, 0xbd, 0xd8, 0x28, - 0x0e, 0xa3, 0x09, 0x65, 0xfd, 0x9b, 0x40, 0xaf, 0xc5, 0x97, 0x7d, 0xc9, - 0xc7, 0xde, 0x34, 0x1b, 0xfd, 0xd8, 0x32, 0x7d, 0x0a, 0xb2, 0xfe, 0x83, - 0x27, 0xd0, 0xab, 0x2f, 0xe7, 0xff, 0x5a, 0x3d, 0x4e, 0x3d, 0xee, 0x99, - 0x5e, 0x2c, 0x62, 0xcb, 0x7c, 0xb2, 0xe7, 0x94, 0x8d, 0x6f, 0x06, 0xef, - 0xff, 0xff, 0x4e, 0x64, 0x67, 0xa7, 0x64, 0x8f, 0x79, 0x67, 0x27, 0x40, - 0xde, 0x6e, 0x2c, 0xbf, 0x88, 0x33, 0x9a, 0xe7, 0xeb, 0x2a, 0x48, 0xb0, - 0x77, 0xea, 0x35, 0x57, 0x9a, 0x21, 0x78, 0x4d, 0x7f, 0x08, 0xf2, 0x74, - 0x04, 0x37, 0x2f, 0x73, 0xc6, 0xb2, 0xf4, 0xdf, 0xfc, 0xb2, 0xf4, 0x0b, - 0x38, 0x26, 0xf3, 0xf1, 0xcb, 0xef, 0xff, 0x06, 0xea, 0xcb, 0x7e, 0xb2, - 0xfe, 0x8d, 0x6d, 0x1a, 0xd9, 0x65, 0xf6, 0xa5, 0xcc, 0x59, 0x7f, 0xe3, - 0xc6, 0xb8, 0x09, 0x8a, 0x18, 0xb2, 0xf0, 0x1f, 0x8b, 0x2a, 0x48, 0xac, - 0xc2, 0xf6, 0x11, 0x08, 0x7f, 0x7f, 0xff, 0x1e, 0xa7, 0x61, 0xe1, 0x0b, - 0xd3, 0xc6, 0x60, 0x56, 0x5f, 0xff, 0xf9, 0x9c, 0x0f, 0x60, 0x3f, 0x48, - 0x80, 0x39, 0xc6, 0x2b, 0x97, 0xeb, 0x2f, 0xff, 0xf6, 0xda, 0x86, 0x70, - 0x11, 0x3a, 0x35, 0x03, 0xec, 0x31, 0x65, 0x62, 0x35, 0x0d, 0xc6, 0xb1, - 0x34, 0xfd, 0x46, 0x5d, 0x7e, 0xff, 0x87, 0xf3, 0x4b, 0x2f, 0xdf, 0x43, - 0x36, 0x85, 0x97, 0xdf, 0x48, 0xfa, 0xb2, 0xf6, 0xb3, 0xee, 0x9e, 0x67, - 0x8a, 0x6f, 0xef, 0x9e, 0x45, 0x0c, 0x59, 0x7f, 0xe0, 0x14, 0xde, 0x2c, - 0xd9, 0xc9, 0x65, 0xff, 0xff, 0xed, 0x68, 0xf6, 0x9d, 0xdc, 0xf1, 0x44, - 0xdd, 0xcd, 0xa3, 0xef, 0x00, 0x2b, 0x2f, 0xff, 0xfe, 0x81, 0x7b, 0x13, - 0x8b, 0x00, 0x2c, 0xef, 0xa5, 0xc3, 0x21, 0x23, 0x65, 0x97, 0xef, 0xb8, - 0x78, 0x4b, 0x2b, 0x11, 0x40, 0x07, 0x9a, 0x84, 0xea, 0xb0, 0xb4, 0xcf, - 0xbb, 0x18, 0xed, 0xff, 0xda, 0x2f, 0xb3, 0x80, 0x98, 0xa1, 0x8b, 0x2f, - 0xf8, 0xc5, 0xec, 0x1e, 0xd0, 0x2a, 0xcb, 0x48, 0xcf, 0xff, 0x88, 0xb7, - 0xfc, 0x40, 0x98, 0xb3, 0xaf, 0xe5, 0x97, 0xff, 0x48, 0x1f, 0xf0, 0xb3, - 0x9c, 0x86, 0x96, 0x5f, 0xee, 0xc3, 0x43, 0xeb, 0xb1, 0x65, 0xff, 0x33, - 0x39, 0x3a, 0x62, 0x86, 0x2c, 0xbf, 0xff, 0x73, 0x67, 0x9c, 0x3e, 0xc6, - 0xb5, 0x9b, 0xe3, 0xe5, 0x94, 0x34, 0x65, 0x30, 0xd3, 0xc7, 0x77, 0xff, - 0xfc, 0xfa, 0xee, 0x78, 0xf0, 0xb6, 0xe4, 0x61, 0x0f, 0xb0, 0xb2, 0xfb, - 0xd3, 0xb6, 0xd2, 0xca, 0xf9, 0x11, 0x2e, 0xc7, 0x7f, 0xff, 0xef, 0xb3, - 0x60, 0x37, 0xce, 0xfa, 0x5e, 0x86, 0xa7, 0x66, 0xbf, 0xfe, 0x16, 0x5f, - 0xf6, 0x4d, 0xb8, 0x0f, 0x67, 0xde, 0x59, 0x7b, 0x34, 0x35, 0x97, 0x44, - 0x96, 0x56, 0x1f, 0x83, 0x0f, 0xbf, 0x1c, 0xbf, 0xfd, 0x9b, 0x39, 0x67, - 0x73, 0xda, 0xc6, 0x96, 0x5f, 0xfe, 0x69, 0xcb, 0x66, 0x00, 0xc6, 0x64, - 0x6b, 0x2f, 0xe9, 0xbe, 0x90, 0x23, 0xcb, 0x2f, 0xf8, 0x1f, 0x77, 0x3d, - 0xac, 0x69, 0x65, 0xff, 0xfd, 0x28, 0xd7, 0xd2, 0xe4, 0xee, 0xc1, 0x93, - 0xe8, 0x55, 0x97, 0xe9, 0x78, 0xb2, 0x4b, 0x2f, 0xfd, 0xf0, 0xfa, 0x07, - 0xe1, 0x60, 0xd6, 0x56, 0x1f, 0x30, 0x09, 0xef, 0xfb, 0xae, 0xc2, 0xce, - 0xbf, 0x96, 0x5d, 0xfb, 0x4b, 0x2f, 0xb7, 0x33, 0x50, 0xb2, 0xd9, 0xa3, - 0x7b, 0xbc, 0x66, 0xa1, 0x3e, 0xcc, 0x30, 0xf8, 0xef, 0xb0, 0xc4, 0xe1, - 0x0f, 0x9d, 0x2f, 0xfe, 0xcf, 0x72, 0x76, 0xb0, 0xfb, 0x03, 0x59, 0x7f, - 0x67, 0xb5, 0xac, 0x92, 0xca, 0x59, 0x7e, 0xce, 0x96, 0x05, 0x65, 0x7e, - 0x6c, 0x48, 0x2e, 0xa6, 0x3f, 0xff, 0x2f, 0x5e, 0xcf, 0xbc, 0xb2, 0xff, - 0x60, 0xcf, 0x7f, 0x8f, 0x4b, 0x2f, 0x16, 0x72, 0x71, 0xfa, 0x6e, 0x91, - 0xb8, 0xed, 0xff, 0x63, 0x3b, 0x07, 0xa0, 0x6e, 0xac, 0xbf, 0xbc, 0x7b, - 0x13, 0xb1, 0x65, 0x0d, 0x96, 0xbf, 0x85, 0x22, 0xbb, 0x86, 0x3d, 0xef, - 0xa1, 0x80, 0x64, 0xf3, 0x1c, 0x6a, 0x31, 0x0e, 0xc2, 0xe5, 0xc8, 0xff, - 0x87, 0x51, 0x17, 0xf1, 0x27, 0xd2, 0x8d, 0x40, 0xb9, 0xbe, 0x33, 0x81, - 0x10, 0xdb, 0xce, 0xef, 0xfa, 0x18, 0x58, 0x3d, 0x1e, 0xcb, 0x2f, 0xff, - 0xf3, 0x5d, 0x04, 0x7d, 0x3b, 0x5a, 0x8d, 0x89, 0xdf, 0x42, 0xac, 0xbf, - 0xc5, 0x80, 0xc1, 0x65, 0xfa, 0xca, 0x74, 0x4d, 0x34, 0xcd, 0x52, 0x47, - 0xae, 0x43, 0x4a, 0xf0, 0xb1, 0xa5, 0x97, 0xef, 0xd9, 0x99, 0xe5, 0x97, - 0xfd, 0x93, 0xb5, 0x9d, 0x2c, 0x99, 0x65, 0x61, 0xf1, 0x11, 0x45, 0xff, - 0xfe, 0xeb, 0xff, 0xc9, 0xc5, 0x9b, 0xcb, 0x39, 0x8c, 0x80, 0xac, 0xa9, - 0x93, 0x02, 0x27, 0xfe, 0x10, 0x53, 0x76, 0xd8, 0xa2, 0xb6, 0x85, 0x11, - 0x0b, 0xec, 0xa6, 0x75, 0xfd, 0x28, 0x69, 0xe3, 0x29, 0xbf, 0xb3, 0xa2, - 0x17, 0xdf, 0xac, 0xbf, 0xff, 0xed, 0x64, 0xbb, 0x87, 0x2e, 0x61, 0x03, - 0xc5, 0x9f, 0xc2, 0xcb, 0xfe, 0xdd, 0xf4, 0x61, 0x04, 0x46, 0x2c, 0xa8, - 0x45, 0x03, 0xb2, 0x5f, 0xdd, 0xc2, 0xf7, 0xe0, 0x59, 0x7f, 0xc3, 0x1c, - 0x7f, 0x3b, 0x3e, 0xf2, 0xcb, 0xf9, 0xf7, 0x46, 0x59, 0xd5, 0x97, 0x33, - 0x8b, 0x2f, 0x3f, 0x0d, 0x65, 0x41, 0xb2, 0xfc, 0x5e, 0xff, 0x84, 0xdb, - 0x09, 0xd8, 0xfd, 0x59, 0x46, 0x8f, 0x89, 0x8f, 0x49, 0x87, 0xc4, 0x37, - 0xfb, 0x9c, 0x83, 0xd9, 0xfc, 0xb2, 0xfe, 0xcf, 0x63, 0x94, 0xcb, 0x2f, - 0xb3, 0x91, 0xa5, 0x96, 0x17, 0xa7, 0x9a, 0x45, 0x96, 0x94, 0x22, 0xa0, - 0x10, 0x80, 0xb4, 0x96, 0x5f, 0x43, 0x1c, 0x6b, 0x2a, 0x0d, 0x91, 0x08, - 0xdf, 0xec, 0x9b, 0xb9, 0xe8, 0x1a, 0xcb, 0xf8, 0xbc, 0xec, 0x3f, 0x2c, - 0xbe, 0xe7, 0xef, 0xba, 0xb2, 0xd2, 0x59, 0x50, 0x7c, 0x78, 0x59, 0xe2, - 0x6b, 0xc4, 0x18, 0x59, 0x7f, 0xff, 0xfd, 0xdc, 0xf7, 0x1e, 0x69, 0xc5, - 0x9f, 0x4b, 0x01, 0xb1, 0x60, 0xfa, 0x73, 0x2c, 0xbf, 0xfe, 0x3e, 0x44, - 0xbd, 0x9d, 0x2c, 0xf7, 0x4d, 0x65, 0xc0, 0x15, 0x65, 0x1a, 0x60, 0x3a, - 0x1b, 0xec, 0x20, 0x7c, 0x9b, 0x7f, 0xbf, 0x3f, 0x7b, 0xd8, 0xd2, 0xcb, - 0xcc, 0x80, 0xac, 0xbd, 0x86, 0x35, 0x96, 0xe2, 0xcb, 0x8b, 0x02, 0x6b, - 0x3e, 0x1b, 0xbf, 0xfb, 0x3f, 0x9d, 0xd3, 0xf7, 0x08, 0xe6, 0x59, 0x5b, - 0x1f, 0x9f, 0x8b, 0x29, 0xb9, 0x46, 0xf6, 0x42, 0xee, 0xff, 0xe2, 0xff, - 0x73, 0x3a, 0x70, 0xc7, 0x1a, 0xcb, 0xfe, 0x2f, 0xf5, 0x92, 0x28, 0x62, - 0xcb, 0xff, 0xff, 0xf4, 0xb9, 0xc0, 0x47, 0x8c, 0x78, 0x53, 0x4e, 0x2c, - 0xd4, 0x17, 0xbb, 0x8d, 0xeb, 0x2f, 0xfe, 0xfa, 0x5c, 0xc6, 0x7d, 0x1d, - 0xec, 0x2c, 0xac, 0x4c, 0x13, 0xe3, 0x8d, 0x42, 0x1a, 0xdc, 0x59, 0x58, - 0x9c, 0x88, 0x23, 0x4a, 0x10, 0xda, 0xdb, 0x2c, 0xbf, 0x6d, 0x1e, 0xcf, - 0xd6, 0x5f, 0xb5, 0x9f, 0x4b, 0x8b, 0x2f, 0x07, 0xb8, 0xb2, 0xd9, 0xb1, - 0xe2, 0xe8, 0xa6, 0xff, 0xbe, 0x8d, 0x6d, 0x3b, 0x0c, 0x6b, 0x2e, 0x98, - 0xd6, 0x56, 0x23, 0xec, 0xc4, 0x89, 0xb8, 0x05, 0x1b, 0xcf, 0x2f, 0xec, - 0xfa, 0x51, 0xfc, 0x2c, 0xbf, 0x16, 0x75, 0xfc, 0xb2, 0xbe, 0x3d, 0x46, - 0x17, 0x5f, 0x1e, 0xfc, 0xd2, 0xca, 0x83, 0xc6, 0xe9, 0x1d, 0xf4, 0xe0, - 0xec, 0xd2, 0xcb, 0xf6, 0xd3, 0x81, 0x13, 0x2c, 0xbf, 0xff, 0xe2, 0x8f, - 0xfe, 0x97, 0x01, 0x1e, 0x2c, 0x19, 0xe6, 0xa6, 0x59, 0x4e, 0x89, 0x3f, - 0x16, 0x54, 0x32, 0xd8, 0x76, 0x86, 0x80, 0xc8, 0x72, 0x32, 0x6f, 0xa1, - 0xc8, 0x6b, 0xf3, 0x0f, 0xf6, 0x12, 0xcf, 0x19, 0x77, 0xe8, 0x45, 0x18, - 0x9f, 0x23, 0xbd, 0xf4, 0x66, 0x40, 0x87, 0x1e, 0xf2, 0x11, 0x21, 0x75, - 0x7e, 0x91, 0xeb, 0x3e, 0x59, 0x7b, 0x9d, 0xc5, 0x97, 0xec, 0xe6, 0xd8, - 0xd2, 0xca, 0xf8, 0xfb, 0x66, 0x28, 0xe8, 0xe5, 0xff, 0xfe, 0xf7, 0x3b, - 0x9f, 0x63, 0xfd, 0x38, 0x71, 0xb4, 0xe1, 0x45, 0x59, 0x7f, 0xfe, 0x67, - 0xd2, 0xe6, 0xbe, 0x8f, 0x72, 0x3a, 0x7e, 0x59, 0x7f, 0xd8, 0x29, 0x67, - 0xba, 0x6d, 0x2c, 0xbf, 0xfd, 0x1f, 0x74, 0xf0, 0x86, 0x7b, 0xe0, 0x6b, - 0x2a, 0x13, 0x45, 0x36, 0xad, 0x2c, 0x11, 0xcd, 0xdb, 0xa3, 0x59, 0x7f, - 0xfd, 0xb6, 0x04, 0x7d, 0x3c, 0x16, 0x70, 0xa0, 0x85, 0x97, 0xff, 0x48, - 0xfd, 0xdc, 0xd6, 0xb3, 0xdc, 0x59, 0x7f, 0x84, 0xf1, 0xef, 0x82, 0x0a, - 0xcb, 0xf4, 0x30, 0xfb, 0x0b, 0x2f, 0xf6, 0x7b, 0xa7, 0xec, 0x0a, 0xca, - 0x9c, 0x88, 0xdd, 0x1a, 0x91, 0x35, 0x36, 0x53, 0x70, 0x31, 0xa9, 0x95, - 0x3b, 0x0d, 0x1b, 0xff, 0x4b, 0x9e, 0x7d, 0x9b, 0xcb, 0x3e, 0x59, 0x7f, - 0x76, 0x24, 0x07, 0x11, 0x65, 0xf8, 0x7d, 0xc2, 0xf2, 0xca, 0x91, 0xea, - 0xcc, 0x5d, 0x5f, 0x22, 0xec, 0xa1, 0x31, 0x7e, 0x3f, 0x87, 0xf0, 0xab, - 0x2a, 0x0f, 0x4f, 0x45, 0x17, 0x4d, 0xfa, 0xcb, 0xfe, 0xee, 0xc7, 0x85, - 0xf4, 0xb8, 0xb2, 0xff, 0xbe, 0xee, 0x04, 0xb0, 0x1b, 0xab, 0x2f, 0xff, - 0x9a, 0xc0, 0xf3, 0x3d, 0x36, 0x0a, 0x59, 0xfa, 0xcb, 0x4a, 0x11, 0x91, - 0x87, 0x46, 0x79, 0x7f, 0x1f, 0xdf, 0xe9, 0xc6, 0xb2, 0xf6, 0x6b, 0xf5, - 0x97, 0xee, 0x1e, 0x17, 0xeb, 0x2d, 0x86, 0x78, 0x9c, 0x1d, 0xbf, 0x1f, - 0xff, 0xe6, 0x96, 0x57, 0x51, 0x84, 0x4e, 0x7c, 0x26, 0xbf, 0x3e, 0x11, - 0x8a, 0xb2, 0xf7, 0xb3, 0xab, 0x28, 0x8f, 0x09, 0xbc, 0x9a, 0xe3, 0x62, - 0xcb, 0xff, 0xff, 0x7d, 0x27, 0xfa, 0x71, 0x01, 0xbe, 0x76, 0x7d, 0x2c, - 0x01, 0x7f, 0xc5, 0x94, 0xc4, 0x46, 0xb7, 0x8b, 0x5e, 0xdc, 0x36, 0xda, - 0xca, 0x9c, 0x9b, 0x5e, 0xce, 0x39, 0x0b, 0x1d, 0xc2, 0x6b, 0xff, 0xff, - 0xef, 0xb8, 0x08, 0xfa, 0x77, 0x70, 0x73, 0x8b, 0x00, 0x2c, 0xee, 0x7f, - 0xf9, 0xf9, 0x65, 0xff, 0xff, 0xe6, 0x8b, 0x06, 0xc6, 0x47, 0xb9, 0x9e, - 0xe6, 0x8f, 0x02, 0x58, 0x35, 0x95, 0x08, 0xff, 0xc8, 0x44, 0xdf, 0xa0, - 0xbe, 0x7d, 0x96, 0x5f, 0xff, 0xff, 0xfb, 0x03, 0x1d, 0x86, 0x7b, 0x39, - 0xc8, 0xd6, 0xa0, 0xb3, 0x6c, 0x07, 0x01, 0x31, 0x43, 0x16, 0x5e, 0x06, - 0x85, 0x59, 0x4c, 0x45, 0xb6, 0xe4, 0x26, 0x2f, 0xcf, 0xf8, 0x8f, 0xb2, - 0xca, 0xc3, 0xd5, 0x32, 0xbb, 0xc7, 0xfc, 0x2c, 0xbf, 0xd3, 0x8b, 0x34, - 0x70, 0xc5, 0x97, 0xf0, 0xcb, 0x3a, 0xfe, 0x59, 0x7e, 0xf7, 0xd2, 0x3d, - 0x2c, 0xac, 0x3d, 0x5e, 0x16, 0x56, 0xc8, 0xc5, 0x18, 0xe7, 0xf0, 0x88, - 0xbd, 0xa7, 0x11, 0x65, 0xfa, 0x3c, 0xc3, 0xf2, 0xcb, 0x6c, 0xe7, 0x88, - 0x01, 0xdb, 0xff, 0x40, 0xad, 0xe0, 0xc2, 0x98, 0x46, 0x2c, 0xbf, 0xff, - 0xff, 0xc2, 0x96, 0x4e, 0x3c, 0x27, 0xf7, 0x62, 0x69, 0xc5, 0x9d, 0x3f, - 0x70, 0x01, 0x04, 0x2c, 0xac, 0x47, 0xe7, 0xc5, 0x00, 0x44, 0xbf, 0xf6, - 0x67, 0xfc, 0x9d, 0xae, 0x0f, 0x8b, 0x2f, 0xf6, 0xb0, 0x3d, 0x3d, 0x4c, - 0xb2, 0xde, 0x19, 0xfb, 0x62, 0x15, 0xfe, 0xc0, 0x9f, 0xb4, 0x06, 0x2c, - 0xbe, 0xf8, 0xb3, 0x71, 0x65, 0x61, 0xff, 0x99, 0x3b, 0x99, 0xde, 0x32, - 0xf2, 0xcb, 0xfa, 0x5c, 0x76, 0x03, 0x8b, 0x2b, 0x63, 0xc9, 0x71, 0xbb, - 0xf6, 0x77, 0xaf, 0x25, 0x97, 0xf7, 0x8f, 0x5b, 0x60, 0x56, 0x54, 0x33, - 0xb9, 0x47, 0x1b, 0xb6, 0x47, 0x56, 0x2c, 0x6a, 0xa1, 0x21, 0xfa, 0x1c, - 0x27, 0x29, 0x83, 0x51, 0xa3, 0xb0, 0x9b, 0xb1, 0x99, 0xbc, 0x39, 0x4a, - 0x37, 0x7e, 0x46, 0x4a, 0x07, 0x5d, 0xc2, 0x26, 0xf2, 0x7b, 0xce, 0x1c, - 0x59, 0x4b, 0x2f, 0x9b, 0xfa, 0x7a, 0x59, 0x7f, 0xd3, 0xbc, 0x58, 0xd6, - 0x1f, 0x16, 0x53, 0x76, 0x7d, 0x41, 0x0b, 0x98, 0x96, 0xf7, 0x63, 0xf5, - 0x94, 0xd9, 0x46, 0xbc, 0x42, 0x17, 0x0d, 0x69, 0x65, 0xfd, 0x8c, 0x8e, - 0xbf, 0x56, 0x5d, 0x3a, 0x65, 0x97, 0xba, 0x62, 0xac, 0xa9, 0xc7, 0xc6, - 0x32, 0xc1, 0x46, 0xaf, 0xff, 0xbe, 0x91, 0x44, 0xe6, 0x14, 0x0b, 0xe3, - 0xd9, 0x65, 0x42, 0x3c, 0xf1, 0xb8, 0xcc, 0xaf, 0xda, 0x9c, 0x5b, 0xda, - 0x59, 0x7d, 0xd7, 0xfe, 0x16, 0x5e, 0xee, 0x69, 0x65, 0x41, 0xf5, 0xb9, - 0x6b, 0x79, 0x15, 0xfd, 0xb4, 0xd2, 0x6c, 0xeb, 0x65, 0x97, 0xe6, 0x18, - 0xf0, 0x6b, 0x2d, 0x32, 0xcb, 0xa1, 0x8b, 0x2d, 0xe5, 0x95, 0xa3, 0x4e, - 0xe2, 0xd4, 0x33, 0xd9, 0xe9, 0xcd, 0xf4, 0x0d, 0xe4, 0xb2, 0xff, 0xd8, - 0xff, 0x7f, 0x34, 0xa3, 0x5b, 0x2c, 0xbd, 0xa8, 0x99, 0x65, 0xee, 0x3f, - 0xcb, 0x2b, 0x64, 0x4e, 0xf4, 0x85, 0xd0, 0xbc, 0x3b, 0x74, 0xce, 0xb2, - 0xff, 0xfb, 0x20, 0xbf, 0x83, 0xf7, 0x71, 0x98, 0x35, 0x97, 0x40, 0xab, - 0x2a, 0x47, 0xc9, 0xe4, 0xdb, 0xf9, 0xda, 0x8f, 0x66, 0xcb, 0x2f, 0xe3, - 0xd7, 0xd2, 0x28, 0x59, 0x7f, 0x87, 0xd8, 0xfa, 0x59, 0xe5, 0x95, 0xd3, - 0xe1, 0xf1, 0x6d, 0xff, 0xb7, 0x20, 0xbd, 0xa3, 0xdf, 0x83, 0x59, 0x71, - 0x4c, 0xb2, 0x9b, 0xb5, 0x6b, 0x30, 0x6d, 0x90, 0x80, 0x38, 0x5f, 0xb0, - 0xf5, 0xde, 0xc8, 0x88, 0x10, 0x8f, 0xdc, 0x22, 0x11, 0x0a, 0xff, 0x35, - 0x92, 0x20, 0x3f, 0x16, 0x5f, 0xbe, 0x69, 0xcb, 0xf5, 0x97, 0x10, 0xab, - 0x2d, 0xc3, 0x3c, 0x10, 0x15, 0x5f, 0x9c, 0x71, 0x84, 0xb2, 0xc2, 0xac, - 0xae, 0x9b, 0x72, 0x25, 0xbf, 0xff, 0x30, 0xb0, 0x3f, 0x78, 0x9f, 0xac, - 0x8c, 0xf2, 0xcb, 0xff, 0xec, 0xd9, 0xc8, 0x33, 0xb9, 0x0c, 0x7f, 0xbc, - 0xb2, 0xa1, 0x14, 0xda, 0x54, 0xbf, 0xdb, 0xbd, 0xcd, 0xb5, 0xa8, 0x59, - 0x7f, 0xfd, 0x9b, 0xde, 0x58, 0x43, 0x28, 0x90, 0xf8, 0xb2, 0xff, 0xff, - 0xe0, 0x31, 0x8f, 0x29, 0xcd, 0xe5, 0x8c, 0x80, 0xce, 0x13, 0x6d, 0x9f, - 0xe5, 0x97, 0xe0, 0x48, 0x4d, 0x71, 0x65, 0x8f, 0xa8, 0xa7, 0x27, 0xdb, - 0xff, 0xf4, 0x6a, 0x03, 0x8c, 0x80, 0xc8, 0xf8, 0x06, 0x2c, 0xa8, 0x56, - 0xc5, 0x33, 0xa6, 0x97, 0xbb, 0x0c, 0x67, 0x22, 0x23, 0x7f, 0x43, 0xdb, - 0x70, 0x9e, 0xfe, 0xd6, 0x40, 0xb0, 0x4b, 0x2f, 0x13, 0xb1, 0x65, 0xdf, - 0xc2, 0xcb, 0xff, 0xba, 0xcc, 0xfa, 0x5c, 0x78, 0xfa, 0x4b, 0x2e, 0x13, - 0x65, 0x94, 0x67, 0xbe, 0x48, 0xd5, 0x24, 0x6e, 0x99, 0x61, 0x0d, 0xf9, - 0xda, 0x9b, 0xb8, 0x57, 0x82, 0x37, 0x50, 0xbb, 0x6c, 0x46, 0x22, 0xdc, - 0xc2, 0x41, 0xb3, 0x29, 0x61, 0xb5, 0x33, 0x44, 0xf2, 0x46, 0xd2, 0xc7, - 0x65, 0x1d, 0xb8, 0xe7, 0xfa, 0x32, 0xb5, 0xbf, 0x16, 0x5b, 0x08, 0x69, - 0x25, 0xff, 0x4f, 0x3c, 0x9c, 0xe2, 0x8c, 0xd2, 0xf1, 0x35, 0x3d, 0xcc, - 0xc9, 0xd3, 0xde, 0xd6, 0xde, 0xef, 0x38, 0x91, 0xfc, 0xb6, 0xd6, 0xdc, - 0x28, 0x8a, 0xb1, 0x7b, 0xe5, 0x2f, 0x83, 0xd5, 0x83, 0x40, 0x23, 0xf2, - 0xdf, 0x19, 0x53, 0x50, 0x98, 0xdc, 0x97, 0x12, 0x24, 0xe0, 0x13, 0x7c, - 0x6b, 0x77, 0xff, 0xf0, 0x03, 0x3f, 0xef, 0x6a, 0x33, 0xe6, 0xc8, 0xdd, - 0xc5, 0x59, 0x53, 0xd5, 0x84, 0x9c, 0xaa, 0x5b, 0xf9, 0xcf, 0xdc, 0x32, - 0x59, 0x78, 0xf5, 0x8b, 0x2b, 0x74, 0xf1, 0xb8, 0x57, 0x7e, 0xd0, 0x5d, - 0xc2, 0xa8, 0xa7, 0x57, 0x67, 0xcb, 0x2f, 0xff, 0x00, 0x04, 0x65, 0x1d, - 0x36, 0x67, 0x16, 0x5a, 0x7c, 0x22, 0xdf, 0x09, 0x7e, 0x34, 0x60, 0xbd, - 0xff, 0xc7, 0xa9, 0xfb, 0x8f, 0xb7, 0xb8, 0xff, 0xac, 0xbf, 0x68, 0x2e, - 0xe1, 0x54, 0x54, 0x6b, 0xff, 0x3c, 0xa7, 0xe6, 0x82, 0xee, 0x15, 0x44, - 0xd0, 0xbf, 0xfc, 0x59, 0x34, 0x9f, 0x52, 0x2c, 0xde, 0xeb, 0x2f, 0x8a, - 0x33, 0xe5, 0x95, 0x88, 0xeb, 0x61, 0xa7, 0x13, 0x3c, 0x95, 0x7f, 0x84, - 0x7d, 0xf3, 0xfc, 0x7b, 0x2c, 0xa9, 0xe7, 0xeb, 0x07, 0x97, 0xed, 0x05, - 0xdc, 0x2a, 0x8a, 0xbd, 0x7f, 0x66, 0xf8, 0x2e, 0x81, 0x65, 0xfc, 0x63, - 0x1c, 0x6a, 0x16, 0x5f, 0xff, 0xdf, 0x7e, 0x40, 0x60, 0x83, 0x1c, 0x7e, - 0xc8, 0xcf, 0x2c, 0xb4, 0xfc, 0x47, 0x6e, 0x8d, 0x3a, 0x5c, 0x21, 0x65, - 0xfb, 0x41, 0x77, 0x0a, 0xa2, 0xb6, 0x5f, 0xf4, 0xa7, 0xe6, 0x82, 0xee, - 0x15, 0x44, 0x82, 0xbe, 0xc6, 0x46, 0xea, 0xcb, 0x4f, 0xc4, 0x4f, 0xb9, - 0xa7, 0x11, 0xef, 0x98, 0x65, 0x0b, 0x2f, 0xda, 0x0b, 0xb8, 0x55, 0x12, - 0x1a, 0xfe, 0xd0, 0x37, 0xc3, 0x4c, 0x59, 0x7f, 0x16, 0x73, 0xd2, 0x85, - 0x97, 0xd3, 0xde, 0x53, 0xe1, 0x16, 0x38, 0x40, 0x66, 0x9b, 0xcc, 0x6f, - 0xfd, 0xc9, 0xf9, 0xe3, 0x1e, 0x14, 0xcb, 0x2f, 0x3b, 0x85, 0x71, 0x81, - 0xaa, 0x0f, 0xa0, 0x28, 0x17, 0x77, 0x75, 0x65, 0xff, 0xa5, 0xd8, 0xf7, - 0x1b, 0xae, 0x37, 0x24, 0xb2, 0xfb, 0xde, 0xc6, 0xf5, 0x96, 0x25, 0x96, - 0x35, 0x94, 0xdd, 0x1a, 0x06, 0xe0, 0x21, 0x7f, 0xf9, 0xb8, 0x37, 0x06, - 0xeb, 0xb0, 0xc2, 0x7e, 0x9e, 0x96, 0x5b, 0xe5, 0x97, 0x19, 0x2c, 0xbf, - 0xd8, 0xcc, 0x09, 0x3e, 0xea, 0xcb, 0xfa, 0x07, 0x1e, 0x71, 0xac, 0xbd, - 0xdc, 0xe2, 0xcb, 0x3a, 0xca, 0x19, 0xac, 0xf0, 0xe5, 0x0d, 0x1a, 0x93, - 0x09, 0x70, 0x57, 0xc6, 0x82, 0x2c, 0x5f, 0x7b, 0x87, 0xbd, 0x65, 0xf8, - 0x70, 0x5b, 0x6e, 0xac, 0xbf, 0xd0, 0x28, 0x9f, 0xff, 0x1f, 0x2c, 0xa8, - 0x3e, 0x3d, 0x8a, 0xef, 0xcf, 0xd3, 0x66, 0x2c, 0xb1, 0x91, 0xe4, 0x6f, - 0x22, 0xbe, 0xc2, 0xff, 0x8b, 0x2f, 0x04, 0xb7, 0x56, 0x5f, 0xf9, 0xda, - 0xe9, 0xbc, 0xbc, 0x7b, 0x2c, 0xa7, 0x3d, 0xe2, 0x1f, 0xbe, 0xdb, 0x9f, - 0x1a, 0xcb, 0xff, 0xd1, 0xf4, 0x8d, 0x8d, 0x61, 0x0f, 0xb0, 0xb2, 0xb1, - 0x30, 0xed, 0x42, 0x03, 0x84, 0x00, 0x24, 0xbf, 0x38, 0xc4, 0x82, 0x59, - 0x7f, 0x8c, 0x1b, 0xbd, 0x8c, 0xd9, 0x65, 0xff, 0xb5, 0xe1, 0x09, 0xc3, - 0x84, 0x15, 0x97, 0xfe, 0x69, 0xe5, 0xac, 0x3e, 0xc0, 0xd6, 0x5f, 0x05, - 0xdc, 0x2a, 0x8b, 0x11, 0x7e, 0xd6, 0x9c, 0xbc, 0xb2, 0xf9, 0xc7, 0xd0, - 0x2c, 0xbc, 0x66, 0xd2, 0xcb, 0xfa, 0x23, 0xe6, 0x38, 0xd6, 0x5e, 0x01, - 0x49, 0x65, 0xfe, 0x0c, 0x66, 0xbf, 0xff, 0xcb, 0x2b, 0x64, 0xfa, 0xa4, - 0x4f, 0x86, 0xc6, 0x7d, 0xa3, 0xe6, 0x17, 0x74, 0x9c, 0x88, 0xb8, 0x39, - 0xe2, 0xd0, 0x0e, 0x5f, 0xb3, 0x50, 0x42, 0xac, 0xb1, 0xac, 0xb1, 0xac, - 0xb4, 0x85, 0x34, 0x1f, 0x88, 0x5f, 0x84, 0xdc, 0xcd, 0x42, 0xcb, 0xf7, - 0xbd, 0x05, 0xb2, 0xcb, 0xdc, 0x82, 0x59, 0x50, 0x7d, 0xd8, 0x56, 0x65, - 0x17, 0xfc, 0x0d, 0x8b, 0x07, 0xd0, 0x0a, 0xb2, 0x85, 0x47, 0xf7, 0x61, - 0x2e, 0x45, 0x97, 0xff, 0x46, 0x73, 0x08, 0x67, 0xfc, 0x12, 0xcb, 0xc5, - 0x1b, 0x2c, 0xa2, 0x3d, 0xd0, 0x20, 0xdf, 0x46, 0xa1, 0x8b, 0x2a, 0x47, - 0x85, 0xc2, 0x1b, 0xf7, 0xe1, 0xe9, 0xb6, 0xd6, 0x5e, 0xee, 0x7e, 0xb2, - 0xfe, 0xfb, 0x9d, 0x83, 0xf2, 0xcb, 0x9f, 0xcb, 0x28, 0xcf, 0x11, 0x85, - 0xd7, 0xff, 0xde, 0xcf, 0xa4, 0x40, 0xf3, 0x99, 0x40, 0xd6, 0x5c, 0x7f, - 0xac, 0xbc, 0xf1, 0xf2, 0xca, 0xc4, 0xcc, 0x02, 0x5b, 0xa6, 0x1f, 0x10, - 0xee, 0x27, 0x37, 0x8b, 0xdf, 0xff, 0x9f, 0x52, 0x61, 0x46, 0xa0, 0x79, - 0x34, 0x75, 0x65, 0xf6, 0xf0, 0x3f, 0x16, 0x58, 0xd6, 0x5f, 0x8f, 0x46, - 0xd3, 0x6d, 0x65, 0x49, 0x16, 0x86, 0xa9, 0x31, 0x27, 0x44, 0x2f, 0xf8, - 0x7d, 0xc6, 0x63, 0xeb, 0x65, 0x97, 0xef, 0x79, 0xe5, 0xc5, 0x97, 0xfe, - 0x06, 0x7c, 0x3d, 0xfd, 0xc7, 0x99, 0x65, 0x7c, 0x7d, 0x5b, 0xca, 0x2d, - 0x25, 0x97, 0xbe, 0xe3, 0xac, 0xbe, 0xcc, 0x6b, 0x8b, 0x2a, 0x0f, 0x43, - 0x04, 0x7c, 0x3b, 0x6d, 0xeb, 0x2e, 0x01, 0x2c, 0xb3, 0x6d, 0x65, 0x42, - 0x70, 0x79, 0x0a, 0x3d, 0x3a, 0xfe, 0x5b, 0xc1, 0x3f, 0x0b, 0x5f, 0xee, - 0x09, 0x9a, 0xcc, 0x99, 0x65, 0xfb, 0xee, 0x46, 0xb8, 0xb2, 0xff, 0x9f, - 0xdc, 0x18, 0x1f, 0x52, 0x59, 0x7f, 0xb6, 0xfa, 0x5c, 0x23, 0x99, 0x65, - 0xf7, 0x88, 0x1b, 0x2c, 0xa8, 0x3d, 0x92, 0x36, 0xa8, 0x4c, 0x3f, 0x0d, - 0x08, 0xa4, 0x10, 0x92, 0xbf, 0xb5, 0x2f, 0xf3, 0x26, 0x59, 0x7c, 0xf0, - 0x7b, 0x8b, 0x2b, 0x0f, 0x4b, 0x45, 0xf7, 0xd2, 0x13, 0xb0, 0xb2, 0xf6, - 0xa2, 0x4b, 0x29, 0xcd, 0xfe, 0xf2, 0x3b, 0xf3, 0x30, 0xf5, 0x32, 0xcb, - 0x6e, 0xac, 0xa8, 0x37, 0x8e, 0x51, 0x7c, 0x24, 0x37, 0xf1, 0x65, 0xee, - 0xc7, 0x56, 0x52, 0xcb, 0x60, 0xcd, 0x3b, 0x07, 0x2f, 0xb4, 0x6d, 0x6e, - 0xac, 0xa2, 0x3c, 0xce, 0x13, 0x5f, 0xfe, 0xd1, 0xb2, 0x3e, 0xec, 0x0c, - 0x9f, 0x75, 0x65, 0x0d, 0x30, 0x6e, 0x42, 0x67, 0xc4, 0x37, 0xef, 0x83, - 0xd8, 0xd2, 0xca, 0x85, 0x48, 0x46, 0xc1, 0xd5, 0xe7, 0x8c, 0x94, 0x06, - 0xd7, 0xf7, 0xc1, 0xec, 0x7c, 0xde, 0xb2, 0xfe, 0x32, 0x76, 0x47, 0x56, - 0x5f, 0xfe, 0x86, 0x44, 0x86, 0x51, 0xd7, 0xcd, 0x2c, 0xa5, 0x95, 0x23, - 0xd2, 0xdc, 0x47, 0xbf, 0x14, 0x76, 0x37, 0x56, 0x5e, 0xf6, 0x7e, 0xb2, - 0xfe, 0x61, 0xf3, 0x86, 0x35, 0x97, 0x9f, 0x42, 0xac, 0xa0, 0x1e, 0x53, - 0x45, 0xb7, 0xf8, 0x25, 0x9b, 0xcb, 0x38, 0xb2, 0xff, 0x6e, 0xce, 0x12, - 0x09, 0xc5, 0x59, 0x7f, 0xa4, 0xf8, 0x59, 0xee, 0x2c, 0xac, 0x3e, 0xaf, - 0x8e, 0x6f, 0xfd, 0x9f, 0x4b, 0xb1, 0xc1, 0x7b, 0x0b, 0x2a, 0x15, 0x43, - 0xc8, 0xcf, 0xe7, 0xd3, 0x25, 0x98, 0xa7, 0x4c, 0xfd, 0x23, 0x28, 0x4e, - 0xb7, 0x91, 0x5f, 0x79, 0xdf, 0x65, 0x96, 0xdc, 0x59, 0x74, 0xb8, 0xb2, - 0xcf, 0x23, 0x57, 0xf0, 0xa5, 0xf7, 0x8c, 0x9a, 0x49, 0x60, 0x2c, 0xb4, - 0x61, 0xb3, 0xe9, 0x15, 0xd9, 0xa5, 0x97, 0xf8, 0xbd, 0xcf, 0xb8, 0xfb, - 0xab, 0x2f, 0xec, 0x1e, 0xee, 0x7d, 0xba, 0xb2, 0x9c, 0xfa, 0xc8, 0xde, - 0xb7, 0x53, 0x6d, 0x74, 0xdf, 0xd6, 0x88, 0x94, 0x10, 0x81, 0xbf, 0xf3, - 0x01, 0x37, 0xdc, 0x89, 0x8f, 0x7a, 0xcb, 0xfd, 0xd8, 0x61, 0x47, 0xd2, - 0x59, 0x7b, 0x5a, 0xc5, 0x97, 0xbe, 0x97, 0x16, 0x5d, 0xd3, 0xe1, 0xba, - 0x68, 0x72, 0xf4, 0x35, 0x25, 0x97, 0xfd, 0x9e, 0xe6, 0xb3, 0x91, 0xf2, - 0xca, 0x09, 0xeb, 0x18, 0xed, 0xff, 0xa1, 0xa1, 0x36, 0xe6, 0x32, 0x37, - 0x56, 0x5c, 0xed, 0x2c, 0xa1, 0xa6, 0xd8, 0x16, 0xde, 0xc2, 0x0f, 0xc4, - 0x3b, 0xd1, 0x2e, 0xce, 0x2c, 0xb9, 0xbf, 0x4b, 0x2a, 0x15, 0x19, 0x64, - 0x76, 0x02, 0x29, 0x37, 0x8b, 0x5f, 0xfd, 0xd7, 0x3f, 0x4b, 0x05, 0x2c, - 0xfd, 0x65, 0xee, 0xe3, 0x4b, 0x2f, 0xf3, 0x0f, 0x9d, 0x38, 0x35, 0x97, - 0xe2, 0x9a, 0x3b, 0x0b, 0x29, 0x65, 0xd8, 0x35, 0x97, 0x7e, 0xff, 0x1a, - 0x1d, 0xe1, 0x77, 0xec, 0xef, 0xcf, 0xba, 0xb2, 0xfb, 0xfe, 0x41, 0x2c, - 0xbf, 0xda, 0xeb, 0x9f, 0x0f, 0x7a, 0xcb, 0x85, 0x35, 0x95, 0x07, 0xdb, - 0x84, 0x4e, 0x69, 0x7f, 0xf7, 0x70, 0x89, 0xfd, 0x3a, 0x50, 0xc5, 0x97, - 0xe7, 0xf0, 0x1c, 0x45, 0x94, 0x6a, 0x8e, 0xb7, 0x51, 0x18, 0x3a, 0xe6, - 0x3f, 0xa4, 0x11, 0x87, 0x21, 0x31, 0xe2, 0xc0, 0x22, 0x5f, 0xcd, 0x46, - 0xb4, 0xf3, 0x2c, 0xbf, 0xe1, 0xc0, 0x44, 0xff, 0xf8, 0xf9, 0x65, 0xff, - 0x3e, 0xb1, 0x87, 0xb9, 0x0c, 0x59, 0x41, 0x3f, 0x70, 0x1e, 0xdf, 0x66, - 0xb3, 0x8b, 0x2f, 0xbd, 0x1f, 0x49, 0x65, 0xfc, 0x7f, 0xee, 0x11, 0xfe, - 0xb2, 0xb6, 0x3d, 0x4d, 0x11, 0xdf, 0xfd, 0xd7, 0x3f, 0x66, 0xbf, 0x63, - 0xc9, 0x65, 0xe1, 0xf4, 0xd6, 0x51, 0x9f, 0x00, 0x11, 0x2f, 0x88, 0xa3, - 0x65, 0x97, 0xbd, 0x82, 0x2c, 0xa8, 0x54, 0x3f, 0x90, 0xa6, 0xe9, 0x13, - 0xba, 0xf2, 0x10, 0x60, 0x21, 0x6f, 0x21, 0xbf, 0x8a, 0x25, 0x1b, 0xe1, - 0x65, 0xd1, 0xfa, 0xcb, 0xe0, 0x1b, 0x7b, 0x16, 0x5f, 0xdb, 0xf4, 0xf0, - 0x7b, 0x8b, 0x2e, 0x3d, 0x96, 0x5b, 0x16, 0x51, 0xa3, 0x06, 0x62, 0xdd, - 0x0b, 0xb0, 0x95, 0xcc, 0x48, 0x5e, 0xfd, 0x9d, 0xde, 0x7a, 0x59, 0x7d, - 0xb7, 0xb0, 0x2b, 0x2f, 0xf3, 0x8a, 0x27, 0x7b, 0x12, 0x59, 0x4e, 0x7b, - 0x1b, 0x84, 0x77, 0xfe, 0xee, 0x0c, 0x67, 0xf6, 0x7d, 0xe5, 0x97, 0xf4, - 0xe1, 0x88, 0xfa, 0xd2, 0xca, 0xd8, 0xfc, 0x46, 0x81, 0x7f, 0x87, 0x9e, - 0xec, 0x10, 0x56, 0x5f, 0x3c, 0x1e, 0xe2, 0xcb, 0xfe, 0x1c, 0xec, 0xe4, - 0x66, 0xbf, 0x59, 0x7b, 0xa2, 0x71, 0x65, 0x61, 0xec, 0xb9, 0xdd, 0xfe, - 0x31, 0xf8, 0x9f, 0xee, 0x2c, 0xbf, 0xde, 0xe1, 0xfd, 0x9f, 0x79, 0x65, - 0xdb, 0x42, 0xca, 0x83, 0xff, 0x73, 0x30, 0x1a, 0xd4, 0x27, 0x3b, 0xb1, - 0x18, 0xcc, 0xba, 0xf8, 0x50, 0x9f, 0xa6, 0xe9, 0xd1, 0x46, 0xb7, 0x23, - 0x4d, 0x94, 0x96, 0xd4, 0x8a, 0xda, 0xcb, 0x22, 0x32, 0xed, 0x93, 0x25, - 0x0c, 0xf1, 0xc6, 0x6d, 0x92, 0x8b, 0x05, 0x84, 0xb8, 0x63, 0x45, 0xfa, - 0x1a, 0x87, 0x1a, 0x94, 0xd1, 0x88, 0xea, 0x3c, 0x06, 0x46, 0xd7, 0xd9, - 0x5a, 0x8f, 0x2b, 0x5b, 0xf8, 0xfd, 0x0a, 0x54, 0x27, 0x25, 0x40, 0xfa, - 0x55, 0x28, 0x23, 0x31, 0xde, 0xab, 0xb9, 0x08, 0x11, 0x25, 0x19, 0x5f, - 0x9b, 0xdc, 0x31, 0xa5, 0x97, 0xfe, 0x38, 0xf7, 0x5c, 0x5c, 0x2f, 0xd6, - 0x5f, 0xfe, 0x7d, 0x4e, 0x7f, 0x4e, 0xf7, 0xc1, 0x32, 0x59, 0x5d, 0x44, - 0x66, 0xf3, 0xeb, 0xef, 0x6b, 0x24, 0xb2, 0xfe, 0xcf, 0x41, 0xb3, 0x8b, - 0x2f, 0xf0, 0xe2, 0x59, 0xac, 0xe2, 0xcb, 0xff, 0xec, 0xd6, 0x81, 0x2d, - 0x64, 0x7d, 0x23, 0x62, 0xcb, 0xdc, 0x13, 0x8b, 0x2f, 0xff, 0xb3, 0xe9, - 0x78, 0x1b, 0x4f, 0xeb, 0xb0, 0xf8, 0xb2, 0xff, 0xde, 0x86, 0x72, 0x0f, - 0x67, 0xf2, 0xcb, 0xf9, 0xf7, 0x5f, 0x3e, 0xf2, 0xca, 0xf8, 0xfb, 0xba, - 0x7d, 0x7f, 0x9f, 0x06, 0x7f, 0x13, 0xac, 0xac, 0x3d, 0x40, 0x11, 0xdf, - 0x47, 0xa4, 0xeb, 0x2e, 0x68, 0x96, 0x5e, 0xf1, 0x42, 0xcb, 0xbb, 0x3e, - 0x15, 0xa9, 0xe4, 0x2d, 0x8c, 0x96, 0x62, 0x26, 0x16, 0x74, 0xc9, 0xd4, - 0x08, 0x7b, 0x91, 0x8b, 0x6f, 0x21, 0x68, 0x84, 0x41, 0x7a, 0x9e, 0xbc, - 0x39, 0x13, 0xab, 0x97, 0xf6, 0x68, 0x2e, 0xe1, 0x54, 0x59, 0xab, 0xf0, - 0x26, 0xe9, 0x8d, 0x65, 0xff, 0xb0, 0x79, 0x82, 0x8c, 0x8f, 0x65, 0x97, - 0xda, 0xeb, 0xcf, 0x61, 0xf3, 0x91, 0x4d, 0xfe, 0xf7, 0x70, 0xf6, 0x64, - 0x2c, 0xbf, 0xf4, 0x6b, 0xff, 0x73, 0xb8, 0x63, 0x59, 0x6d, 0x96, 0x5e, - 0x94, 0x7c, 0xb2, 0xd9, 0x06, 0xbe, 0x61, 0x2b, 0xe3, 0x27, 0xd9, 0x65, - 0x62, 0x3a, 0x3a, 0x66, 0x4d, 0xdc, 0x26, 0xb7, 0x56, 0x5f, 0xbb, 0x1c, - 0xe9, 0xac, 0xbf, 0xf1, 0xfa, 0x18, 0x4e, 0x2f, 0x4d, 0x65, 0xd1, 0xd5, - 0x97, 0xf1, 0x66, 0xfe, 0xbc, 0x96, 0x5a, 0x7e, 0xc8, 0xb9, 0xc1, 0x19, - 0x89, 0xfa, 0x7b, 0xe1, 0x6a, 0x9e, 0x9a, 0x3b, 0x7c, 0x3d, 0x2f, 0xff, - 0x80, 0xfb, 0x6b, 0x19, 0x3f, 0xb1, 0xb1, 0x01, 0x65, 0x4f, 0x57, 0x14, - 0x70, 0xa0, 0x79, 0x4d, 0x24, 0x5d, 0x7c, 0x6c, 0x13, 0x4b, 0x2f, 0xb8, - 0x50, 0xd2, 0xcb, 0xe8, 0x0e, 0x75, 0x65, 0xf1, 0x96, 0x80, 0xb2, 0xfe, - 0xde, 0x27, 0x8a, 0x3f, 0x59, 0x7e, 0xd8, 0x12, 0x04, 0x2c, 0xa8, 0x3d, - 0xa3, 0x31, 0xbe, 0x10, 0xb3, 0x8b, 0x2f, 0x08, 0x7b, 0x8b, 0x2e, 0x64, - 0xf8, 0x4d, 0x0f, 0xe2, 0x33, 0x22, 0x98, 0x87, 0xaf, 0x6e, 0x40, 0x02, - 0x2b, 0xb0, 0xd6, 0x5d, 0x83, 0x59, 0x7f, 0xe7, 0x94, 0xfc, 0xd0, 0x5d, - 0xc2, 0xa8, 0xa0, 0x17, 0xf8, 0xd9, 0x1b, 0xbd, 0xcd, 0x96, 0x5a, 0x7c, - 0x91, 0x5b, 0x82, 0xac, 0x16, 0xea, 0x65, 0xd2, 0x62, 0xcb, 0xf8, 0xf9, - 0x31, 0x40, 0xd6, 0x5e, 0xd7, 0xd2, 0x59, 0x43, 0x3c, 0xb7, 0x2d, 0xbf, - 0x47, 0xde, 0x7d, 0x2c, 0xbf, 0x7b, 0x92, 0x3f, 0xd6, 0x5e, 0x1b, 0x9a, - 0xca, 0x92, 0x3b, 0xf1, 0x88, 0xc8, 0x5c, 0xa0, 0x05, 0x37, 0xe9, 0xf9, - 0x34, 0x49, 0x65, 0xff, 0x47, 0xbb, 0x8c, 0xcd, 0x62, 0xcb, 0xe9, 0xb3, - 0x02, 0xb2, 0xfd, 0xe1, 0x5f, 0x93, 0xf4, 0x7b, 0x22, 0x1b, 0xd4, 0x91, - 0x8c, 0xd4, 0x20, 0xea, 0x7a, 0x66, 0xd1, 0x18, 0x6d, 0xa1, 0x65, 0xba, - 0xb2, 0x98, 0x68, 0x40, 0x21, 0x7c, 0xd8, 0xdf, 0xf7, 0x16, 0x5f, 0xff, - 0xb7, 0xc7, 0x4c, 0x7d, 0x89, 0x71, 0xfa, 0x7c, 0x59, 0x7f, 0x72, 0x18, - 0x51, 0x32, 0xcb, 0x75, 0x65, 0xe1, 0x0a, 0x65, 0x96, 0xf6, 0x1a, 0xff, - 0xc4, 0x6e, 0xcd, 0x96, 0x56, 0x1b, 0xe2, 0x27, 0xbe, 0x36, 0x44, 0xcb, - 0x28, 0xd3, 0x31, 0xfd, 0x58, 0xa1, 0x35, 0xb8, 0x3f, 0x6e, 0x2c, 0xbe, - 0x19, 0x97, 0xeb, 0x2a, 0x71, 0xb3, 0x71, 0x1b, 0xff, 0xb3, 0xfe, 0x13, - 0x8b, 0x9b, 0xcf, 0x4b, 0x2f, 0x00, 0x78, 0xb2, 0xfe, 0xd7, 0x8a, 0x19, - 0xc5, 0x97, 0xff, 0xed, 0x0d, 0xc8, 0x5e, 0xe6, 0xee, 0x8d, 0x90, 0x2a, - 0xca, 0xc4, 0x43, 0x00, 0xb6, 0xdb, 0x8b, 0x2b, 0x13, 0x1e, 0x34, 0x6e, - 0xc2, 0x8b, 0xf2, 0x2b, 0xe0, 0xbb, 0x85, 0x51, 0x6f, 0xaf, 0x6e, 0x3f, - 0x96, 0x5f, 0xe3, 0x28, 0x67, 0xef, 0xe5, 0x97, 0xf0, 0x9e, 0x70, 0xbe, - 0x96, 0x56, 0x91, 0x5a, 0xc2, 0xee, 0x8f, 0xfe, 0x65, 0x7f, 0xc7, 0xd8, - 0xfa, 0x37, 0x73, 0xe5, 0x97, 0xff, 0x1f, 0xb4, 0x0e, 0x75, 0xe5, 0xf9, - 0xac, 0xbf, 0xd9, 0xb6, 0x7b, 0x8f, 0xe5, 0x95, 0xd3, 0xf8, 0x24, 0x5b, - 0x34, 0xb2, 0xff, 0x9c, 0x83, 0xc8, 0xeb, 0xee, 0xac, 0xa1, 0x4f, 0x33, - 0xc2, 0x57, 0xd8, 0x47, 0x32, 0xcb, 0xe3, 0xcd, 0x6f, 0x59, 0x7d, 0xf4, - 0xb6, 0x85, 0x97, 0xa1, 0xad, 0xc5, 0x95, 0x87, 0x89, 0xa2, 0x4b, 0xdd, - 0x8d, 0x2c, 0xbf, 0x74, 0xf5, 0xd7, 0x59, 0x7f, 0xfb, 0xb1, 0xb7, 0xb3, - 0xa5, 0x9e, 0xe9, 0xac, 0xbc, 0xcc, 0x1a, 0xcb, 0x31, 0x65, 0xfe, 0x8d, - 0x87, 0x8d, 0x72, 0x7c, 0x22, 0xe7, 0x07, 0x26, 0x27, 0x74, 0x91, 0x07, - 0x2a, 0x49, 0xa7, 0xf6, 0x1b, 0x57, 0xef, 0x4b, 0x82, 0x71, 0x65, 0xfe, - 0xd3, 0xfc, 0x33, 0x2d, 0x96, 0x5e, 0xe7, 0x46, 0xb2, 0xfc, 0x27, 0x8a, - 0x3f, 0x59, 0x4c, 0x3c, 0x6d, 0xe3, 0xb7, 0xff, 0x7b, 0x87, 0xc8, 0x2c, - 0xf7, 0x4d, 0x65, 0xff, 0x9d, 0xbf, 0x46, 0x2e, 0x74, 0xe4, 0xb2, 0xf1, - 0x67, 0x56, 0x53, 0x11, 0x3d, 0xd4, 0x2d, 0xe8, 0x37, 0xe1, 0xc6, 0xe8, - 0x18, 0xb2, 0xff, 0x9f, 0x91, 0x84, 0x3e, 0xc2, 0xcb, 0xfd, 0xd8, 0x19, - 0xef, 0x81, 0xac, 0xbf, 0xed, 0x67, 0xdd, 0x27, 0xdd, 0xd9, 0x65, 0xb0, - 0x67, 0xe2, 0xc3, 0x4b, 0xb9, 0xcd, 0x23, 0x38, 0xa1, 0x4f, 0x50, 0xa8, - 0x83, 0x21, 0x84, 0x66, 0x4f, 0x0f, 0x9b, 0x80, 0x2a, 0xcb, 0xe6, 0x4d, - 0x02, 0x2c, 0xa6, 0x1b, 0xc7, 0x18, 0xbc, 0x65, 0xe5, 0x97, 0x03, 0xe5, - 0x97, 0xfc, 0xf2, 0xf7, 0x31, 0xae, 0x9a, 0xcb, 0xdf, 0x3f, 0x56, 0x53, - 0xa2, 0x27, 0xf1, 0xb2, 0x18, 0x01, 0xcd, 0xfe, 0x8e, 0x67, 0xde, 0x3d, - 0x2c, 0xbe, 0xe7, 0xa1, 0x8b, 0x2b, 0x47, 0xab, 0xf9, 0x9d, 0xed, 0x47, - 0x96, 0x5f, 0xd3, 0x38, 0xfa, 0x6c, 0x59, 0x7f, 0x78, 0xf0, 0x70, 0xc5, - 0x95, 0xe3, 0xda, 0x68, 0xba, 0xf9, 0xf6, 0x01, 0x2c, 0xbb, 0x84, 0xb2, - 0xfe, 0xfb, 0x90, 0x1c, 0x62, 0xcb, 0xe6, 0x07, 0x09, 0x65, 0x42, 0x68, - 0x7a, 0x23, 0x77, 0x62, 0x23, 0xe1, 0x10, 0x05, 0x84, 0x2e, 0xbf, 0x4d, - 0x04, 0x50, 0xb2, 0xe0, 0xe9, 0x65, 0x19, 0xbd, 0xf1, 0x35, 0xf9, 0xf6, - 0x8e, 0xba, 0xcb, 0xfe, 0x27, 0xf7, 0x33, 0x75, 0xfa, 0xb2, 0xe1, 0xb1, - 0x65, 0xfb, 0x26, 0x94, 0x7c, 0xb2, 0x85, 0x3c, 0x02, 0x17, 0xa0, 0xa2, - 0x73, 0xaf, 0x57, 0xec, 0x2f, 0x47, 0x16, 0x5a, 0x4b, 0x2f, 0xf7, 0xff, - 0x83, 0x9b, 0xb9, 0xf2, 0xca, 0xc3, 0xcb, 0x71, 0x1b, 0xff, 0x3f, 0xdf, - 0x70, 0xc7, 0x8d, 0x71, 0x65, 0x42, 0x77, 0x19, 0x0c, 0x3e, 0x91, 0x93, - 0x8f, 0x08, 0x2f, 0xff, 0x9f, 0xed, 0x66, 0x7c, 0xd7, 0x41, 0x1f, 0x71, - 0x65, 0xfe, 0xf1, 0xf1, 0xc2, 0xfb, 0x2c, 0xbf, 0x7f, 0xf9, 0x90, 0xab, - 0x29, 0xb9, 0x6c, 0x37, 0x1b, 0x51, 0x0c, 0x46, 0xb7, 0x27, 0x81, 0xc6, - 0x81, 0x90, 0xef, 0x14, 0xf8, 0x30, 0xb4, 0xf9, 0xb4, 0xc8, 0xf7, 0x48, - 0x66, 0x8e, 0xdb, 0x45, 0x2c, 0x2a, 0xec, 0xa9, 0xa7, 0x84, 0x0f, 0xf0, - 0xa9, 0x28, 0xf5, 0x39, 0x0a, 0x0f, 0x47, 0xb0, 0x04, 0xd1, 0x14, 0xdb, - 0xcc, 0xef, 0xe7, 0xfa, 0x7b, 0x1f, 0xcb, 0x2a, 0x7a, 0x77, 0x05, 0x1c, - 0x45, 0xfc, 0x39, 0xfc, 0xf7, 0x3e, 0x59, 0x7f, 0xf9, 0x82, 0x06, 0x74, - 0x6b, 0x46, 0x4e, 0x15, 0x97, 0x37, 0x6d, 0xca, 0xcb, 0xcc, 0x7f, 0x96, - 0x5e, 0xfd, 0xfa, 0xb2, 0xed, 0xe6, 0xb2, 0xfb, 0x5a, 0xc1, 0x16, 0x5f, - 0xf4, 0x49, 0xa7, 0xd6, 0xb0, 0x45, 0x97, 0xb1, 0xa9, 0xed, 0xd2, 0x34, - 0x20, 0x87, 0x07, 0x66, 0x1d, 0x71, 0x82, 0x23, 0xb7, 0x27, 0xa7, 0x13, - 0xb4, 0x63, 0x95, 0x09, 0xf7, 0x1c, 0x77, 0x77, 0xff, 0xfc, 0xdb, 0x3f, - 0x01, 0xf6, 0x9f, 0x92, 0xec, 0x6b, 0x30, 0x85, 0x59, 0x7f, 0xff, 0xf0, - 0x5f, 0x4f, 0xd9, 0x67, 0xb0, 0x7c, 0x76, 0x66, 0xb6, 0x8f, 0x96, 0x5f, - 0xd8, 0x37, 0x66, 0x12, 0xca, 0x34, 0x4e, 0xe9, 0xca, 0xfd, 0xa0, 0xbb, - 0x85, 0x51, 0x4a, 0x2f, 0xff, 0x9f, 0xc5, 0x9b, 0x6a, 0x3a, 0x7d, 0xcd, - 0x2c, 0xbb, 0x8d, 0x2c, 0xbf, 0xf7, 0x63, 0xf6, 0x3c, 0xb9, 0xc6, 0x96, - 0x5e, 0x79, 0x4f, 0x84, 0x7e, 0xe1, 0x17, 0xe6, 0x9c, 0x4e, 0x10, 0x62, - 0xff, 0xa5, 0x3f, 0x34, 0x17, 0x70, 0xaa, 0x24, 0xe5, 0x31, 0x14, 0x8e, - 0xbb, 0x7f, 0xb5, 0x3f, 0x3b, 0x13, 0x3a, 0xca, 0x9e, 0x7a, 0xee, 0x45, - 0x51, 0x18, 0x7a, 0x86, 0xd4, 0x8d, 0x79, 0x4b, 0x2b, 0x1e, 0x2c, 0xaf, - 0xb2, 0x32, 0xa1, 0x51, 0x03, 0x1d, 0x59, 0xc6, 0x21, 0xbb, 0x0e, 0x49, - 0xa1, 0xcf, 0xa8, 0x5f, 0xb2, 0xd4, 0x65, 0x76, 0x5d, 0xcb, 0xc7, 0x1b, - 0xfc, 0x63, 0xe5, 0x29, 0xa7, 0x95, 0x97, 0x07, 0xa5, 0x0c, 0x80, 0xa3, - 0x7c, 0xb0, 0x1b, 0xf6, 0x82, 0xee, 0x15, 0x44, 0x3e, 0xbf, 0xf3, 0xca, - 0x7e, 0x68, 0x2e, 0xe1, 0x54, 0x4a, 0x6b, 0x4f, 0xc4, 0x40, 0x30, 0xd2, - 0xff, 0x4f, 0xcd, 0x05, 0xdc, 0x2a, 0x88, 0x9d, 0x7e, 0x3f, 0x70, 0x0c, - 0x59, 0x7b, 0xb1, 0x32, 0xca, 0x98, 0xf1, 0x7a, 0x51, 0x7f, 0x81, 0xf0, - 0x83, 0x07, 0xb8, 0xb2, 0xff, 0xf3, 0x68, 0x2b, 0x5b, 0xbb, 0x0d, 0xb3, - 0x3a, 0x77, 0x77, 0x16, 0x5f, 0xb4, 0x17, 0x70, 0xaa, 0x23, 0x15, 0xfd, - 0x28, 0xff, 0xa6, 0xd2, 0xcb, 0xff, 0xf8, 0x04, 0xe2, 0xce, 0xf0, 0xb0, - 0x52, 0xce, 0x9b, 0x16, 0x5f, 0x43, 0x03, 0xfa, 0xcb, 0xff, 0xe9, 0x6c, - 0xda, 0x43, 0x73, 0xb0, 0x75, 0x3a, 0x77, 0x77, 0x16, 0x57, 0x51, 0x11, - 0xf9, 0x1d, 0xfd, 0x9e, 0x8c, 0xfb, 0xcb, 0x2f, 0xfd, 0xe1, 0x60, 0xa5, - 0x9d, 0x36, 0x2c, 0xbf, 0xe1, 0x60, 0xa5, 0x9d, 0x36, 0x2c, 0xbe, 0x01, - 0x38, 0xb3, 0x8f, 0xdb, 0xc7, 0xd7, 0xed, 0x7e, 0x7d, 0x85, 0x94, 0xc3, - 0xe3, 0x01, 0xdd, 0xf1, 0xfd, 0x26, 0xe5, 0x65, 0xfa, 0x74, 0xc5, 0x03, - 0x59, 0x69, 0xf0, 0xae, 0x8f, 0x62, 0x39, 0x1b, 0xe3, 0x1c, 0xc6, 0x8c, - 0x2f, 0xec, 0x39, 0x48, 0x93, 0x91, 0x83, 0x78, 0x8b, 0x70, 0xa2, 0xff, - 0xf4, 0xf6, 0x3c, 0xa7, 0xe6, 0x82, 0xee, 0x15, 0x44, 0xf2, 0xbe, 0x8d, - 0xf1, 0xd5, 0x97, 0xd0, 0x52, 0xe2, 0xcb, 0xb3, 0x8b, 0x2f, 0x7a, 0x18, - 0xb2, 0xfd, 0xd3, 0x2c, 0xde, 0xb2, 0xb4, 0x89, 0xef, 0xc8, 0xdb, 0x64, - 0x3e, 0x16, 0x10, 0x72, 0xfd, 0xc0, 0x0f, 0x18, 0xb2, 0xe9, 0x08, 0xb2, - 0xf8, 0x0f, 0xa9, 0x2c, 0xbc, 0xc0, 0x6e, 0xac, 0xbf, 0x38, 0xfb, 0x1c, - 0x59, 0x7f, 0xb3, 0xbd, 0x8f, 0x9f, 0x75, 0x65, 0xa7, 0xc2, 0x37, 0xe4, - 0x50, 0x31, 0x8f, 0xc8, 0x88, 0x83, 0x84, 0xf5, 0x3d, 0x38, 0xd6, 0xa3, - 0x2f, 0xa8, 0x5f, 0xb4, 0xd8, 0xaa, 0x53, 0x85, 0x3d, 0x85, 0x7f, 0xa5, - 0x42, 0xdf, 0xb4, 0x17, 0x70, 0xaa, 0x22, 0x05, 0xff, 0x9e, 0x53, 0xf3, - 0x41, 0x77, 0x0a, 0xa2, 0x54, 0x5f, 0xda, 0x07, 0x60, 0x82, 0xb2, 0xfe, - 0x09, 0xe3, 0x7f, 0x61, 0x65, 0x41, 0xee, 0x61, 0x6d, 0xa7, 0xe2, 0x3f, - 0x18, 0x68, 0x50, 0xa8, 0xbf, 0x68, 0x2e, 0xe1, 0x54, 0x45, 0x0b, 0xf7, - 0x4d, 0x80, 0x1a, 0xcb, 0xd1, 0xfe, 0x2c, 0xb4, 0xfc, 0x3f, 0x87, 0x34, - 0x10, 0xa2, 0xff, 0x4f, 0xcd, 0x05, 0xdc, 0x2a, 0x88, 0xc9, 0x7e, 0xd0, - 0x5d, 0xc2, 0xa8, 0x99, 0x57, 0xe9, 0x67, 0x9c, 0x2b, 0x2f, 0xd3, 0xd8, - 0xf2, 0x9f, 0x87, 0xb7, 0xf1, 0xa5, 0xfb, 0x41, 0x77, 0x0a, 0xa2, 0xa4, - 0x58, 0x96, 0x5d, 0x26, 0x2c, 0xb0, 0x8b, 0x2d, 0x3f, 0x0f, 0xb7, 0x74, - 0xd3, 0x42, 0x00, 0x17, 0xbf, 0xd3, 0xf3, 0x41, 0x77, 0x0a, 0xa2, 0xba, - 0x5f, 0xe9, 0xf9, 0xa0, 0xbb, 0x85, 0x51, 0x62, 0xaf, 0xfa, 0x39, 0xc8, - 0x67, 0xb0, 0x2b, 0x2f, 0x82, 0xee, 0x15, 0x44, 0xf4, 0xbf, 0x31, 0xe5, - 0x3f, 0x02, 0x7c, 0xda, 0x38, 0xbc, 0xd3, 0x85, 0x65, 0xfd, 0xd8, 0x3d, - 0x1b, 0x6d, 0x65, 0xfa, 0x0f, 0x70, 0xdb, 0xd6, 0x5c, 0xd4, 0xfc, 0x3f, - 0x90, 0x8e, 0xb9, 0x85, 0xff, 0xff, 0xe1, 0xe3, 0x53, 0xcb, 0x05, 0x15, - 0xfd, 0xc3, 0x29, 0xa0, 0x3a, 0xcf, 0x96, 0x5f, 0xff, 0xd9, 0x9d, 0x30, - 0xf7, 0x27, 0x96, 0x7b, 0xa6, 0xd2, 0xcb, 0xff, 0xf4, 0xc5, 0x0c, 0x9f, - 0x9c, 0x36, 0x86, 0xee, 0x2a, 0xcb, 0xb9, 0xe5, 0x97, 0x67, 0x16, 0x5d, - 0xcf, 0xd6, 0x5f, 0x89, 0xd8, 0x50, 0xb2, 0xfe, 0x07, 0x3a, 0xf2, 0x9e, - 0xdc, 0x9f, 0x53, 0x8b, 0xb4, 0x2c, 0x20, 0xc5, 0xed, 0xa3, 0x75, 0x65, - 0xda, 0xf2, 0xcb, 0xf6, 0x7b, 0x86, 0xc5, 0x97, 0xff, 0xa3, 0xef, 0x64, - 0xc7, 0xaf, 0x70, 0x1b, 0xab, 0x2f, 0x3f, 0xd3, 0xe1, 0x15, 0xae, 0x40, - 0x42, 0xfe, 0x27, 0xac, 0x54, 0x49, 0xa8, 0x61, 0x72, 0x31, 0x4a, 0x1a, - 0xb3, 0x72, 0x7c, 0xf4, 0xa7, 0xfa, 0x9e, 0xb8, 0xc9, 0x10, 0xb9, 0x39, - 0x6e, 0x77, 0xff, 0x87, 0x3f, 0xde, 0x06, 0xc2, 0x4d, 0xc0, 0x7c, 0xb2, - 0xfc, 0xdd, 0x1c, 0x01, 0xb6, 0xb2, 0xfc, 0x7d, 0x27, 0x99, 0x65, 0xfa, - 0x58, 0x39, 0xd8, 0xb2, 0xfc, 0xe7, 0xb6, 0xa1, 0x65, 0x36, 0x0f, 0xde, - 0x09, 0xfa, 0x53, 0x73, 0x3f, 0x59, 0x7e, 0xcf, 0x18, 0x38, 0xb2, 0xe6, - 0xe9, 0xb5, 0xac, 0xa6, 0xe8, 0xf8, 0x5b, 0x58, 0xc3, 0x68, 0x4f, 0x7e, - 0x6e, 0x0d, 0xd7, 0x35, 0xe5, 0x97, 0xf8, 0x42, 0xcd, 0x6a, 0x02, 0xb2, - 0x9b, 0xa3, 0xe7, 0x6c, 0x9a, 0x5f, 0x69, 0x9e, 0xf9, 0x65, 0xf9, 0xbb, - 0x6c, 0x44, 0x98, 0xb2, 0xff, 0xcd, 0xa3, 0x72, 0xd9, 0x6c, 0x36, 0x5b, - 0x2d, 0xc5, 0xb2, 0xdd, 0x2c, 0xbf, 0xf3, 0x71, 0x6d, 0x1b, 0x83, 0x71, - 0x6e, 0x0d, 0x86, 0xd6, 0xdc, 0x1b, 0xa5, 0x97, 0xfd, 0xd1, 0xca, 0x7c, - 0xb8, 0x53, 0xdb, 0x08, 0xdd, 0x6d, 0x6d, 0x54, 0xdd, 0x26, 0xdc, 0xda, - 0xe3, 0x0e, 0xbf, 0x9b, 0xb6, 0xc3, 0x1d, 0xc9, 0x65, 0xe0, 0xe7, 0x52, - 0x5e, 0x64, 0x71, 0x65, 0xef, 0xf5, 0x0b, 0x2f, 0x4c, 0x6d, 0x2c, 0xbb, - 0x24, 0xb2, 0xec, 0xfc, 0xcd, 0xa3, 0x8f, 0x5f, 0xbd, 0xf8, 0x85, 0x32, - 0xcb, 0xff, 0x3f, 0x27, 0x73, 0x99, 0x29, 0x42, 0xcb, 0x71, 0x65, 0xfd, - 0x01, 0x3d, 0x9c, 0x96, 0x5f, 0xff, 0x89, 0xc5, 0x3d, 0x44, 0xa5, 0x9c, - 0xff, 0xf8, 0x59, 0x7f, 0x9f, 0xc0, 0xcc, 0x21, 0x56, 0x50, 0xd3, 0x5b, - 0xc2, 0xb1, 0x4a, 0xe6, 0x40, 0xd0, 0x8f, 0x4b, 0x3f, 0x56, 0xbf, 0xff, - 0xb4, 0x6d, 0xee, 0xc9, 0xf1, 0xad, 0x1b, 0x78, 0x41, 0xb2, 0xcb, 0xe3, - 0xe8, 0x8c, 0x59, 0x7f, 0xf8, 0xc5, 0x9d, 0x84, 0xff, 0x70, 0x51, 0x5d, - 0x65, 0x04, 0xfc, 0x48, 0x8e, 0xff, 0xf3, 0xf0, 0xb3, 0xf9, 0xfd, 0x30, - 0xbe, 0x96, 0x5c, 0x4d, 0x2c, 0xbf, 0xbd, 0x34, 0x9f, 0x42, 0xac, 0xbb, - 0x02, 0xb2, 0xf0, 0xf0, 0x57, 0x3c, 0x6f, 0x18, 0x5f, 0x76, 0x18, 0x15, - 0x95, 0x08, 0xb2, 0x75, 0xdf, 0x19, 0xde, 0x1e, 0x75, 0x65, 0xe9, 0x8d, - 0xa5, 0x96, 0x1c, 0x8d, 0xd1, 0x8e, 0x5f, 0xfd, 0x3a, 0x20, 0xa1, 0x93, - 0xa7, 0x77, 0x71, 0x65, 0x41, 0xf9, 0x11, 0x35, 0xff, 0xbb, 0x93, 0x74, - 0xfb, 0x1a, 0x85, 0x97, 0x3f, 0xcb, 0x2f, 0xf3, 0xf1, 0xfa, 0x02, 0xd9, - 0x65, 0x11, 0xe5, 0x00, 0x5e, 0xb6, 0x5d, 0xc5, 0x90, 0xe1, 0xc7, 0x59, - 0xa6, 0x76, 0x43, 0x57, 0xa4, 0x25, 0x0f, 0xdf, 0x43, 0x68, 0x42, 0x06, - 0xf8, 0x44, 0x5d, 0x1a, 0x59, 0x76, 0x75, 0x65, 0xb4, 0x13, 0x59, 0xb8, - 0x2d, 0x78, 0x20, 0xd2, 0xcb, 0xda, 0x7c, 0x59, 0x78, 0x9f, 0xcb, 0x2f, - 0x11, 0xf1, 0x65, 0x9a, 0x6c, 0x1b, 0x68, 0x1b, 0xba, 0x3a, 0xb2, 0xfb, - 0x5b, 0xdd, 0x8b, 0x2f, 0xc5, 0x9e, 0x86, 0x96, 0x5f, 0xfe, 0x39, 0xdd, - 0xc9, 0x8f, 0xee, 0x77, 0x02, 0xb2, 0xfc, 0xc2, 0x7f, 0x71, 0x65, 0xe8, - 0xcd, 0x2c, 0xbf, 0xfc, 0x17, 0xd3, 0xf8, 0xf9, 0x05, 0x1f, 0xac, 0xb4, - 0xba, 0x7c, 0x62, 0x0d, 0xd7, 0xc8, 0xb3, 0xd4, 0x22, 0xaa, 0x15, 0x26, - 0xec, 0x54, 0x31, 0xdc, 0x51, 0x09, 0x59, 0x8b, 0x70, 0x93, 0xc4, 0xe0, - 0x8c, 0x02, 0xf9, 0xcc, 0x46, 0x2c, 0xbd, 0xc6, 0xf6, 0xf5, 0x97, 0xd3, - 0xa5, 0xfb, 0x16, 0x5e, 0xd6, 0x0d, 0x65, 0xfe, 0x7f, 0x44, 0xdc, 0x36, - 0x2c, 0xa1, 0x4f, 0x3f, 0xa3, 0x97, 0xfa, 0x24, 0x59, 0xf7, 0xb1, 0x65, - 0xff, 0xf1, 0xf5, 0xc3, 0x04, 0x39, 0xa5, 0x1a, 0xd9, 0x65, 0xfc, 0x5a, - 0x77, 0x7f, 0x2c, 0xbf, 0xfe, 0xf7, 0x07, 0xac, 0x31, 0x7a, 0xd3, 0x96, - 0xcb, 0x2f, 0x88, 0x78, 0x2a, 0xcb, 0xdd, 0x03, 0x16, 0x54, 0x95, 0x0d, - 0xe1, 0x17, 0xc4, 0x66, 0xeb, 0xa2, 0x3e, 0x99, 0x3a, 0x87, 0x0a, 0xfc, - 0xa4, 0x02, 0x2b, 0xfb, 0xdc, 0x9a, 0x0b, 0x65, 0x97, 0xe2, 0x14, 0xf3, - 0x8b, 0x2f, 0xf6, 0xa5, 0xd3, 0xe1, 0x8d, 0x65, 0xf3, 0xf9, 0xc2, 0xb2, - 0x8c, 0xf5, 0x1a, 0x33, 0xbe, 0x03, 0x6f, 0x9b, 0x2c, 0xbf, 0xf3, 0x4f, - 0xfe, 0x07, 0xaf, 0xff, 0x16, 0x54, 0x1f, 0x4e, 0x14, 0x5f, 0xfb, 0x8f, - 0xf4, 0x13, 0x8f, 0x05, 0x59, 0x46, 0x9b, 0x27, 0x5e, 0xca, 0x11, 0x7e, - 0x20, 0xba, 0x3a, 0xb2, 0xc3, 0x59, 0x4c, 0x34, 0xe4, 0x2d, 0x61, 0x56, - 0x5e, 0x2f, 0xe1, 0x65, 0xc4, 0x39, 0xc6, 0xbb, 0x82, 0x57, 0xf6, 0x71, - 0xa7, 0x2d, 0x96, 0x56, 0x22, 0xa9, 0xd3, 0x88, 0xba, 0xfd, 0xa0, 0x71, - 0xc2, 0xb2, 0xf8, 0x5e, 0x0e, 0x16, 0x54, 0x1e, 0x58, 0x0a, 0x2d, 0xc5, - 0x96, 0xc5, 0x96, 0x61, 0x9a, 0x16, 0xf1, 0x1b, 0xfe, 0xc2, 0x79, 0x72, - 0x4d, 0x6c, 0xb2, 0xfa, 0x5c, 0x32, 0x59, 0x7f, 0xe0, 0x93, 0xf5, 0xfe, - 0xcf, 0xbc, 0xb2, 0xd1, 0x24, 0x4d, 0x7c, 0x74, 0x02, 0x1b, 0xfc, 0xfa, - 0x94, 0x04, 0xc2, 0xb2, 0xa1, 0x72, 0x2b, 0x23, 0x93, 0x38, 0xc4, 0xba, - 0xf0, 0xe8, 0x45, 0x0c, 0x30, 0x1b, 0x5f, 0xfe, 0x15, 0xf3, 0xef, 0x7a, - 0x33, 0x79, 0x85, 0x65, 0xfe, 0x2c, 0xe7, 0x9d, 0xc9, 0x65, 0x0a, 0x7f, - 0x9b, 0xd3, 0x2f, 0xff, 0xfc, 0x7a, 0xd4, 0x09, 0xe3, 0x20, 0x4b, 0x38, - 0x30, 0x3e, 0xa4, 0xb2, 0xff, 0xfe, 0x2c, 0x17, 0x0a, 0x77, 0x3d, 0xdc, - 0x60, 0x91, 0xfa, 0xca, 0x84, 0x65, 0x63, 0x65, 0xfe, 0x03, 0xf0, 0xe6, - 0x36, 0x96, 0x51, 0xa6, 0x89, 0xd8, 0x77, 0x91, 0x0d, 0xee, 0xc1, 0x2c, - 0xbd, 0xf7, 0x98, 0xb2, 0x82, 0x6e, 0x5c, 0x6e, 0xf8, 0x7a, 0x36, 0x96, - 0x5e, 0xc0, 0x0d, 0x65, 0x6c, 0x6f, 0xf8, 0x47, 0x7f, 0x84, 0x7d, 0xe7, - 0x31, 0xb4, 0xb2, 0xff, 0x03, 0x5b, 0x32, 0x33, 0xcb, 0x2f, 0xfb, 0x90, - 0xc1, 0xf6, 0x08, 0x2b, 0x2e, 0x32, 0xc3, 0xec, 0x14, 0xd2, 0xa1, 0x19, - 0xe3, 0x85, 0x1d, 0xe9, 0x03, 0x8b, 0x2f, 0xe1, 0xbe, 0xbf, 0xdc, 0xc5, - 0x97, 0xba, 0x26, 0xf5, 0x97, 0xfd, 0x0c, 0x2c, 0x0e, 0x8f, 0xf5, 0x96, - 0x1a, 0xcb, 0xdc, 0xe6, 0x2c, 0xb0, 0xe0, 0xd6, 0xb8, 0x8d, 0x49, 0x15, - 0x5c, 0x20, 0x03, 0x2d, 0xfd, 0xd7, 0x30, 0xe1, 0x2c, 0xbf, 0xd2, 0xc3, - 0xe7, 0x01, 0x0b, 0x2f, 0xe1, 0xe1, 0x4b, 0xb8, 0xb2, 0xa0, 0xf7, 0x8c, - 0xca, 0xff, 0xde, 0x86, 0x7c, 0x13, 0xfb, 0x34, 0xb2, 0xfd, 0xdc, 0xd1, - 0xf1, 0x65, 0xe2, 0x39, 0x7c, 0x7c, 0xfe, 0x40, 0xbf, 0xf3, 0xe7, 0xf0, - 0x4e, 0x3c, 0x15, 0x65, 0x42, 0x70, 0x1b, 0x42, 0x26, 0x50, 0x87, 0xfc, - 0xce, 0xff, 0xf1, 0x7b, 0x73, 0x26, 0x93, 0xeb, 0x61, 0xc2, 0xcb, 0xff, - 0xf8, 0xa5, 0x1e, 0x7e, 0xf0, 0xdf, 0xdf, 0x88, 0x52, 0x59, 0x7d, 0xef, - 0x66, 0xea, 0xcb, 0xfe, 0x8c, 0x97, 0x70, 0xe5, 0xc5, 0x95, 0xc3, 0xdc, - 0xf1, 0x2d, 0xf8, 0x73, 0x74, 0x1b, 0xab, 0x2b, 0xe3, 0xcf, 0x22, 0x2a, - 0xc4, 0xdd, 0x8d, 0x39, 0xe3, 0x06, 0xbf, 0x68, 0x8f, 0x05, 0x59, 0x73, - 0x24, 0xb2, 0xff, 0x9f, 0x02, 0x3c, 0xd7, 0xe6, 0xb2, 0xda, 0x19, 0xe7, - 0xf4, 0x5e, 0xa1, 0x13, 0xc6, 0xed, 0x7f, 0xd1, 0x2e, 0x14, 0x7e, 0xec, - 0x59, 0x7f, 0x1e, 0xb6, 0x07, 0xf8, 0xb2, 0xfd, 0xe8, 0xc2, 0x0a, 0xcb, - 0xef, 0xbd, 0x0c, 0x59, 0x42, 0x9e, 0x4f, 0xc4, 0xd7, 0xfd, 0x21, 0x3c, - 0x7d, 0x32, 0xf2, 0xcb, 0xff, 0xd1, 0x9f, 0x7b, 0xb1, 0xe2, 0x8f, 0xf8, - 0xb2, 0xe8, 0xfd, 0x65, 0xdd, 0x62, 0xca, 0x09, 0xae, 0xe0, 0xbd, 0x6c, - 0x9b, 0x71, 0xbc, 0x39, 0x27, 0x8e, 0x40, 0xf1, 0x7f, 0xf8, 0x80, 0xf2, - 0x60, 0x3d, 0xd8, 0x03, 0x6d, 0x65, 0xed, 0x8f, 0x4b, 0x2f, 0xfb, 0x87, - 0xf7, 0xa6, 0x94, 0x7c, 0xb2, 0xfd, 0xcf, 0x73, 0x3c, 0xb2, 0xb8, 0x7c, - 0x80, 0x3c, 0xbf, 0x80, 0xdb, 0x39, 0x8d, 0xa5, 0x97, 0x67, 0x56, 0x5e, - 0x69, 0xa6, 0x92, 0x5f, 0xfe, 0xf1, 0xfb, 0x9d, 0x3d, 0xc1, 0x35, 0x12, - 0x49, 0x3c, 0xd0, 0x50, 0xa9, 0xb6, 0x1c, 0x20, 0x5c, 0x8b, 0xc6, 0x60, - 0x36, 0xba, 0x63, 0x59, 0x7f, 0xff, 0x4a, 0x0b, 0x3d, 0xd3, 0xcf, 0x43, - 0x0f, 0x52, 0x59, 0x63, 0xd1, 0xf7, 0xf8, 0x5e, 0xa4, 0xcb, 0xcd, 0x1b, - 0x6e, 0x2f, 0x86, 0x1e, 0x3f, 0x13, 0x98, 0xec, 0xd0, 0xdb, 0xd4, 0x76, - 0x0c, 0x8e, 0xff, 0xb0, 0xd2, 0xfc, 0x84, 0xa3, 0xa6, 0xe2, 0x57, 0xa3, - 0xba, 0xdf, 0x0b, 0xeb, 0xfe, 0xfa, 0x5c, 0xe6, 0x0d, 0xfc, 0xb2, 0xfe, - 0xd7, 0xa0, 0x0d, 0xbe, 0x2c, 0xb6, 0x2c, 0xbe, 0xd1, 0x3e, 0xf5, 0x97, - 0xb1, 0xc9, 0x65, 0xce, 0xd2, 0xca, 0x84, 0x68, 0x0c, 0xe8, 0x53, 0x23, - 0x10, 0xd1, 0x1b, 0x06, 0xaf, 0x7f, 0xcc, 0x59, 0x67, 0x59, 0x7a, 0x3b, - 0xc5, 0x95, 0xf1, 0xac, 0x31, 0x0b, 0xff, 0x40, 0x67, 0x61, 0x40, 0x1b, - 0x7c, 0x59, 0x7f, 0xff, 0x3f, 0x8f, 0xae, 0xc9, 0xd9, 0xc8, 0xcd, 0x61, - 0x2c, 0xbf, 0xfb, 0x8f, 0xf7, 0x39, 0x85, 0xfe, 0xe6, 0x2c, 0xbf, 0xfc, - 0x61, 0xe4, 0x6e, 0x67, 0xa5, 0x2c, 0xe2, 0xca, 0xd2, 0x6a, 0x2c, 0x21, - 0x24, 0x3f, 0x2c, 0xef, 0x48, 0xbe, 0xd7, 0x70, 0x96, 0x51, 0x9f, 0x6b, - 0xa6, 0x5f, 0xc3, 0x12, 0x47, 0xff, 0x16, 0x5f, 0xc5, 0x38, 0x4e, 0x46, - 0x2c, 0xbe, 0xf4, 0x7c, 0xd2, 0xca, 0x0a, 0xaa, 0xae, 0xca, 0x07, 0x72, - 0x0f, 0xcc, 0x1a, 0x2f, 0xbf, 0xff, 0x78, 0x02, 0x78, 0xa3, 0xf7, 0xf7, - 0xe2, 0x14, 0x96, 0x5f, 0xc7, 0xef, 0x61, 0x31, 0x65, 0xcd, 0x75, 0x65, - 0xff, 0xe8, 0x20, 0x89, 0xa7, 0xfc, 0xfd, 0xd8, 0x59, 0x7f, 0x17, 0xbb, - 0x9f, 0xba, 0xcb, 0xf9, 0x93, 0xbb, 0x9f, 0xba, 0xcb, 0xf9, 0xae, 0x66, - 0x16, 0xcb, 0x2a, 0x11, 0x17, 0x85, 0xa6, 0x61, 0x7d, 0x1c, 0x8d, 0xeb, - 0x2f, 0xfe, 0x82, 0x7f, 0x4a, 0x05, 0x76, 0xbc, 0xb2, 0xba, 0x7c, 0xe0, - 0x23, 0xbd, 0x39, 0xc2, 0xb2, 0xa1, 0x52, 0x34, 0x96, 0x42, 0x59, 0xf8, - 0xc7, 0x21, 0xab, 0xe8, 0x4a, 0x37, 0x91, 0x5f, 0xd2, 0x11, 0x8c, 0x3d, - 0xd5, 0x97, 0xf4, 0xb9, 0xe3, 0x8f, 0x96, 0x5f, 0x30, 0x48, 0x25, 0x97, - 0xc6, 0x3c, 0x62, 0xcb, 0xe7, 0x72, 0xfd, 0x65, 0x9a, 0x83, 0xc2, 0x14, - 0x86, 0xe0, 0x31, 0x65, 0xfe, 0x69, 0xe6, 0xc9, 0x46, 0xea, 0xcb, 0xf3, - 0x78, 0x26, 0x39, 0x96, 0x51, 0xa2, 0x93, 0xa5, 0x3c, 0x17, 0x01, 0xbd, - 0xff, 0x1b, 0x3b, 0xf3, 0xee, 0xfb, 0x8b, 0x2f, 0xe0, 0xbf, 0x7b, 0x83, - 0x59, 0x50, 0x7d, 0x40, 0x3d, 0xbf, 0xd0, 0xfa, 0xeb, 0x4e, 0x34, 0x97, - 0x34, 0xd2, 0x4a, 0x19, 0xe6, 0x34, 0x67, 0x7b, 0xc7, 0xba, 0x92, 0x79, - 0xa3, 0xbf, 0xbe, 0x09, 0xf3, 0xa6, 0xb2, 0xf8, 0x12, 0x07, 0x96, 0x54, - 0x2b, 0x20, 0xf8, 0xc8, 0xcb, 0xa6, 0x8c, 0x21, 0x90, 0xa6, 0xe4, 0x24, - 0x3c, 0x63, 0xb8, 0x5d, 0x7c, 0x43, 0xeb, 0xac, 0xbd, 0x8f, 0xba, 0xb2, - 0xb0, 0xdf, 0xe8, 0x86, 0xe6, 0xb8, 0xb2, 0xd8, 0xb2, 0xdf, 0x61, 0xa8, - 0xf0, 0xc5, 0xf7, 0xd2, 0x6c, 0x7c, 0xb2, 0xff, 0xee, 0x70, 0x65, 0x03, - 0xec, 0x7b, 0x8b, 0x2a, 0x11, 0x29, 0x84, 0xe0, 0x29, 0xbf, 0xdd, 0x37, - 0x97, 0x8f, 0x65, 0x97, 0xfe, 0xf1, 0xe9, 0xff, 0x6f, 0xf6, 0x75, 0x65, - 0xff, 0x1b, 0x45, 0x9e, 0x30, 0x7e, 0xb2, 0xfc, 0x7a, 0x1c, 0x6c, 0xb2, - 0xff, 0x3e, 0xbd, 0xc2, 0x31, 0x56, 0x5f, 0xfe, 0xe6, 0x0b, 0x80, 0xd3, - 0x8e, 0x3b, 0x0b, 0x2a, 0x49, 0xc0, 0x7c, 0x5c, 0x66, 0x7b, 0xa8, 0x5d, - 0x39, 0x72, 0x8e, 0x19, 0xdf, 0xf7, 0xbb, 0x9f, 0x82, 0x3e, 0x11, 0x65, - 0xff, 0xff, 0x9c, 0xfd, 0x1d, 0x2c, 0xf7, 0x4c, 0x49, 0x46, 0xf3, 0x2f, - 0xd6, 0x5f, 0x83, 0x8c, 0x8e, 0x2c, 0xbc, 0x02, 0x1a, 0xca, 0xf9, 0x1d, - 0x7d, 0x3c, 0x76, 0xcf, 0xc9, 0xef, 0x61, 0xe9, 0x65, 0xfe, 0x91, 0xb3, - 0xbf, 0x3e, 0xea, 0xcb, 0xe7, 0xd4, 0x49, 0x65, 0xff, 0x3f, 0xd3, 0xbe, - 0xe6, 0x10, 0xab, 0x2b, 0x64, 0x58, 0x7c, 0x36, 0xc3, 0x7f, 0x10, 0xdf, - 0x77, 0x74, 0xd8, 0xb2, 0xf1, 0x47, 0xeb, 0x2a, 0x71, 0xe0, 0xf0, 0x96, - 0xfe, 0xf3, 0xb1, 0x90, 0xc5, 0x97, 0x43, 0x30, 0xf4, 0x7e, 0x24, 0xbf, - 0xf4, 0x7d, 0xd8, 0x60, 0x7a, 0x73, 0x2c, 0xbf, 0x3f, 0xff, 0xfb, 0xab, - 0x2a, 0x15, 0x2b, 0x64, 0x3b, 0x8e, 0x1a, 0x3a, 0x2d, 0x74, 0x0b, 0xf8, - 0x87, 0xce, 0x1b, 0x16, 0x5f, 0x82, 0xfb, 0x63, 0x4b, 0x2f, 0xd1, 0xa1, - 0xe1, 0x2c, 0xac, 0x3f, 0xc2, 0x2d, 0xf1, 0x4d, 0xfa, 0x37, 0x0f, 0xa0, - 0x59, 0x7b, 0x72, 0x04, 0x59, 0x7f, 0xf4, 0x7f, 0x1d, 0x61, 0x38, 0xbd, - 0x35, 0x96, 0x6c, 0xac, 0xbf, 0xbb, 0x04, 0xd3, 0xfc, 0xb2, 0xff, 0xc5, - 0x34, 0x61, 0x6d, 0x9f, 0x79, 0x65, 0x0c, 0xfb, 0x5c, 0xba, 0xf0, 0xa2, - 0x31, 0x65, 0xff, 0xc6, 0x3e, 0xc0, 0x63, 0xf7, 0x2f, 0xd6, 0x5f, 0x34, - 0xf0, 0xc5, 0x97, 0xe7, 0xe6, 0xc7, 0xa5, 0x97, 0xda, 0x30, 0x6c, 0xb8, - 0xbd, 0x57, 0xfe, 0xc3, 0xdf, 0x85, 0x83, 0x79, 0x2e, 0x2f, 0x55, 0xf9, - 0xcb, 0xe9, 0x4f, 0x19, 0xfd, 0x34, 0x61, 0x43, 0x47, 0x23, 0x21, 0x45, - 0x7e, 0x17, 0xce, 0xe4, 0xb2, 0xf1, 0x03, 0x65, 0x94, 0xe7, 0x89, 0xe2, - 0x7a, 0x34, 0x46, 0x93, 0x65, 0x42, 0xb7, 0x51, 0x96, 0x99, 0x56, 0x88, - 0x18, 0x88, 0xf0, 0x82, 0x22, 0x1e, 0x0f, 0xf9, 0x10, 0x11, 0xc9, 0xdc, - 0xdd, 0x37, 0x2b, 0x2f, 0x1c, 0x69, 0x65, 0x36, 0x4d, 0xe7, 0x48, 0x6f, - 0xfe, 0xd1, 0xb2, 0x37, 0x4b, 0x19, 0xf4, 0x2c, 0xa9, 0x1f, 0x5c, 0xc4, - 0xb7, 0xc6, 0x4e, 0x35, 0x97, 0xb6, 0x61, 0xac, 0xa1, 0x9b, 0xd2, 0x20, - 0xbf, 0x4b, 0x37, 0xc4, 0x96, 0x5e, 0xcd, 0x42, 0xca, 0xf9, 0x18, 0x86, - 0xc1, 0xa2, 0x0e, 0x94, 0xdc, 0x53, 0x2c, 0xbf, 0xba, 0xf3, 0x6a, 0x36, - 0x59, 0x7f, 0x1f, 0xdc, 0xee, 0x05, 0x65, 0xff, 0xf6, 0x7b, 0x99, 0x37, - 0x63, 0x7e, 0x77, 0xb0, 0xb2, 0xff, 0xff, 0xfc, 0x79, 0xf7, 0x0f, 0x1a, - 0x9d, 0x9f, 0x4b, 0x87, 0xee, 0x1f, 0xc3, 0x18, 0x36, 0x59, 0x7f, 0xfe, - 0x32, 0x1c, 0xe1, 0x3c, 0x7c, 0x73, 0x20, 0x49, 0x65, 0xf3, 0xed, 0xd3, - 0x59, 0x58, 0x9e, 0x31, 0x8b, 0xcc, 0x5e, 0x45, 0xde, 0x51, 0xdf, 0x08, - 0x9d, 0xc5, 0x6b, 0xc0, 0xd4, 0x96, 0x5f, 0xf9, 0x8e, 0x3d, 0x47, 0xbb, - 0x83, 0x59, 0x7f, 0x3f, 0xbf, 0x10, 0xa4, 0xb2, 0xff, 0x86, 0xee, 0xd7, - 0xef, 0xee, 0x2c, 0xbf, 0xf0, 0xe3, 0xcf, 0x2c, 0xde, 0xe3, 0x59, 0x7f, - 0xa4, 0x24, 0x11, 0x01, 0x8b, 0x2a, 0x72, 0x66, 0xd0, 0x3b, 0xb1, 0xf0, - 0xa5, 0xec, 0x3a, 0x73, 0xfb, 0xfd, 0x12, 0x39, 0xed, 0x34, 0xd2, 0x4b, - 0xb3, 0xab, 0x2f, 0x0b, 0x83, 0x59, 0x7f, 0x75, 0xf4, 0x18, 0xf2, 0xcb, - 0x9c, 0x6b, 0x2f, 0xed, 0x3f, 0x3a, 0xf2, 0x59, 0x6f, 0x96, 0x5c, 0x6d, - 0x2c, 0xb8, 0x4f, 0xd6, 0x54, 0xc6, 0xc3, 0xf1, 0x7b, 0xd2, 0x71, 0xac, - 0xb9, 0xa6, 0x96, 0x54, 0x91, 0xbb, 0x82, 0xc1, 0x2d, 0x34, 0x2e, 0x11, - 0xb4, 0x39, 0x7b, 0xc2, 0x7e, 0x92, 0x79, 0xeb, 0x5f, 0xec, 0x61, 0x8f, - 0x60, 0x71, 0x65, 0xff, 0xfd, 0xfe, 0xe6, 0x6a, 0x3c, 0x61, 0x31, 0xed, - 0x05, 0x0b, 0x2f, 0x67, 0xde, 0x59, 0x6c, 0x23, 0xfa, 0xe2, 0xed, 0x75, - 0x1a, 0x9c, 0x85, 0x75, 0xff, 0x18, 0xf1, 0x87, 0x31, 0xb4, 0xb2, 0xff, - 0xf3, 0x8f, 0x30, 0x85, 0xe7, 0x30, 0xbf, 0x59, 0x7d, 0xd0, 0x38, 0xb0, - 0x88, 0x26, 0x1c, 0xde, 0x28, 0xea, 0xcb, 0xff, 0xfa, 0x4f, 0xce, 0x46, - 0x6c, 0x09, 0x0f, 0x44, 0xed, 0x2c, 0xb4, 0x0d, 0x16, 0x22, 0x9d, 0x18, - 0xdd, 0x71, 0x39, 0x0f, 0x46, 0xb7, 0x7f, 0x1b, 0x03, 0x84, 0x15, 0x97, - 0xcf, 0xb7, 0x3a, 0xb2, 0xb4, 0x79, 0xfc, 0x2c, 0xa9, 0xcb, 0x98, 0x92, - 0x16, 0x18, 0xef, 0xd1, 0xb0, 0x1c, 0xa9, 0x6f, 0x3c, 0xdf, 0xb7, 0x89, - 0xd3, 0xf2, 0xcb, 0xfe, 0xcf, 0x76, 0x35, 0xec, 0x0a, 0xcb, 0xf7, 0xd8, - 0x40, 0x99, 0x65, 0xda, 0x99, 0x65, 0xda, 0x85, 0x95, 0x06, 0xbb, 0x06, - 0x2a, 0x19, 0x47, 0xd9, 0x28, 0x0c, 0xe3, 0xa3, 0xea, 0xd3, 0xce, 0x7e, - 0x7e, 0xd2, 0x45, 0x60, 0x38, 0xdc, 0x57, 0xbf, 0xee, 0x83, 0xdd, 0xcd, - 0x1f, 0x16, 0x5e, 0xe3, 0xcc, 0xb2, 0xff, 0xd9, 0xbe, 0x06, 0x59, 0xec, - 0xfd, 0x65, 0xd8, 0x4b, 0x2d, 0x9f, 0x1e, 0xa6, 0xf3, 0xfb, 0xf7, 0x7d, - 0x12, 0x62, 0xcb, 0x84, 0xfd, 0x65, 0x68, 0xfa, 0xfa, 0x55, 0xf9, 0x45, - 0xff, 0xc6, 0x37, 0xf1, 0xf3, 0x25, 0x9d, 0x59, 0x73, 0xb7, 0xac, 0xbd, - 0x9f, 0x79, 0x65, 0xb3, 0xa7, 0xf1, 0xe4, 0x26, 0xf1, 0x9b, 0xff, 0xbf, - 0x10, 0xa4, 0x59, 0xef, 0x66, 0xcb, 0x2f, 0xda, 0x7d, 0xed, 0xee, 0xb2, - 0x86, 0xa9, 0x9b, 0xe3, 0x9d, 0x43, 0x70, 0xa1, 0x51, 0xe3, 0x7d, 0xe8, - 0xd7, 0xed, 0xf8, 0x46, 0x2a, 0xcb, 0xc4, 0x16, 0xf5, 0x97, 0xff, 0xf7, - 0xdc, 0x27, 0xe7, 0x72, 0x59, 0xd3, 0xd7, 0x5d, 0x65, 0xf6, 0x7d, 0xb6, - 0xf5, 0x97, 0xfc, 0x43, 0xc2, 0x04, 0xb3, 0x8b, 0x2f, 0xbe, 0xe0, 0x3f, - 0x59, 0x71, 0x05, 0x65, 0x41, 0xbb, 0x72, 0x5b, 0xfc, 0x27, 0x8b, 0x36, - 0x3d, 0x2c, 0xbe, 0xf1, 0xf0, 0xd6, 0x54, 0x27, 0x5d, 0x85, 0x26, 0x3f, - 0xa5, 0xa7, 0x26, 0xfd, 0xc8, 0x87, 0xc0, 0x69, 0x7f, 0xf6, 0xd0, 0x27, - 0xe0, 0x94, 0x9f, 0xa0, 0x59, 0x7f, 0xdd, 0x31, 0x9b, 0x6e, 0x08, 0xd6, - 0x5f, 0xe7, 0x96, 0x0f, 0x5c, 0xe2, 0xcb, 0xe8, 0xc1, 0x06, 0xb2, 0xff, - 0xfe, 0x91, 0x46, 0x73, 0x0b, 0xdd, 0xc1, 0x83, 0xdc, 0x59, 0x7f, 0x85, - 0x3f, 0x3f, 0x5a, 0xdd, 0x59, 0x7f, 0x46, 0xdb, 0x99, 0xa8, 0x59, 0x7f, - 0xb2, 0x6e, 0xe7, 0x1c, 0x96, 0x5f, 0xf8, 0x79, 0xf4, 0xb9, 0xee, 0x3f, - 0xeb, 0x2b, 0x47, 0xe6, 0x03, 0x2b, 0xee, 0x73, 0x1a, 0x59, 0x7f, 0x9a, - 0x1f, 0x73, 0x7e, 0x69, 0x65, 0xff, 0xc6, 0xc9, 0xc1, 0xe9, 0xf4, 0x27, - 0xc5, 0x97, 0xfb, 0x25, 0x80, 0x6d, 0xb9, 0x2c, 0xbf, 0xfa, 0x25, 0xd8, - 0xfb, 0xd1, 0xd7, 0xdd, 0x59, 0x50, 0x8f, 0x8d, 0x1b, 0x75, 0x18, 0x8d, - 0x6f, 0xff, 0xf1, 0x96, 0x7d, 0xe1, 0x5f, 0xdd, 0x8e, 0xe6, 0xf7, 0x92, - 0xca, 0x1a, 0xb6, 0x30, 0x99, 0xfc, 0x44, 0x6b, 0x33, 0x1c, 0x6a, 0x14, - 0x7d, 0x22, 0xf4, 0x63, 0x7b, 0xce, 0xee, 0x28, 0x59, 0x7f, 0xc3, 0x3d, - 0x46, 0xff, 0xf9, 0x25, 0x97, 0x43, 0x16, 0x54, 0x1e, 0x97, 0x4f, 0x2b, - 0xa8, 0x88, 0xf3, 0x3d, 0xff, 0x71, 0xfa, 0x63, 0x09, 0xec, 0xb2, 0xff, - 0x3c, 0xb0, 0x7c, 0xe4, 0x2c, 0xbf, 0xbd, 0xd8, 0x64, 0xc4, 0xb2, 0xa1, - 0x13, 0x38, 0x73, 0xf9, 0x95, 0x42, 0xec, 0xf6, 0x4b, 0x9d, 0x78, 0xc5, - 0x81, 0x0b, 0xcb, 0xd0, 0x5e, 0x59, 0x7f, 0xfd, 0x1a, 0xcd, 0xe7, 0xef, - 0xc0, 0x5c, 0x31, 0xac, 0xbf, 0x1e, 0xa5, 0x34, 0x2c, 0xbf, 0xfb, 0xb8, - 0x4e, 0x2f, 0x4f, 0xd2, 0x35, 0x96, 0x3e, 0x9f, 0x5f, 0x0a, 0x2f, 0xff, - 0xc6, 0x00, 0x89, 0xf7, 0xef, 0xc7, 0xd1, 0xfd, 0xfa, 0xcb, 0xf8, 0x1e, - 0xe4, 0x7f, 0xb2, 0xcb, 0xe7, 0xd4, 0x49, 0x65, 0xff, 0xfc, 0x64, 0xe6, - 0x5f, 0xea, 0x3a, 0xe7, 0xe8, 0xea, 0xca, 0x1a, 0x2a, 0x08, 0xc3, 0xc4, - 0x37, 0xe3, 0xf7, 0x01, 0xb2, 0xcb, 0xff, 0xc4, 0x7f, 0xfb, 0xe0, 0x9e, - 0x84, 0x81, 0xac, 0xbf, 0xee, 0x88, 0x30, 0x7b, 0x9f, 0xc2, 0xca, 0x84, - 0x44, 0x3a, 0x65, 0x0d, 0x50, 0x19, 0xc6, 0x04, 0xc2, 0xff, 0x42, 0xc6, - 0xfe, 0x7f, 0xdc, 0xc6, 0x6b, 0x2f, 0x43, 0x21, 0x65, 0x68, 0xf1, 0xf7, - 0x96, 0x5f, 0xb4, 0x00, 0xf6, 0x16, 0x5f, 0xda, 0x9a, 0x47, 0xee, 0x2c, - 0xb1, 0x41, 0xeb, 0xe1, 0x45, 0xfe, 0x99, 0xe6, 0x7f, 0xa5, 0xc5, 0x97, - 0xf3, 0xec, 0x73, 0x1b, 0x4b, 0x2f, 0xff, 0xf3, 0xb5, 0xec, 0xec, 0xe1, - 0xe4, 0xd2, 0x7d, 0x6d, 0xd0, 0x2c, 0xac, 0x46, 0x5b, 0x9b, 0x11, 0x7d, - 0xfb, 0x0b, 0x6c, 0x69, 0x65, 0xf9, 0xd9, 0xd3, 0x69, 0x65, 0x6c, 0x7a, - 0x03, 0x28, 0xbf, 0xe8, 0xd8, 0x49, 0x74, 0x0f, 0xb2, 0xcb, 0xfe, 0x30, - 0xe4, 0xce, 0x5b, 0x36, 0x16, 0x56, 0x22, 0x73, 0x44, 0x64, 0x79, 0x66, - 0xca, 0xcb, 0xf4, 0x6b, 0x59, 0xd5, 0x97, 0x9e, 0x5e, 0x59, 0x7f, 0xfd, - 0x02, 0xb5, 0x87, 0xbd, 0xa7, 0x1c, 0x63, 0x16, 0x5f, 0xc4, 0xe2, 0xc3, - 0x21, 0x65, 0x36, 0x11, 0xad, 0x21, 0x56, 0x13, 0x90, 0xe0, 0x14, 0xaf, - 0x6c, 0x28, 0xab, 0x2f, 0xe9, 0x00, 0x73, 0xc5, 0xdd, 0x59, 0x7f, 0x31, - 0xfe, 0x6e, 0xb3, 0xab, 0x2f, 0x34, 0xfc, 0x59, 0x7f, 0x32, 0x30, 0xbd, - 0xc5, 0x97, 0xe8, 0xdb, 0x24, 0x6b, 0x2f, 0x08, 0x39, 0xf8, 0x8a, 0x3e, - 0x99, 0xf0, 0x77, 0xc5, 0x95, 0x32, 0x65, 0x3d, 0x86, 0xc5, 0x42, 0x6e, - 0x63, 0x8d, 0x26, 0xff, 0xfc, 0x61, 0x86, 0x71, 0xf5, 0x8c, 0x00, 0x5e, - 0x4b, 0x2e, 0x3d, 0xeb, 0x2f, 0xf4, 0x13, 0xf4, 0x05, 0xb2, 0xcb, 0xff, - 0xb0, 0xc5, 0x81, 0x99, 0x3e, 0x85, 0x59, 0x6e, 0xac, 0xa9, 0x23, 0xcb, - 0x75, 0x51, 0x83, 0x04, 0x64, 0x04, 0x3b, 0xc3, 0x86, 0x2c, 0xbf, 0xbf, - 0xc9, 0xa3, 0xee, 0x2c, 0xbf, 0xff, 0xc4, 0xed, 0x77, 0x18, 0xed, 0x7b, - 0x98, 0xd0, 0xcd, 0x8b, 0x2b, 0x11, 0x25, 0x31, 0x85, 0xfe, 0x14, 0xb3, - 0x6d, 0x80, 0x4b, 0x2a, 0x13, 0x06, 0xc8, 0x57, 0x00, 0x8e, 0xfe, 0xeb, - 0xca, 0x39, 0x25, 0x97, 0xfd, 0x9d, 0x3f, 0xb9, 0xd0, 0x71, 0x65, 0xd8, - 0x41, 0x3e, 0x7f, 0xcb, 0x6f, 0xfd, 0xf4, 0xa3, 0xde, 0x87, 0x66, 0xcb, - 0x2f, 0xff, 0x67, 0x5d, 0xd8, 0x4f, 0xa3, 0x8e, 0x2c, 0xb6, 0x31, 0x10, - 0xdb, 0xd0, 0x2f, 0xcf, 0xf8, 0xf0, 0x96, 0x57, 0x4f, 0x44, 0x8a, 0xaf, - 0xc7, 0xb9, 0x9a, 0x15, 0x65, 0xcf, 0x0b, 0x2e, 0x16, 0x4b, 0x2f, 0xdd, - 0x3d, 0xe6, 0x15, 0x97, 0x67, 0x64, 0x78, 0x21, 0x18, 0xa6, 0x22, 0xbb, - 0x85, 0x7b, 0x8a, 0xd7, 0x9a, 0x69, 0xa4, 0x97, 0xfe, 0xd1, 0x01, 0xc4, - 0xc9, 0xa1, 0x8b, 0x27, 0x9a, 0x0b, 0xf7, 0x4e, 0x63, 0x69, 0x65, 0x82, - 0xb2, 0xa1, 0x11, 0x78, 0xa3, 0xa2, 0x9b, 0xfd, 0x03, 0xc9, 0x41, 0x05, - 0x65, 0x43, 0x3b, 0xc7, 0x61, 0xb9, 0x42, 0xf3, 0x25, 0x15, 0x1c, 0x24, - 0x37, 0x5e, 0xe6, 0x87, 0x86, 0xa3, 0x19, 0x64, 0x60, 0x9d, 0x8f, 0x01, - 0xe3, 0x1b, 0x28, 0xd4, 0xb9, 0x09, 0xbf, 0x46, 0x08, 0x08, 0x67, 0xb5, - 0x0d, 0xe1, 0x0b, 0xaf, 0xcc, 0x3d, 0x3f, 0xeb, 0x2f, 0xb5, 0xac, 0xea, - 0xcb, 0xfb, 0xa6, 0xde, 0xde, 0x01, 0x56, 0x54, 0x1e, 0xb8, 0x48, 0xac, - 0xdb, 0x59, 0x63, 0x59, 0x7f, 0xde, 0x8d, 0x73, 0xb0, 0x5e, 0x59, 0x66, - 0xda, 0xcb, 0xfe, 0xf4, 0x6b, 0x9d, 0x82, 0xf2, 0xcb, 0xb9, 0x0b, 0x2f, - 0x30, 0x70, 0xb2, 0xff, 0x17, 0x9e, 0x6e, 0x47, 0x96, 0x51, 0x9e, 0x7b, - 0x8e, 0x5f, 0x1b, 0xe0, 0x56, 0x5f, 0xfb, 0x37, 0x96, 0x72, 0x62, 0x81, - 0xac, 0xbe, 0x08, 0xe3, 0x65, 0x97, 0x7f, 0x0b, 0x2f, 0x70, 0xf4, 0xb2, - 0xb0, 0xf5, 0xbf, 0x23, 0xf0, 0xbd, 0xfe, 0x96, 0x11, 0x8f, 0x09, 0x65, - 0xef, 0x72, 0x7c, 0x27, 0xcd, 0x82, 0xb3, 0x1c, 0x75, 0x97, 0xf2, 0x02, - 0x20, 0xe4, 0x25, 0x7c, 0x5f, 0x77, 0x21, 0x65, 0xe6, 0x0e, 0x16, 0x5f, - 0xe2, 0xf3, 0xcd, 0xc8, 0xf2, 0xca, 0x33, 0xcf, 0x71, 0xcb, 0xe3, 0x7c, - 0x0a, 0xcb, 0xff, 0x66, 0xf2, 0xce, 0x4c, 0x50, 0x35, 0x97, 0xc1, 0x1c, - 0x6c, 0xb2, 0xfe, 0x9b, 0xf3, 0xdd, 0x79, 0x96, 0x5d, 0xfc, 0x2c, 0xbd, - 0xc3, 0xd2, 0xca, 0xc4, 0x44, 0x84, 0x8f, 0xf3, 0x3f, 0x0b, 0xdf, 0xe9, - 0x61, 0x18, 0xf0, 0x96, 0x5f, 0xc4, 0xe3, 0xc1, 0x67, 0xc2, 0xe5, 0x38, - 0xc5, 0x70, 0x40, 0x32, 0x87, 0xa6, 0x84, 0x57, 0x59, 0x7f, 0x20, 0x22, - 0x0e, 0x43, 0x23, 0xc7, 0xb7, 0xff, 0x6a, 0x3e, 0xe1, 0x43, 0x33, 0xef, - 0x2c, 0xbf, 0xff, 0x38, 0xf3, 0x08, 0x51, 0x0a, 0x0b, 0x63, 0xd2, 0xcb, - 0xcf, 0xad, 0x97, 0x20, 0x92, 0xfa, 0x59, 0xf4, 0x97, 0x20, 0x92, 0xf7, - 0x0c, 0x6b, 0x90, 0x49, 0x73, 0x4d, 0x2e, 0x41, 0x25, 0x05, 0x15, 0x33, - 0x15, 0x78, 0xc1, 0xa2, 0x9b, 0x9f, 0xc9, 0x90, 0x48, 0x9e, 0x6f, 0xef, - 0xff, 0xfe, 0x19, 0x40, 0xfb, 0x1e, 0xe4, 0x7a, 0x07, 0x1e, 0xc6, 0x7e, - 0xd2, 0xcb, 0xfb, 0x3b, 0x98, 0x42, 0xac, 0xbc, 0xe5, 0xfc, 0xe5, 0xfd, - 0xf8, 0x9c, 0xc8, 0xd4, 0x30, 0x98, 0x8a, 0x51, 0x9e, 0x70, 0xdb, 0xce, - 0x57, 0xdb, 0x98, 0xfd, 0x59, 0x6c, 0xdd, 0x45, 0x7f, 0xf0, 0x8b, 0xb4, - 0x96, 0x5f, 0xd2, 0x06, 0xde, 0x3d, 0x92, 0x5f, 0x38, 0xfb, 0x8b, 0x2f, - 0x0c, 0xd8, 0xb2, 0xff, 0xdd, 0x8f, 0x19, 0x43, 0x23, 0x8b, 0x28, 0x53, - 0xf9, 0x72, 0x1e, 0x0e, 0x54, 0xc8, 0xd8, 0xec, 0x2a, 0x6f, 0xfa, 0x0a, - 0x45, 0x1f, 0xbb, 0x16, 0x5f, 0xc1, 0x3e, 0x7b, 0x3a, 0xb2, 0xfd, 0x34, - 0x74, 0x1a, 0x59, 0x68, 0x59, 0x7f, 0x8e, 0x40, 0x7e, 0x74, 0xd6, 0x5f, - 0xd9, 0xbd, 0xd9, 0x9d, 0x59, 0x69, 0x24, 0xbc, 0xfa, 0xd9, 0x25, 0x24, - 0xa8, 0x37, 0x21, 0x11, 0x60, 0xed, 0xe8, 0xfc, 0x29, 0x27, 0x9a, 0xda, - 0x62, 0x30, 0xca, 0x12, 0x97, 0x8a, 0x5d, 0x59, 0x50, 0x99, 0xc6, 0x43, - 0xd5, 0x84, 0xf7, 0xf9, 0xf6, 0xc2, 0xd8, 0xf4, 0xb2, 0xfd, 0xaf, 0xd8, - 0x7c, 0x59, 0x7f, 0x08, 0x52, 0xe7, 0x46, 0xb3, 0x0d, 0x4d, 0xfd, 0xee, - 0x7e, 0xef, 0xa5, 0x97, 0xc0, 0x7d, 0x49, 0x65, 0x98, 0xb2, 0xd2, 0x19, - 0xb3, 0x98, 0x8a, 0xa1, 0x11, 0x38, 0xc3, 0x7f, 0xf6, 0x7d, 0xee, 0x19, - 0x47, 0xee, 0xc5, 0x97, 0xa5, 0x1f, 0x2c, 0xbe, 0xc9, 0x8d, 0x8b, 0x2b, - 0x64, 0x41, 0xcc, 0x88, 0xd0, 0xed, 0xfa, 0x26, 0x94, 0x7e, 0x92, 0xf6, - 0x17, 0xeb, 0x2f, 0xff, 0xdd, 0xc3, 0x97, 0x27, 0x7b, 0xb8, 0x30, 0x7b, - 0x8b, 0x28, 0x28, 0x9d, 0xd1, 0x4f, 0x87, 0x2f, 0xfb, 0xf7, 0x2f, 0x4d, - 0x9a, 0xc5, 0x96, 0x35, 0x97, 0xfd, 0xb0, 0x24, 0x3e, 0x81, 0xc9, 0x65, - 0xfc, 0x70, 0xcd, 0xb1, 0xa5, 0x97, 0xec, 0xd9, 0x98, 0xc5, 0x97, 0xb8, - 0x7a, 0x59, 0x44, 0x78, 0x9e, 0x28, 0xbf, 0x89, 0xff, 0xfc, 0x1c, 0x59, - 0x7f, 0x18, 0xa2, 0x43, 0x27, 0x8d, 0x30, 0xcc, 0x10, 0xd1, 0xd7, 0x1c, - 0xbc, 0x43, 0x58, 0xaa, 0xd4, 0xe1, 0xa0, 0xe6, 0x05, 0x1a, 0x2d, 0xfd, - 0xde, 0xe6, 0xde, 0xe2, 0xcb, 0xd9, 0xb0, 0x16, 0x56, 0x1e, 0x61, 0x17, - 0xdf, 0xf6, 0x7a, 0x71, 0x67, 0xe2, 0x7c, 0xb2, 0xa1, 0xb1, 0xc4, 0x95, - 0x24, 0x34, 0x66, 0x39, 0x0e, 0x91, 0x4a, 0x7e, 0x37, 0x32, 0xdd, 0x14, - 0xf6, 0x34, 0x87, 0x34, 0xfd, 0x70, 0xa1, 0x8f, 0xc9, 0x6b, 0x3e, 0x84, - 0x96, 0xe1, 0x05, 0xff, 0xfb, 0x6d, 0x6b, 0x06, 0xec, 0xeb, 0xf8, 0xa2, - 0x65, 0x97, 0xff, 0xff, 0x81, 0xa0, 0x4c, 0x4f, 0xff, 0x39, 0x82, 0xe0, - 0x34, 0xe3, 0x8e, 0xc2, 0xcb, 0xf8, 0x11, 0xad, 0x1e, 0xcb, 0x2f, 0xe9, - 0x47, 0xfd, 0x36, 0x96, 0x5f, 0xce, 0x3e, 0xc1, 0x01, 0x65, 0xf0, 0x45, - 0xd7, 0xeb, 0x2d, 0x3c, 0x68, 0xae, 0x98, 0xb9, 0x85, 0xe4, 0x59, 0x7d, - 0x1b, 0xa3, 0x85, 0x97, 0xcd, 0xfd, 0x00, 0x8b, 0x2f, 0xfa, 0x26, 0x00, - 0x9c, 0x3c, 0x25, 0x97, 0x9a, 0x69, 0xa4, 0x97, 0x4a, 0x12, 0x4f, 0x34, - 0x17, 0xba, 0xd9, 0x69, 0x65, 0x42, 0xab, 0x0d, 0x95, 0xb2, 0x32, 0x70, - 0xa2, 0xfc, 0x49, 0x31, 0x3e, 0x96, 0x77, 0x94, 0x5f, 0xff, 0x1f, 0xa6, - 0xcd, 0x69, 0xe6, 0xcd, 0x67, 0x96, 0x5f, 0xc2, 0xc6, 0xb5, 0x9d, 0x59, - 0x7f, 0x6d, 0x34, 0x9b, 0x3a, 0xd9, 0x65, 0xff, 0xef, 0xd8, 0xf2, 0x9d, - 0x03, 0xd9, 0x91, 0xa5, 0x97, 0xc7, 0x05, 0xe5, 0x97, 0xb6, 0x72, 0x59, - 0x5a, 0x44, 0x57, 0x53, 0xbc, 0x41, 0x7f, 0xe1, 0x41, 0xc9, 0x1e, 0xb6, - 0x07, 0xeb, 0x2e, 0x2c, 0x59, 0x79, 0xfe, 0x69, 0x65, 0x0a, 0x7e, 0xc6, - 0x87, 0xd1, 0x5b, 0xc7, 0x0c, 0x59, 0x73, 0x8d, 0x65, 0xb6, 0xd1, 0xb1, - 0xf0, 0xdd, 0xf7, 0x47, 0x84, 0xb2, 0xff, 0xfa, 0x04, 0xf1, 0x47, 0xef, - 0xef, 0xc4, 0x29, 0x2c, 0xa6, 0xed, 0x53, 0x0e, 0x43, 0x00, 0xe1, 0x4c, - 0xec, 0x1c, 0x28, 0xf1, 0x0d, 0xf0, 0x83, 0xe9, 0xac, 0xbf, 0xf3, 0xfb, - 0x8d, 0x67, 0x7f, 0x7f, 0x2c, 0xbf, 0xff, 0xf6, 0x7a, 0x02, 0x59, 0x85, - 0x12, 0xf7, 0x5d, 0x85, 0x9b, 0xd6, 0x56, 0xc8, 0xcc, 0x19, 0x1b, 0x48, - 0x17, 0x84, 0x1c, 0xcb, 0x2f, 0x48, 0xc9, 0x65, 0xf6, 0xc2, 0x37, 0xb4, - 0xb2, 0xff, 0xa3, 0xae, 0x7e, 0x98, 0xda, 0x59, 0x7f, 0xef, 0xf3, 0x47, - 0xfe, 0x7f, 0xa6, 0x2c, 0xbf, 0xfc, 0x2c, 0x73, 0x51, 0xd2, 0xcf, 0x43, - 0x16, 0x5c, 0x01, 0x16, 0x5f, 0xe2, 0xcd, 0xe7, 0x31, 0xb4, 0xb2, 0xba, - 0x79, 0xbc, 0x18, 0xbf, 0xff, 0x80, 0xfb, 0x04, 0x1b, 0x7b, 0x3a, 0x59, - 0xee, 0x9a, 0xcb, 0xf4, 0x4c, 0x40, 0xe2, 0xca, 0xc4, 0xcf, 0x0e, 0x12, - 0xdd, 0x22, 0xf2, 0xe5, 0xc6, 0x4b, 0x2f, 0xe7, 0x2f, 0xf3, 0xc2, 0xac, - 0xa8, 0x55, 0x9f, 0xb1, 0x94, 0x87, 0xdc, 0x6c, 0x8a, 0x78, 0x73, 0xe8, - 0xdf, 0x77, 0xa0, 0xee, 0x0a, 0xdf, 0x17, 0xa3, 0x71, 0x65, 0xfb, 0x7c, - 0x69, 0xfa, 0xb2, 0xfb, 0xa0, 0x64, 0x2c, 0xb9, 0xf8, 0xb2, 0xe0, 0x36, - 0xd6, 0x53, 0x76, 0x8a, 0x03, 0x24, 0x72, 0x92, 0x22, 0x00, 0xb5, 0xcf, - 0x3d, 0xbb, 0x7f, 0xf1, 0x76, 0xc4, 0x29, 0xdb, 0x98, 0x49, 0xb6, 0x61, - 0x4c, 0xda, 0x8a, 0xdb, 0x5c, 0x72, 0x4d, 0xa1, 0xab, 0x70, 0x35, 0x89, - 0xde, 0x1d, 0xa5, 0x92, 0x4a, 0x54, 0xf8, 0xe7, 0x45, 0x72, 0x9c, 0x00, - 0x2c, 0x79, 0xc1, 0x96, 0x01, 0xf4, 0xa9, 0xa3, 0x97, 0x27, 0xbb, 0x0c, - 0x59, 0xa5, 0x2e, 0x6a, 0x5d, 0x43, 0x27, 0x10, 0xfb, 0x4c, 0x3d, 0x79, - 0x5f, 0x9f, 0xca, 0x13, 0x6d, 0xb7, 0x14, 0xef, 0x37, 0x29, 0xe8, 0x1e, - 0xac, 0xbe, 0x41, 0x2e, 0x9f, 0x7b, 0xe3, 0x4a, 0x1b, 0x92, 0xa3, 0xc4, - 0x9c, 0x00, 0x6f, 0x8c, 0xa6, 0xfc, 0xcc, 0x37, 0xfd, 0x65, 0xf0, 0x5d, - 0xc2, 0xa8, 0xa2, 0x97, 0xff, 0xe7, 0xfe, 0x03, 0xd3, 0xe7, 0x4f, 0xdd, - 0xc2, 0x59, 0x5a, 0x44, 0x11, 0x17, 0x5e, 0x79, 0x4f, 0x84, 0x65, 0xe4, - 0x2a, 0x6f, 0xff, 0xc3, 0x39, 0x8a, 0x3d, 0xcf, 0x7c, 0x13, 0x2d, 0x96, - 0x5a, 0x7b, 0x11, 0x21, 0xc3, 0x9b, 0xfd, 0x3f, 0x34, 0x17, 0x70, 0xaa, - 0x2e, 0x85, 0xff, 0xd3, 0xde, 0x53, 0xf3, 0x41, 0x77, 0x0a, 0xa2, 0x4b, - 0x5f, 0xb4, 0x17, 0x70, 0xaa, 0x2f, 0x25, 0xcf, 0xbd, 0x65, 0xa7, 0xe1, - 0xe6, 0x6e, 0x1a, 0x54, 0x42, 0x33, 0x53, 0x68, 0x59, 0xc8, 0xdb, 0x21, - 0x38, 0x18, 0x58, 0x4c, 0x8c, 0xc4, 0x1e, 0xce, 0x85, 0xb9, 0xf9, 0x5f, - 0xfb, 0x57, 0x27, 0x0b, 0x3c, 0x56, 0x04, 0x1d, 0xf0, 0xa0, 0xbf, 0xfd, - 0x3d, 0x8f, 0x29, 0xf9, 0xa0, 0xbb, 0x85, 0x51, 0x2c, 0xaf, 0x9b, 0xb1, - 0x77, 0x1b, 0xb5, 0x96, 0x6c, 0xac, 0xb7, 0x56, 0x53, 0x76, 0x69, 0x80, - 0x2b, 0x7f, 0x8c, 0x7d, 0xc3, 0x21, 0x56, 0x5f, 0x75, 0xfc, 0x05, 0x97, - 0xdd, 0x8d, 0xd6, 0x2c, 0xbf, 0xf6, 0x74, 0xe4, 0x59, 0x80, 0x6d, 0xac, - 0xbf, 0xf6, 0x1e, 0xf3, 0x20, 0x4b, 0x38, 0xb2, 0xf0, 0x02, 0xeb, 0x2a, - 0x49, 0x89, 0x99, 0x96, 0xe9, 0x13, 0x09, 0x49, 0x00, 0x43, 0xeb, 0xf8, - 0x7e, 0x03, 0xcb, 0x8b, 0x2f, 0x8f, 0x76, 0x36, 0x59, 0x7f, 0x32, 0x08, - 0x5c, 0xd9, 0x65, 0xce, 0xc5, 0x95, 0x87, 0x89, 0xe2, 0xeb, 0xf0, 0x3c, - 0x7d, 0x85, 0x97, 0xfe, 0xec, 0x74, 0xc5, 0xf7, 0x1f, 0xf5, 0x97, 0xfc, - 0xf2, 0xe0, 0x3d, 0x1e, 0xe2, 0xcb, 0xf8, 0xbd, 0xa8, 0x70, 0xac, 0xb9, - 0xf8, 0xb2, 0xff, 0xfc, 0xef, 0x27, 0xec, 0xec, 0xd8, 0x1e, 0x3e, 0xc2, - 0xca, 0xd8, 0xfb, 0x26, 0x16, 0xbc, 0xee, 0x15, 0x44, 0x66, 0xbf, 0xff, - 0xfb, 0x3d, 0xcf, 0x78, 0xfb, 0xf4, 0xb8, 0x40, 0xc1, 0x45, 0x37, 0x92, - 0xca, 0x0a, 0x27, 0x34, 0x51, 0x7f, 0x1c, 0x33, 0x6c, 0x69, 0x65, 0xc5, - 0x25, 0x96, 0x62, 0xcb, 0xf1, 0xeb, 0xaf, 0x3f, 0x47, 0xaa, 0xc2, 0xe1, - 0x05, 0xad, 0xd5, 0x97, 0x46, 0x96, 0x58, 0xc2, 0x69, 0xf7, 0x88, 0xdf, - 0x1e, 0x9f, 0x4b, 0x2e, 0xe6, 0xea, 0xcb, 0x3c, 0x8d, 0xdf, 0x88, 0x6f, - 0xfe, 0xe1, 0x83, 0x98, 0x40, 0x96, 0x71, 0x65, 0xee, 0x47, 0xcb, 0x2f, - 0xff, 0x9b, 0x67, 0xee, 0x1f, 0x8a, 0x00, 0xfa, 0x15, 0x65, 0x6c, 0xb8, - 0x43, 0x22, 0x71, 0xa0, 0x61, 0xc9, 0xc2, 0x63, 0x50, 0xc0, 0x63, 0xc7, - 0x5d, 0x49, 0x8f, 0x84, 0xde, 0x43, 0x00, 0xed, 0xff, 0x69, 0xda, 0xe9, - 0xc6, 0xa1, 0x65, 0xff, 0xfe, 0xe9, 0xfb, 0xc7, 0xc1, 0x36, 0x8d, 0x8b, - 0x3f, 0x07, 0x16, 0x5f, 0xf4, 0xb9, 0x91, 0x3a, 0x38, 0xc5, 0x97, 0xee, - 0xe1, 0x3b, 0x16, 0x5f, 0x7d, 0xd8, 0xe2, 0xcb, 0xd3, 0x39, 0x2c, 0xbd, - 0x1e, 0xe2, 0xcb, 0xff, 0x60, 0xbc, 0x8c, 0x21, 0xf6, 0x16, 0x57, 0x0f, - 0x64, 0x03, 0x95, 0x24, 0x70, 0x61, 0x34, 0xc4, 0x7c, 0x75, 0xbf, 0xfb, - 0xc7, 0xa7, 0xfe, 0x77, 0xd2, 0x86, 0x2c, 0xbf, 0x14, 0x4b, 0x8e, 0xb2, - 0x8c, 0xfb, 0xb7, 0xa4, 0x5b, 0xab, 0x2f, 0xff, 0xfe, 0xf1, 0xb3, 0x47, - 0x9f, 0x10, 0x3d, 0x1d, 0x9d, 0xbc, 0xfd, 0x34, 0x2c, 0xb6, 0x62, 0x21, - 0xfc, 0x23, 0x7f, 0x9e, 0x5c, 0xe3, 0x94, 0x96, 0x5c, 0xe3, 0x59, 0x7e, - 0x93, 0x90, 0x02, 0xb2, 0x82, 0x6f, 0x7e, 0x16, 0xbc, 0xdb, 0x8d, 0xd5, - 0x97, 0xfe, 0xf3, 0x97, 0xf3, 0x84, 0xcf, 0x9a, 0x59, 0x7d, 0xef, 0x43, - 0x16, 0x5f, 0x4b, 0xc7, 0xb2, 0xca, 0xc4, 0x44, 0x8a, 0x88, 0xe4, 0x57, - 0x8b, 0x02, 0xb2, 0xff, 0xf7, 0xa0, 0x27, 0xe3, 0x64, 0xdc, 0x32, 0x59, - 0x7f, 0x99, 0x9a, 0xfc, 0x81, 0xfa, 0xcb, 0x49, 0x65, 0x62, 0x2a, 0x8c, - 0x6d, 0xd2, 0x44, 0x35, 0xbf, 0x7f, 0x1e, 0x81, 0xac, 0xa8, 0x54, 0x15, - 0x84, 0x47, 0x0a, 0xc7, 0x86, 0xc8, 0x0e, 0xef, 0xff, 0x81, 0xee, 0x7d, - 0x28, 0x2f, 0xf9, 0x38, 0x04, 0xb2, 0xf4, 0x7a, 0x16, 0x50, 0xcf, 0xbf, - 0x7a, 0xa5, 0xee, 0xe1, 0x2c, 0xa3, 0x37, 0xe0, 0x24, 0xbb, 0xb3, 0x2c, - 0xbe, 0xc9, 0xb2, 0x65, 0x97, 0xed, 0x03, 0xd9, 0xb2, 0xcb, 0xec, 0xd0, - 0xe1, 0x65, 0xdf, 0x72, 0x71, 0xf6, 0xc1, 0x19, 0x14, 0xd1, 0xa3, 0x05, - 0xe1, 0x0b, 0x7f, 0xde, 0xe6, 0x6b, 0xf2, 0x07, 0xeb, 0x2f, 0xff, 0x6a, - 0x3d, 0xce, 0xc1, 0xfb, 0x91, 0xb2, 0xcb, 0xef, 0x3f, 0x61, 0x65, 0xf7, - 0xba, 0x0d, 0xc5, 0x97, 0xfb, 0x23, 0x4f, 0x23, 0xea, 0xcb, 0xfc, 0x6d, - 0x72, 0x3a, 0xfb, 0xab, 0x2b, 0x47, 0xcf, 0xe3, 0x1b, 0xf7, 0xbb, 0xf6, - 0x37, 0xac, 0xa1, 0xa6, 0x8d, 0xf2, 0x51, 0x90, 0xb2, 0x11, 0xbd, 0x22, - 0xbf, 0x71, 0xc5, 0xe9, 0xac, 0xbf, 0xed, 0xd1, 0xf4, 0x1c, 0xfa, 0x4e, - 0xb2, 0xe3, 0xee, 0x1f, 0x30, 0x0a, 0x2a, 0x15, 0x31, 0xe4, 0x70, 0x2f, - 0x0b, 0x6b, 0xc2, 0x63, 0x65, 0x65, 0xff, 0xe0, 0x7e, 0xc3, 0x2c, 0xfc, - 0xb1, 0xe6, 0x59, 0x7f, 0x8f, 0xa7, 0x05, 0x30, 0x16, 0x5f, 0xe3, 0xd6, - 0x61, 0x7d, 0xe5, 0x95, 0x07, 0xc8, 0xe6, 0x57, 0xfe, 0x00, 0xf5, 0x80, - 0xec, 0x33, 0x16, 0x56, 0x26, 0x5b, 0xa2, 0x1e, 0xc2, 0xbb, 0x84, 0x17, - 0xff, 0xa4, 0x7a, 0x1f, 0x41, 0xac, 0x0f, 0x71, 0x65, 0xf7, 0x80, 0xfe, - 0x59, 0x7b, 0x7e, 0x69, 0x65, 0x41, 0xe0, 0x61, 0x15, 0x7c, 0x8a, 0xa2, - 0x84, 0x55, 0xc6, 0xd2, 0xcb, 0x9b, 0xf1, 0x65, 0x70, 0xd8, 0x78, 0x5e, - 0xfe, 0xe4, 0x7b, 0x9d, 0x35, 0x97, 0xe2, 0xc6, 0x6b, 0x16, 0x5f, 0x6b, - 0x7e, 0x0d, 0x65, 0x61, 0xfb, 0xb0, 0xb4, 0x04, 0xd7, 0x87, 0x9e, 0x59, - 0x7f, 0xb0, 0xa7, 0x76, 0x33, 0x75, 0x65, 0xff, 0x8f, 0xdc, 0xc1, 0xcc, - 0x50, 0x35, 0x97, 0xdf, 0x9f, 0xd2, 0x59, 0x7f, 0xa0, 0xbc, 0x7b, 0x14, - 0x2c, 0xbf, 0xfc, 0x7a, 0x3d, 0xa0, 0xb3, 0xba, 0x06, 0xf5, 0x94, 0x34, - 0xcc, 0x18, 0x39, 0xd3, 0x6f, 0xcf, 0x88, 0x93, 0xc6, 0x37, 0xff, 0xa0, - 0x82, 0xfe, 0x71, 0x44, 0xda, 0x36, 0x59, 0x7f, 0xe3, 0x18, 0x3d, 0xc7, - 0xf3, 0x8a, 0xb2, 0xff, 0x1e, 0x35, 0xf4, 0xb9, 0x38, 0x54, 0x45, 0xba, - 0x65, 0x37, 0x6d, 0xba, 0xdb, 0x72, 0xaf, 0x11, 0x9c, 0xec, 0xb5, 0x22, - 0xe1, 0xb4, 0xe4, 0xe2, 0x10, 0xb0, 0xb0, 0x09, 0xc7, 0xcc, 0x87, 0x18, - 0xd4, 0xd0, 0xab, 0xd4, 0x2a, 0x98, 0x4f, 0xd9, 0x4f, 0x2f, 0x18, 0x07, - 0xf0, 0xe1, 0x29, 0x51, 0x3c, 0x8d, 0x9f, 0xd0, 0xec, 0xde, 0xb1, 0xb9, - 0x09, 0x81, 0x23, 0x5e, 0x6f, 0x87, 0x1d, 0xff, 0x7a, 0x07, 0xad, 0x43, - 0x38, 0xb2, 0xe1, 0x42, 0xb2, 0xfe, 0x64, 0xa2, 0x38, 0x6b, 0x2e, 0x7f, - 0xd6, 0x54, 0x1e, 0x1b, 0x96, 0x5f, 0x9c, 0x6e, 0xff, 0x2c, 0xbb, 0xd3, - 0xe1, 0x1b, 0x6c, 0x39, 0xea, 0xdb, 0x90, 0x5f, 0xff, 0xfc, 0x0f, 0xa5, - 0x3d, 0xcb, 0xd8, 0xce, 0x0f, 0xb1, 0xa1, 0xbb, 0xb4, 0xb2, 0xa7, 0xab, - 0x49, 0xc9, 0x51, 0x64, 0x93, 0x7f, 0xfa, 0x7b, 0x1e, 0x53, 0xf3, 0x41, - 0x77, 0x0a, 0xa2, 0x69, 0x5f, 0xfe, 0x9e, 0xc7, 0x94, 0xfc, 0xd0, 0x5d, - 0xc2, 0xa8, 0x9c, 0x57, 0xe9, 0x67, 0xa5, 0x25, 0x97, 0xfb, 0x7c, 0x76, - 0x71, 0x44, 0x96, 0x5f, 0xf9, 0xe5, 0x3f, 0x34, 0x17, 0x70, 0xaa, 0x28, - 0x15, 0xff, 0xe3, 0x86, 0x38, 0xf5, 0x1e, 0xee, 0x0d, 0x65, 0xf7, 0x0b, - 0xe9, 0x2c, 0xb4, 0xff, 0x93, 0x15, 0x32, 0x86, 0x1b, 0x75, 0x33, 0xc9, - 0x17, 0xed, 0x05, 0xdc, 0x2a, 0x8b, 0x81, 0x7f, 0x16, 0x78, 0x27, 0xc5, - 0x97, 0x41, 0xac, 0xbe, 0xe8, 0x1e, 0x4b, 0x2f, 0xf1, 0x4a, 0x0c, 0x78, - 0xc5, 0x95, 0x88, 0xc8, 0x61, 0xa7, 0x4b, 0x3c, 0x2a, 0x02, 0x2b, 0xf4, - 0xa7, 0x8a, 0xd8, 0x15, 0x65, 0x4f, 0x3f, 0xa8, 0x49, 0xb9, 0xff, 0x59, - 0x7e, 0x9a, 0x50, 0x52, 0x59, 0x4b, 0x2b, 0x0d, 0x99, 0x14, 0x5f, 0xd2, - 0xc1, 0x4b, 0x3f, 0x59, 0x7b, 0xfc, 0x69, 0x65, 0xf1, 0x46, 0x75, 0x65, - 0x41, 0xbe, 0xd8, 0x7a, 0xe3, 0x9f, 0xa4, 0x7b, 0x12, 0x57, 0x87, 0xc4, - 0x6c, 0xbf, 0xe9, 0x4f, 0xcd, 0x05, 0xdc, 0x2a, 0x89, 0x25, 0x69, 0xfd, - 0x44, 0x8b, 0xa5, 0x5f, 0xb1, 0xaf, 0xc1, 0xc5, 0x97, 0x35, 0xfa, 0xcb, - 0xfc, 0xfe, 0x2c, 0xd9, 0xc9, 0x65, 0xfa, 0x26, 0x28, 0x1a, 0xcb, 0x85, - 0x69, 0x65, 0xfd, 0x27, 0xd6, 0xc3, 0x85, 0x97, 0xf6, 0x13, 0xfd, 0x2e, - 0x2c, 0xbf, 0xff, 0x00, 0x9c, 0x5f, 0x0b, 0x05, 0x2c, 0xe9, 0xb1, 0x65, - 0xf9, 0x9a, 0xc1, 0xf9, 0x65, 0xfe, 0x8f, 0x84, 0xf1, 0x47, 0xeb, 0x2a, - 0x0f, 0x74, 0x05, 0x17, 0xe6, 0xfe, 0xc1, 0x0a, 0xb2, 0xff, 0x3e, 0xc5, - 0x9b, 0xc1, 0x0b, 0x2e, 0x79, 0xfb, 0x2a, 0x41, 0x19, 0x50, 0xa3, 0x21, - 0x31, 0xf8, 0x9e, 0x61, 0x9d, 0x17, 0x30, 0xb7, 0x90, 0xb2, 0xf1, 0x0e, - 0xe1, 0x5d, 0x6c, 0xe8, 0xd7, 0x65, 0x5d, 0x7f, 0x04, 0xe6, 0x65, 0xaf, - 0xe3, 0x6f, 0xe4, 0x72, 0xbe, 0x8e, 0xab, 0x7c, 0xa6, 0xbb, 0xff, 0x0a, - 0xf3, 0xf3, 0x41, 0x77, 0x0a, 0xa2, 0xd4, 0x5f, 0xf9, 0xe5, 0x3f, 0x34, - 0x17, 0x70, 0xaa, 0x25, 0x55, 0xc6, 0xd2, 0xca, 0x59, 0x69, 0xe2, 0xa2, - 0xed, 0x89, 0xbe, 0x4c, 0x6f, 0x17, 0xbf, 0xb3, 0x41, 0x77, 0x0a, 0xa2, - 0x29, 0x5f, 0xf9, 0xdd, 0x99, 0xaf, 0xc8, 0x1f, 0xac, 0xbf, 0xf4, 0x7b, - 0x99, 0xaf, 0xc8, 0x1f, 0xac, 0xbe, 0x3e, 0x43, 0xac, 0xbf, 0xc4, 0xff, - 0xf3, 0xd8, 0x15, 0x97, 0x32, 0x7f, 0x51, 0xa4, 0x47, 0xfc, 0x40, 0xf1, - 0x05, 0x4f, 0x4d, 0x55, 0xe3, 0x0b, 0xbf, 0xd3, 0xf3, 0x41, 0x77, 0x0a, - 0xa2, 0x34, 0x5e, 0x6e, 0x1b, 0x8d, 0xda, 0xcb, 0xe6, 0xe9, 0xb5, 0x37, - 0x06, 0xe0, 0xb2, 0xe0, 0x75, 0x65, 0xff, 0x87, 0x8c, 0x3d, 0x67, 0x26, - 0x85, 0x97, 0xff, 0xfc, 0xe0, 0xe7, 0x70, 0x62, 0x09, 0xc3, 0x13, 0xc7, - 0xc9, 0x84, 0x59, 0x7f, 0xfa, 0x63, 0x3e, 0xcd, 0x9e, 0x8f, 0x40, 0xd6, - 0x5e, 0x37, 0x69, 0x25, 0x1a, 0x62, 0x1b, 0xa7, 0xd3, 0x36, 0x31, 0x2a, - 0xf8, 0x2e, 0xe1, 0x54, 0x53, 0xeb, 0xbd, 0x0b, 0x2b, 0x47, 0x89, 0xe2, - 0xeb, 0xfc, 0x7e, 0x3f, 0x74, 0x1e, 0x59, 0x7f, 0xd3, 0x47, 0xba, 0xf3, - 0x4e, 0xc5, 0x95, 0xa3, 0xef, 0xf1, 0x9d, 0xff, 0x3c, 0x8c, 0x7d, 0x89, - 0x71, 0x65, 0xff, 0xfd, 0xd3, 0x82, 0x89, 0xa6, 0x3f, 0xe2, 0x69, 0xb3, - 0xf5, 0x97, 0x74, 0x0b, 0x2b, 0x0f, 0xd4, 0x0b, 0xd7, 0xff, 0x30, 0x81, - 0xd3, 0xd6, 0x72, 0x68, 0x59, 0x7c, 0xf3, 0x1f, 0x56, 0x51, 0x9f, 0x33, - 0x11, 0x2f, 0xbe, 0xf0, 0x34, 0xb2, 0xff, 0xde, 0xd0, 0x26, 0xe0, 0x5e, - 0x6e, 0x2c, 0xac, 0x3e, 0x60, 0x12, 0x5f, 0xe7, 0x28, 0xf1, 0x47, 0x96, - 0x5f, 0xfd, 0x93, 0x00, 0xb6, 0xe0, 0x5e, 0x6e, 0x2c, 0xb9, 0xf8, 0xb2, - 0xff, 0xbd, 0x1f, 0x3c, 0xda, 0x8d, 0xeb, 0x2b, 0x74, 0xf4, 0xbc, 0x2d, - 0x7c, 0x0e, 0x9e, 0x96, 0x5a, 0x7b, 0x76, 0xbb, 0x60, 0xdd, 0x15, 0xb7, - 0x27, 0x51, 0x19, 0x3e, 0x42, 0x14, 0xe1, 0x22, 0xc2, 0x2e, 0xc2, 0xb5, - 0xe1, 0x0e, 0x50, 0x87, 0xe1, 0x0f, 0x8c, 0x01, 0x09, 0x9d, 0xc2, 0x5b, - 0xff, 0xd3, 0xd8, 0xf2, 0x9f, 0x9a, 0x0b, 0xb8, 0x55, 0x13, 0x52, 0xfe, - 0xcd, 0x05, 0xdc, 0x2a, 0x8a, 0xed, 0x7f, 0xfb, 0x1b, 0xcf, 0xc7, 0x29, - 0xc5, 0x1e, 0xe2, 0xca, 0x59, 0x73, 0x53, 0xfa, 0x7b, 0x0d, 0x26, 0xd4, - 0xf4, 0x61, 0x9c, 0x24, 0x6e, 0xfc, 0xd6, 0x5e, 0xe4, 0x31, 0x65, 0xcc, - 0x25, 0x97, 0xc1, 0x77, 0x0a, 0xa2, 0xbe, 0x5e, 0x69, 0xa6, 0x92, 0x58, - 0x92, 0x4f, 0x34, 0x15, 0xa3, 0xf0, 0x62, 0x75, 0xe9, 0x47, 0xcb, 0x2f, - 0x4d, 0x9d, 0x59, 0x73, 0xef, 0x59, 0x7f, 0xdd, 0x69, 0xfd, 0xc8, 0xcd, - 0x96, 0x5f, 0x13, 0xfd, 0xc5, 0x95, 0x87, 0xb9, 0xe3, 0xab, 0x79, 0x65, - 0xff, 0x1e, 0xb3, 0x63, 0x96, 0x0d, 0x65, 0x68, 0xf2, 0x5c, 0x46, 0xf9, - 0xbf, 0xa0, 0x11, 0x65, 0xe9, 0xb2, 0x65, 0x95, 0xf1, 0xe2, 0xcc, 0x4f, - 0x6d, 0x2c, 0xa5, 0x94, 0x65, 0xe6, 0x84, 0x6e, 0xd8, 0x55, 0x95, 0xd3, - 0x70, 0xe3, 0xf6, 0x9e, 0xdc, 0x55, 0x78, 0xc0, 0xbe, 0xc3, 0x99, 0x08, - 0x69, 0x88, 0x9c, 0x77, 0xf1, 0xd2, 0x74, 0xe3, 0x50, 0x19, 0xb7, 0x1e, - 0x2f, 0xff, 0x4f, 0x63, 0xca, 0x7e, 0x68, 0x2e, 0xe1, 0x54, 0x4f, 0x6b, - 0x36, 0xd6, 0x5f, 0xf0, 0xdc, 0x30, 0x10, 0x10, 0xd6, 0x5f, 0x43, 0x7b, - 0xfc, 0xb2, 0xf1, 0x97, 0xeb, 0x2b, 0x63, 0xf9, 0xe9, 0xc6, 0xf2, 0x5b, - 0xf1, 0x8e, 0x35, 0xc5, 0x97, 0xed, 0x05, 0xdc, 0x2a, 0x8b, 0x85, 0x7f, - 0xba, 0x72, 0x07, 0xf1, 0x32, 0xcb, 0x4f, 0x6c, 0x26, 0xa1, 0x10, 0x8e, - 0x91, 0x96, 0x13, 0x99, 0xa5, 0xff, 0xd3, 0xde, 0x53, 0xf3, 0x41, 0x77, - 0x0a, 0xa2, 0x4f, 0x5f, 0xf8, 0xe6, 0x9f, 0x00, 0x8f, 0x47, 0xeb, 0x2a, - 0x1b, 0x03, 0x3d, 0xa3, 0x9e, 0x91, 0x58, 0xb3, 0xbe, 0x21, 0x87, 0xdc, - 0xd1, 0x8e, 0xea, 0x58, 0xd7, 0x61, 0x5f, 0xc8, 0xea, 0xb7, 0xac, 0xb4, - 0xa9, 0x7f, 0xa7, 0xe6, 0x82, 0xee, 0x15, 0x44, 0x54, 0xbf, 0x68, 0x2e, - 0xe1, 0x54, 0x53, 0x2b, 0xf8, 0xfb, 0x8f, 0xf7, 0xeb, 0x2d, 0x3f, 0x0f, - 0x8b, 0x70, 0xd2, 0xff, 0xf4, 0xf6, 0x3c, 0xa7, 0xe6, 0x82, 0xee, 0x15, - 0x44, 0xce, 0xbf, 0xfd, 0x3d, 0x8f, 0x29, 0xf9, 0xa0, 0xbb, 0x85, 0x51, - 0x46, 0xab, 0x64, 0xe0, 0xc7, 0x0a, 0x31, 0x4b, 0x3c, 0xb5, 0x7f, 0xe7, - 0x94, 0xfc, 0xd0, 0x5d, 0xc2, 0xa8, 0x8e, 0x97, 0xff, 0x6b, 0x69, 0xfc, - 0x2c, 0xf7, 0x21, 0x8b, 0x2f, 0xff, 0xf6, 0xa5, 0x3f, 0x08, 0x1e, 0x00, - 0xbe, 0xf8, 0x27, 0xae, 0x2c, 0xa9, 0xe8, 0xf9, 0x84, 0xc3, 0x47, 0xb8, - 0x1d, 0x59, 0x7c, 0x10, 0x80, 0x2b, 0x2f, 0xd8, 0x43, 0xcd, 0x96, 0x5f, - 0xf1, 0xeb, 0x85, 0x83, 0xec, 0x2c, 0xbf, 0xd1, 0x01, 0xcd, 0x6b, 0x16, - 0x51, 0xa2, 0x3f, 0xa4, 0xe4, 0x6f, 0x7e, 0xcd, 0x04, 0x02, 0xac, 0xbf, - 0xe0, 0xc3, 0x30, 0xd9, 0x1b, 0xab, 0x2f, 0xfc, 0x58, 0x2b, 0xcd, 0xce, - 0xc0, 0xd6, 0x5e, 0x99, 0xfc, 0xb2, 0xf8, 0x2e, 0xe1, 0x54, 0x53, 0x4b, - 0xf6, 0x7c, 0xd3, 0xf5, 0x65, 0xff, 0xdc, 0xc2, 0x1c, 0x4e, 0x6e, 0x3b, - 0xff, 0x35, 0x94, 0x34, 0xd9, 0x30, 0xa4, 0xce, 0xa6, 0x3f, 0xd0, 0xe9, - 0x17, 0x70, 0xa6, 0xff, 0xff, 0xb0, 0xbd, 0xc3, 0x0e, 0x17, 0x03, 0xd3, - 0xe8, 0x44, 0xd9, 0x65, 0xff, 0x71, 0xfe, 0xc9, 0xa3, 0xbc, 0x59, 0x77, - 0x4c, 0x91, 0x43, 0xe6, 0x7b, 0xff, 0xa5, 0xd3, 0x2d, 0xb8, 0x08, 0xd4, - 0xcb, 0x2f, 0x49, 0x92, 0x59, 0x7d, 0xee, 0x3f, 0xeb, 0x2f, 0xf4, 0x7b, - 0x9a, 0x36, 0x62, 0xcb, 0xdf, 0xf8, 0xd6, 0x5f, 0xee, 0x04, 0xf5, 0xa3, - 0xd9, 0x65, 0x42, 0x29, 0xbe, 0x23, 0x73, 0x2e, 0x0e, 0xdf, 0xff, 0xed, - 0xb6, 0x06, 0xa6, 0xe6, 0xd1, 0x37, 0x3b, 0x83, 0x3d, 0xeb, 0x2f, 0xfb, - 0x78, 0x7a, 0x7f, 0xf4, 0xd8, 0xb2, 0xb1, 0x14, 0xa6, 0xd3, 0x7f, 0x80, - 0xe4, 0x19, 0xdb, 0x71, 0x65, 0xfd, 0x05, 0xed, 0xcc, 0xf2, 0xcb, 0xfc, - 0xff, 0xbf, 0xbd, 0x9d, 0x59, 0x52, 0x3e, 0x26, 0x8b, 0xef, 0xba, 0x79, - 0xa5, 0x97, 0x74, 0x0b, 0x2b, 0x0f, 0x6c, 0xc8, 0xff, 0x21, 0xbd, 0xd6, - 0xbf, 0x59, 0x6f, 0x2c, 0xa3, 0x36, 0x1d, 0x1f, 0xb8, 0x70, 0xb2, 0xff, - 0xfd, 0xee, 0x09, 0xcd, 0x40, 0xf3, 0xa1, 0xc2, 0xd9, 0x65, 0x41, 0xf6, - 0xe0, 0xb5, 0xfd, 0x07, 0xfb, 0xf8, 0x0b, 0x2b, 0x11, 0xb4, 0xc8, 0x46, - 0xf4, 0x82, 0xf7, 0xa2, 0x4b, 0x2f, 0xf8, 0x1e, 0xee, 0x4d, 0x28, 0xf9, - 0x65, 0x74, 0xf5, 0xc8, 0x72, 0xd3, 0x2c, 0xbf, 0x67, 0x5c, 0x86, 0xb2, - 0xb6, 0x37, 0x1f, 0x89, 0x5d, 0x02, 0xac, 0xbf, 0x9f, 0xfe, 0x36, 0x8d, - 0xa3, 0x68, 0xb2, 0xfe, 0x38, 0x66, 0xd8, 0xd2, 0xcb, 0xff, 0xec, 0xf7, - 0x72, 0x5a, 0x72, 0xf7, 0x5e, 0x4b, 0x2e, 0x8f, 0xd6, 0x5f, 0xe7, 0xfa, - 0x02, 0x61, 0x9f, 0xa4, 0x49, 0x91, 0x70, 0x89, 0xd5, 0x89, 0xdf, 0x1a, - 0xcf, 0x48, 0xc8, 0x5f, 0x90, 0xd1, 0xbc, 0xf3, 0x71, 0x65, 0xc2, 0x69, - 0x65, 0xfb, 0xfe, 0xc4, 0xb8, 0xb2, 0xf1, 0x00, 0x55, 0x97, 0x9a, 0x7d, - 0x96, 0x5f, 0xf4, 0x7e, 0xfe, 0xfc, 0x42, 0x92, 0xca, 0xe9, 0xec, 0x90, - 0xf5, 0x42, 0x30, 0x08, 0xa7, 0xce, 0xd6, 0x9e, 0xdc, 0xb2, 0xde, 0xe0, - 0x5c, 0x70, 0xb2, 0xc8, 0xe4, 0x83, 0x18, 0x27, 0xc5, 0xa6, 0x8d, 0xa8, - 0x61, 0xf6, 0x1c, 0x3f, 0x90, 0x94, 0x3c, 0xf9, 0x19, 0xc7, 0xa5, 0x24, - 0x81, 0x37, 0x70, 0x74, 0x48, 0x6c, 0x5f, 0xb4, 0x17, 0x70, 0xaa, 0x2a, - 0xa5, 0xff, 0x9e, 0x53, 0xf3, 0x41, 0x77, 0x0a, 0xa2, 0x6d, 0x5a, 0x7e, - 0x22, 0x01, 0x86, 0x97, 0xfa, 0x7e, 0x68, 0x2e, 0xe1, 0x54, 0x57, 0xeb, - 0xf6, 0x82, 0xee, 0x15, 0x45, 0x8c, 0xb9, 0xbe, 0x4b, 0x2d, 0x3f, 0x0f, - 0x3a, 0x63, 0x4b, 0xf7, 0x03, 0xd8, 0x15, 0x65, 0xfe, 0x20, 0x4b, 0x38, - 0xfe, 0x59, 0x7f, 0x37, 0x63, 0x6e, 0x5b, 0x92, 0x15, 0x65, 0xff, 0x10, - 0x36, 0x9a, 0x51, 0xad, 0x96, 0x5d, 0xaf, 0x2c, 0xbe, 0x79, 0x60, 0xd6, - 0x5f, 0xde, 0xcd, 0x0f, 0x09, 0x65, 0xb0, 0x67, 0x9b, 0xe2, 0x1b, 0xa5, - 0x8b, 0x2f, 0xe7, 0x7f, 0x7b, 0x3a, 0xb2, 0x85, 0x3c, 0x2d, 0x0b, 0x5f, - 0xd9, 0xaf, 0x77, 0x36, 0x59, 0x69, 0xf8, 0x9e, 0x53, 0x0c, 0xba, 0x7c, - 0xe7, 0x84, 0xc9, 0xc6, 0x91, 0x08, 0xec, 0x73, 0xd5, 0x2f, 0x6a, 0x3f, - 0x3b, 0xf6, 0x82, 0xee, 0x15, 0x45, 0xaa, 0xbf, 0xf3, 0xca, 0x7e, 0x68, - 0x2e, 0xe1, 0x54, 0x50, 0x4b, 0xf4, 0x35, 0xb9, 0x9a, 0x59, 0x69, 0xf8, - 0x8a, 0xb6, 0x1a, 0x08, 0x99, 0x7d, 0xed, 0x3f, 0x56, 0x5f, 0xd8, 0x3d, - 0x47, 0xb8, 0xb2, 0xfe, 0x86, 0x3f, 0xde, 0x92, 0xca, 0xc3, 0xfd, 0x22, - 0x2e, 0x16, 0xdf, 0xd9, 0xd9, 0xef, 0xaf, 0x2c, 0xb9, 0xda, 0x9e, 0x7b, - 0x9e, 0x2d, 0xbf, 0xd0, 0x5f, 0xc6, 0xeb, 0xb1, 0x65, 0xff, 0xe9, 0xa3, - 0x7b, 0xeb, 0x9c, 0x3d, 0x60, 0xab, 0x2f, 0xf1, 0xcd, 0x1b, 0xdf, 0x5c, - 0x59, 0x6e, 0x2c, 0xa8, 0x3c, 0x62, 0x35, 0xbb, 0x50, 0xb2, 0xa4, 0x8f, - 0xe3, 0x35, 0xec, 0x24, 0xdb, 0xc8, 0x2f, 0x82, 0xee, 0x15, 0x45, 0xc4, - 0xbf, 0x80, 0xff, 0x0f, 0x34, 0xb2, 0xb4, 0x7b, 0x9c, 0x2e, 0xbf, 0xff, - 0x48, 0x4e, 0xc9, 0xfc, 0xff, 0x80, 0x9f, 0x78, 0xd6, 0x5e, 0xd8, 0x49, - 0x96, 0x5f, 0x1c, 0xb0, 0x55, 0x97, 0xec, 0x61, 0xb7, 0x8d, 0x65, 0xd0, - 0xc5, 0x95, 0xba, 0x78, 0x1a, 0x2a, 0xbe, 0x76, 0xf3, 0xd9, 0x65, 0xfb, - 0xa0, 0x17, 0x09, 0x65, 0xf8, 0x79, 0xbb, 0x1d, 0x59, 0x79, 0xbc, 0xc2, - 0xb2, 0x86, 0x7e, 0x3a, 0x28, 0x6f, 0x2a, 0xbf, 0xcc, 0x79, 0x70, 0xc7, - 0x8b, 0x2f, 0xa0, 0x58, 0xe2, 0xcb, 0xf1, 0x78, 0x9c, 0x55, 0x94, 0xb2, - 0xdc, 0xc3, 0x65, 0xb8, 0x4f, 0x7f, 0x31, 0xf7, 0xc6, 0x9b, 0xd6, 0x5f, - 0xf8, 0xc7, 0x9b, 0xd9, 0x92, 0xfa, 0x4b, 0x2a, 0x0f, 0xcf, 0x0c, 0xaf, - 0xec, 0xd3, 0xf8, 0x10, 0xb2, 0xff, 0xf9, 0xca, 0x0d, 0xbf, 0x87, 0xcc, - 0xee, 0x6e, 0x2c, 0xa1, 0x9f, 0xf6, 0xf2, 0xcb, 0xff, 0x8c, 0x81, 0x2c, - 0xe7, 0x0c, 0x78, 0xb2, 0xa6, 0x3e, 0x6f, 0x12, 0x5a, 0x7c, 0x2e, 0x69, - 0xe4, 0x28, 0x3e, 0x22, 0x35, 0x99, 0x88, 0x34, 0xc5, 0xd2, 0x57, 0x84, - 0xb7, 0xe6, 0x44, 0x65, 0xc5, 0x4f, 0x42, 0x70, 0x48, 0xc1, 0x2f, 0xf3, - 0x76, 0x4d, 0xcf, 0xb7, 0x1b, 0x91, 0xac, 0xbf, 0x36, 0x5b, 0x57, 0xe2, - 0xc2, 0xcb, 0xff, 0x1f, 0xcd, 0xa7, 0x35, 0x3a, 0x77, 0x77, 0x16, 0x5f, - 0x76, 0x3c, 0x15, 0x94, 0xda, 0xcf, 0xbc, 0x69, 0xb7, 0xff, 0x9b, 0x41, - 0x5a, 0xdd, 0xd8, 0x6d, 0x99, 0xd3, 0xbb, 0xb8, 0xb2, 0xfd, 0xce, 0x3e, - 0xfc, 0x59, 0x7c, 0x17, 0x70, 0xaa, 0x2e, 0x95, 0xf8, 0x81, 0xe8, 0xe2, - 0xca, 0xd1, 0xea, 0xf4, 0xba, 0xfd, 0x04, 0xe3, 0x85, 0x97, 0xf4, 0xa3, - 0xe7, 0xe4, 0x96, 0x5f, 0x49, 0xbf, 0x3c, 0xb2, 0xfb, 0x90, 0xdf, 0xc5, - 0x95, 0x07, 0x94, 0xde, 0x4b, 0x7a, 0x3c, 0xde, 0xb2, 0xfb, 0x07, 0x83, - 0x59, 0x7f, 0xcf, 0xbe, 0x3d, 0xc0, 0x05, 0xb6, 0xb2, 0xfb, 0x9b, 0x38, - 0x8b, 0x2d, 0x3d, 0xba, 0x56, 0xf0, 0xda, 0x23, 0x44, 0x28, 0xe4, 0x50, - 0x36, 0x3c, 0x7e, 0x32, 0x29, 0x89, 0x58, 0xf1, 0xd2, 0x47, 0x1f, 0x22, - 0x1f, 0x1f, 0xdf, 0xfe, 0x2f, 0x1b, 0x3b, 0x06, 0x4f, 0xa1, 0x56, 0x5f, - 0xcf, 0xe8, 0x64, 0x12, 0xca, 0xc3, 0xf3, 0xd2, 0x45, 0xff, 0x99, 0xc0, - 0x7a, 0x47, 0xbf, 0xa6, 0xb2, 0xfe, 0xcc, 0xe0, 0x7d, 0x0b, 0x2f, 0xed, - 0xa3, 0xce, 0x28, 0x16, 0x52, 0xcb, 0xff, 0xa3, 0x5f, 0xce, 0xe7, 0x61, - 0x8e, 0x4b, 0x2f, 0xf4, 0x68, 0x4e, 0xf7, 0x3f, 0x59, 0x52, 0x3f, 0xbe, - 0xa3, 0x5f, 0xd2, 0x79, 0x39, 0x05, 0x65, 0xff, 0xec, 0xf4, 0x34, 0x26, - 0xdc, 0xc6, 0x46, 0xea, 0xcb, 0x31, 0x65, 0xa7, 0xb7, 0x69, 0x9a, 0x64, - 0x21, 0xa6, 0x22, 0x22, 0xcf, 0x27, 0xd6, 0x93, 0xbf, 0x64, 0x6c, 0x77, - 0xd8, 0xd3, 0x76, 0xc5, 0x97, 0xf1, 0x47, 0xcc, 0x7f, 0x2c, 0xbf, 0xfc, - 0xd3, 0x8f, 0xb1, 0xf7, 0xa3, 0xaf, 0xba, 0xb2, 0xc7, 0xa3, 0xfb, 0xe9, - 0x6d, 0xff, 0xff, 0x03, 0x52, 0xe7, 0x5c, 0xf5, 0xad, 0x03, 0xe3, 0xd3, - 0xf1, 0x65, 0xff, 0x89, 0xda, 0xf6, 0x75, 0xe6, 0x75, 0x97, 0xff, 0xf7, - 0x48, 0x0f, 0xbb, 0x92, 0xee, 0x0b, 0x83, 0x98, 0x0b, 0x2e, 0x0e, 0x2c, - 0xa8, 0x3f, 0x51, 0x57, 0xef, 0xf3, 0xfb, 0x91, 0xd1, 0x26, 0x59, 0x7a, - 0x50, 0xc5, 0x97, 0x85, 0xe4, 0x96, 0x5f, 0xed, 0x69, 0xe5, 0xb6, 0x34, - 0xb2, 0xe9, 0x80, 0xb2, 0xd2, 0xc3, 0xcd, 0x68, 0xd6, 0xff, 0xec, 0x1c, - 0x4a, 0x35, 0x02, 0x39, 0x2c, 0xbf, 0xf6, 0xfc, 0x93, 0x06, 0x7b, 0xe0, - 0x6b, 0x29, 0x88, 0x84, 0x74, 0x2b, 0x9e, 0x7e, 0xca, 0xb1, 0xe6, 0x68, - 0xd4, 0x2c, 0xfa, 0x44, 0xe6, 0xbc, 0x1c, 0xf3, 0x58, 0x90, 0xac, 0xae, - 0xab, 0x7a, 0x29, 0x5d, 0xd7, 0xfa, 0x59, 0xee, 0xc0, 0x84, 0xb2, 0xff, - 0xde, 0x30, 0x98, 0xdc, 0x85, 0x85, 0x97, 0xfd, 0x1f, 0x75, 0xf9, 0xe8, - 0x69, 0x65, 0x41, 0xfb, 0xe8, 0xf6, 0xff, 0x3f, 0x88, 0x1b, 0x7d, 0xba, - 0xb2, 0xe0, 0x75, 0x65, 0xf8, 0xb3, 0xaf, 0xe5, 0x97, 0xf4, 0x9f, 0x37, - 0xc0, 0xd6, 0x53, 0x60, 0xf5, 0x1b, 0x89, 0x35, 0xf1, 0x82, 0x50, 0xb2, - 0xfb, 0x3e, 0x86, 0x2c, 0xbe, 0x32, 0x8f, 0xd6, 0x5f, 0x9e, 0x69, 0x1f, - 0x96, 0x5f, 0xfa, 0x07, 0xa8, 0x91, 0xfd, 0xec, 0x59, 0x52, 0x46, 0x50, - 0xa4, 0x21, 0x22, 0xfc, 0x87, 0xc5, 0x17, 0xfd, 0xae, 0x74, 0xc2, 0x10, - 0x6c, 0xb2, 0xff, 0xff, 0xed, 0x48, 0x3d, 0x36, 0x30, 0xda, 0xe7, 0xc1, - 0x3c, 0xd0, 0xe3, 0xe5, 0x95, 0x08, 0xb0, 0x01, 0xdd, 0xff, 0xff, 0x40, - 0xfb, 0x9f, 0x78, 0x9f, 0xbf, 0xbf, 0x38, 0xfa, 0x0a, 0xcb, 0xfd, 0x99, - 0x82, 0x8a, 0xf2, 0x59, 0x42, 0xa2, 0x6b, 0xcc, 0xf7, 0xec, 0xe0, 0x7d, - 0x0b, 0x2f, 0xff, 0x1b, 0x5c, 0x0f, 0x4f, 0xef, 0x6b, 0x50, 0xb2, 0xff, - 0xe8, 0xd7, 0x9e, 0x5c, 0xde, 0x0d, 0x1a, 0xcb, 0xff, 0xfe, 0x76, 0x84, - 0xcd, 0x13, 0xfd, 0x20, 0xc7, 0xb9, 0x9f, 0x79, 0x65, 0xff, 0xa2, 0x69, - 0x19, 0x4d, 0x23, 0xea, 0xca, 0xc4, 0xd8, 0x74, 0x4f, 0xd4, 0xc7, 0x46, - 0x26, 0x9b, 0xf6, 0xf3, 0xd6, 0x0d, 0x65, 0xff, 0xf7, 0x3a, 0x7c, 0xf7, - 0x70, 0x67, 0xcc, 0x25, 0x97, 0xbb, 0x05, 0x87, 0xee, 0x02, 0x9b, 0xf3, - 0xf6, 0x44, 0x15, 0x97, 0xfa, 0x19, 0x86, 0xc8, 0xdd, 0x59, 0x7f, 0xa4, - 0xce, 0x19, 0x7d, 0x25, 0x94, 0x13, 0xe8, 0x98, 0xd2, 0xff, 0xf6, 0x6b, - 0x4f, 0x2e, 0x16, 0x30, 0x4f, 0x96, 0x5f, 0xf8, 0x8e, 0x45, 0x9d, 0x27, - 0x92, 0xcb, 0xce, 0xe1, 0x54, 0x49, 0x8b, 0xcd, 0xe7, 0xc5, 0x95, 0x24, - 0x41, 0x04, 0xed, 0xbc, 0xa2, 0xfc, 0x16, 0xd1, 0xb2, 0xdd, 0xb6, 0x16, - 0x5f, 0xfe, 0xfa, 0x5c, 0xcd, 0xee, 0xcc, 0x16, 0x38, 0xb2, 0xff, 0x67, - 0xde, 0xf3, 0xcb, 0x8b, 0x2a, 0x11, 0x79, 0x87, 0x7a, 0x4d, 0xbf, 0xc4, - 0xfe, 0xe0, 0x40, 0x4b, 0x2f, 0xff, 0xbf, 0x3f, 0xda, 0xc3, 0xde, 0x59, - 0xee, 0x9a, 0xcb, 0xfc, 0xff, 0x71, 0xde, 0x5c, 0x59, 0x6d, 0x62, 0x21, - 0x7a, 0xa5, 0x58, 0x8d, 0xf3, 0x85, 0xbd, 0xff, 0x9a, 0xc1, 0xbc, 0xbd, - 0xc7, 0xfd, 0x65, 0xff, 0xfc, 0xff, 0x61, 0x43, 0x42, 0x78, 0xa3, 0xfc, - 0xfb, 0xcb, 0x28, 0xd1, 0x3a, 0x04, 0x0b, 0xff, 0x8f, 0xe6, 0xbd, 0xd3, - 0x82, 0xc0, 0xac, 0xbf, 0xe3, 0x16, 0x07, 0xb3, 0x23, 0x4b, 0x2a, 0x4b, - 0xa1, 0xe3, 0x31, 0xc8, 0x47, 0x84, 0x8f, 0x50, 0xcd, 0x64, 0x3b, 0xfb, - 0x18, 0x6f, 0x21, 0x87, 0xe2, 0x2d, 0xe8, 0x97, 0xf0, 0xff, 0x6c, 0x73, - 0xfd, 0xc5, 0x97, 0xb8, 0x63, 0x59, 0x7f, 0x14, 0x7c, 0xc7, 0xf2, 0xcb, - 0xfe, 0x80, 0xf8, 0x1d, 0xd4, 0x34, 0xb2, 0xff, 0x8f, 0x1a, 0x0f, 0x60, - 0xf7, 0x16, 0x5f, 0xe0, 0x9e, 0xb9, 0x34, 0x3a, 0xcb, 0xff, 0x81, 0xce, - 0xbc, 0xba, 0xf2, 0x82, 0x59, 0x5f, 0x1f, 0xb6, 0x8c, 0xee, 0xe9, 0xcc, - 0x9a, 0xbe, 0x87, 0x18, 0x5a, 0xdb, 0x3a, 0xf4, 0x2c, 0x6f, 0xbc, 0x6c, - 0x75, 0x96, 0x15, 0x65, 0xfd, 0xde, 0x47, 0xa0, 0x6b, 0x2b, 0x0d, 0xf9, - 0x89, 0x56, 0x1f, 0xff, 0x98, 0x2f, 0xfa, 0x3b, 0xe3, 0xd9, 0x90, 0x15, - 0x97, 0xff, 0xe7, 0x0e, 0xa3, 0xa5, 0x9e, 0xc9, 0xed, 0x34, 0xd2, 0x4a, - 0x92, 0x2c, 0xf8, 0x43, 0xe3, 0x9b, 0xf8, 0x21, 0x00, 0x4a, 0x16, 0x5f, - 0xfd, 0xf4, 0x8a, 0x25, 0xa8, 0xf3, 0xf9, 0x65, 0xff, 0x0c, 0x48, 0xfb, - 0x73, 0x35, 0x0b, 0x2e, 0x89, 0x2c, 0xac, 0x44, 0xbb, 0xa2, 0x11, 0xed, - 0xff, 0x9f, 0xd1, 0xae, 0x76, 0x0b, 0xcb, 0x2f, 0xd9, 0x23, 0x7d, 0xeb, - 0x28, 0x8f, 0x97, 0x87, 0xb5, 0x24, 0x59, 0x82, 0x12, 0x57, 0x98, 0xfd, - 0x59, 0x7f, 0xf8, 0xa2, 0x5a, 0xd0, 0x3e, 0x3d, 0x3f, 0x16, 0x5f, 0xff, - 0x73, 0x05, 0x2c, 0xf7, 0x32, 0x44, 0xed, 0x2c, 0xb1, 0xf5, 0x13, 0x3e, - 0x4a, 0xa3, 0x46, 0xee, 0xf8, 0x5a, 0xdf, 0x37, 0xc7, 0x78, 0xb2, 0xff, - 0x6d, 0xe2, 0x80, 0x7b, 0x8b, 0x2f, 0xf3, 0x3d, 0x93, 0x49, 0xc9, 0x65, - 0x61, 0xf3, 0x99, 0xa5, 0x42, 0x35, 0x70, 0xa7, 0x50, 0x8c, 0xbc, 0x4e, - 0xdb, 0x59, 0x7b, 0xff, 0xe1, 0x65, 0xf8, 0x81, 0xb7, 0xdb, 0xab, 0x2b, - 0x87, 0x97, 0xe1, 0xeb, 0xff, 0xd1, 0xb1, 0x66, 0x6d, 0xe1, 0x60, 0xa4, - 0xb2, 0xff, 0xce, 0x5b, 0x75, 0xd8, 0x7c, 0x35, 0x94, 0xe8, 0xa9, 0x22, - 0x26, 0x92, 0xaf, 0x34, 0xd3, 0x49, 0x2f, 0xb6, 0x61, 0xf1, 0x24, 0xf3, - 0x41, 0x74, 0x0d, 0x65, 0xb4, 0xe7, 0x96, 0x46, 0xb7, 0xe8, 0xc2, 0x76, - 0x2c, 0xbf, 0xf3, 0xcb, 0xa7, 0xf7, 0xfa, 0x71, 0xac, 0xb8, 0x6d, 0x2c, - 0xbf, 0xff, 0x66, 0xf8, 0x2f, 0x32, 0x30, 0x87, 0x9f, 0x79, 0x65, 0xe7, - 0x20, 0xec, 0x7d, 0xba, 0x18, 0xaf, 0xd3, 0x05, 0x22, 0x50, 0x42, 0xb6, - 0xff, 0x4a, 0x35, 0xb4, 0x6b, 0x65, 0x97, 0xf7, 0x38, 0x78, 0x5f, 0xac, - 0xbd, 0xac, 0xdd, 0x59, 0x7f, 0xcd, 0x09, 0xb7, 0x31, 0x91, 0xba, 0xb2, - 0xff, 0xf1, 0x87, 0x08, 0x7a, 0x70, 0xe7, 0xde, 0x59, 0x50, 0x88, 0x8e, - 0x1f, 0xd6, 0x91, 0xec, 0xc2, 0xdf, 0x42, 0x9e, 0xfe, 0xee, 0x7d, 0xee, - 0xc2, 0xca, 0x84, 0xe3, 0xb2, 0x32, 0xb7, 0x35, 0xbf, 0xfe, 0x39, 0x8a, - 0x3d, 0xcf, 0x7c, 0x13, 0x2d, 0x96, 0x5f, 0xff, 0xfe, 0x32, 0xfc, 0x42, - 0xcd, 0x6b, 0x1a, 0xcd, 0xdc, 0x28, 0xfd, 0x8f, 0x25, 0x97, 0xff, 0xf7, - 0xb8, 0x01, 0xf4, 0xf2, 0x67, 0x3d, 0xd3, 0xfa, 0x4b, 0x2f, 0xff, 0xe2, - 0xcf, 0xdc, 0xbf, 0xd6, 0xb1, 0xac, 0xfd, 0xfe, 0x59, 0x44, 0x8b, 0xcf, - 0x2f, 0xdf, 0x8f, 0xdb, 0x63, 0x4b, 0x2f, 0xfa, 0x03, 0xd2, 0x07, 0xa3, - 0x8b, 0x2f, 0xfe, 0x36, 0xf8, 0x0c, 0x33, 0x06, 0xec, 0x59, 0x7f, 0xfa, - 0x25, 0xcc, 0x81, 0x99, 0x3e, 0x85, 0x59, 0x7f, 0xfe, 0xf7, 0x72, 0x53, - 0x83, 0xd3, 0xf7, 0xc1, 0x3d, 0x2c, 0xa9, 0x2a, 0x9f, 0x38, 0xcd, 0xb4, - 0x44, 0xc2, 0x9e, 0x9c, 0x7e, 0x8a, 0x49, 0x17, 0xff, 0xbd, 0x0c, 0x0b, - 0x8f, 0x1a, 0x13, 0x52, 0x59, 0x7c, 0x5b, 0x6f, 0x1a, 0xcb, 0xff, 0xfd, - 0xd3, 0x21, 0xeb, 0x03, 0xd8, 0xee, 0x6b, 0x50, 0x2a, 0xcb, 0xff, 0x04, - 0x20, 0xdd, 0xe1, 0xb5, 0x9a, 0x59, 0x7f, 0xff, 0xde, 0x06, 0x9f, 0x81, - 0xe9, 0xcc, 0x4e, 0xd7, 0xb3, 0xac, 0x59, 0x7f, 0xfb, 0x99, 0xa9, 0xc1, - 0xe9, 0xef, 0x32, 0x1a, 0xca, 0x34, 0x5a, 0xf1, 0xa2, 0x8d, 0x31, 0xa7, - 0x87, 0xc5, 0xff, 0x32, 0x35, 0xbf, 0x35, 0x13, 0x2c, 0xbf, 0xf6, 0x82, - 0xc8, 0xfb, 0x99, 0xbf, 0x16, 0x5c, 0xfb, 0xab, 0x2c, 0x2a, 0xcb, 0xff, - 0xfa, 0x62, 0x81, 0xe7, 0xde, 0xc9, 0x41, 0x6c, 0xcc, 0x59, 0x7f, 0x7f, - 0xb9, 0x83, 0xc6, 0x2c, 0xad, 0x22, 0x7b, 0xa2, 0x44, 0xb7, 0x7f, 0x14, - 0xed, 0xcc, 0xd4, 0x2c, 0xa8, 0x4d, 0x63, 0x64, 0x1c, 0x85, 0xbb, 0x97, - 0xdf, 0xe7, 0xfe, 0x76, 0x0d, 0xe4, 0xb2, 0xc2, 0xac, 0xbf, 0xfb, 0x03, - 0xd8, 0xee, 0x6b, 0x50, 0x2a, 0xcb, 0xf6, 0x6b, 0x50, 0x2a, 0xcb, 0xe2, - 0x3f, 0xf9, 0x07, 0xfd, 0xa1, 0x2e, 0xa2, 0x5f, 0xf7, 0x5f, 0xf6, 0x3c, - 0x9f, 0x8b, 0x2f, 0xf3, 0xca, 0x51, 0x20, 0xf1, 0x65, 0x61, 0xf6, 0x00, - 0xe6, 0xb1, 0x38, 0x53, 0x85, 0x9f, 0x61, 0x63, 0x7f, 0xf9, 0xf6, 0xe9, - 0xc1, 0x64, 0xc7, 0xa3, 0x59, 0x43, 0x64, 0xa3, 0xe4, 0xaf, 0x0f, 0x9a, - 0xcd, 0x32, 0x62, 0x5e, 0xc6, 0xf5, 0xf9, 0x3f, 0x23, 0x93, 0xf4, 0x78, - 0xcd, 0x1c, 0xdf, 0x8b, 0x3a, 0xfe, 0x59, 0x7f, 0xe9, 0x41, 0x6c, 0x26, - 0x88, 0x12, 0x59, 0x7f, 0x13, 0x8f, 0xff, 0xbf, 0x59, 0x5b, 0xa8, 0x96, - 0x98, 0x9b, 0x88, 0x17, 0xde, 0xdb, 0x06, 0xb2, 0xff, 0x8c, 0x51, 0x35, - 0xfb, 0x0f, 0x8b, 0x2a, 0x63, 0xdf, 0xdc, 0x23, 0xbc, 0xd3, 0x4d, 0x2c, - 0xbf, 0xff, 0x63, 0x3c, 0x51, 0xfe, 0x0f, 0x98, 0xc8, 0x0a, 0x49, 0xe6, - 0x82, 0xfe, 0xd6, 0x37, 0xf5, 0xc6, 0xb2, 0xff, 0xd9, 0xf4, 0xe2, 0xcd, - 0xfa, 0x3e, 0x2c, 0xbf, 0x83, 0xd3, 0x82, 0x0a, 0xca, 0x83, 0xee, 0xc4, - 0x2b, 0xfd, 0xa8, 0xf1, 0x84, 0xc6, 0xb2, 0xfd, 0x29, 0xb3, 0x02, 0xb2, - 0xda, 0x59, 0x4d, 0xd1, 0xf5, 0xc1, 0x90, 0x85, 0x17, 0xe3, 0xff, 0x1f, - 0x75, 0x65, 0x62, 0xac, 0x63, 0x84, 0x9f, 0x51, 0x9d, 0x98, 0xa1, 0x3d, - 0xc8, 0x45, 0xf8, 0xd2, 0xf7, 0xcd, 0x37, 0x4b, 0x2f, 0x7a, 0x5d, 0x59, - 0x63, 0x59, 0x7f, 0xff, 0x9a, 0x82, 0x81, 0x4a, 0x05, 0x13, 0x72, 0x35, - 0x01, 0x85, 0x97, 0xf7, 0x62, 0x70, 0x4f, 0x65, 0x97, 0xff, 0xa6, 0xeb, - 0xb3, 0x34, 0x28, 0xa0, 0x2f, 0x2c, 0xbf, 0xf9, 0xf4, 0xf2, 0xce, 0x3f, - 0xb2, 0x65, 0x97, 0xf6, 0x9f, 0x45, 0x12, 0x59, 0x7f, 0xfc, 0xfe, 0xee, - 0x6f, 0xe9, 0xce, 0xe7, 0x0d, 0x8b, 0x2f, 0xfc, 0x72, 0x3d, 0x7d, 0x05, - 0x1c, 0x59, 0x4d, 0xa9, 0x3f, 0x08, 0x10, 0x1b, 0x26, 0x18, 0x05, 0x37, - 0x48, 0x64, 0x59, 0xe5, 0x3b, 0x4f, 0x6e, 0x5d, 0x38, 0xf3, 0x65, 0xae, - 0x21, 0xed, 0xb4, 0x3f, 0x25, 0x0b, 0xc1, 0xc7, 0x0b, 0x93, 0xb9, 0xc2, - 0xc2, 0xa4, 0x31, 0xc7, 0xfd, 0x1c, 0x91, 0x98, 0x4d, 0x1b, 0xbe, 0xa3, - 0xda, 0x61, 0x9f, 0x63, 0x13, 0x78, 0x4d, 0x7f, 0x19, 0x59, 0x47, 0x89, - 0xca, 0x4b, 0xdf, 0xa7, 0x01, 0x9a, 0x71, 0xdc, 0x24, 0x12, 0x50, 0x6d, - 0xfa, 0x5f, 0x41, 0x0d, 0x65, 0x49, 0x3e, 0x12, 0x8e, 0xe6, 0xff, 0xf6, - 0xb1, 0xa1, 0xf7, 0x26, 0x2c, 0xd4, 0x96, 0x5e, 0xd6, 0x6e, 0xac, 0xbf, - 0xf4, 0x34, 0x26, 0xdc, 0xc6, 0x46, 0xea, 0xca, 0xd2, 0x2b, 0x98, 0x97, - 0xe1, 0xfb, 0xff, 0xe7, 0x64, 0x68, 0x3a, 0x00, 0xba, 0x03, 0xf1, 0x65, - 0x62, 0x20, 0x40, 0x61, 0x7f, 0xb4, 0x10, 0x38, 0xd9, 0x0b, 0x2f, 0xfe, - 0x8d, 0x09, 0xe3, 0xf7, 0x70, 0x66, 0xb2, 0xff, 0x17, 0xdf, 0xe7, 0x1f, - 0x75, 0x65, 0xff, 0x14, 0x6c, 0x27, 0x7a, 0xfb, 0xab, 0x2f, 0xa3, 0x07, - 0xf2, 0xca, 0xc4, 0x4b, 0x74, 0xdf, 0x79, 0xed, 0xff, 0xff, 0x19, 0x1f, - 0xfc, 0xd6, 0x07, 0xb1, 0xdc, 0xd6, 0xa0, 0x55, 0x95, 0x09, 0xd2, 0x6c, - 0x67, 0x90, 0xda, 0xf1, 0x8d, 0xe6, 0xe2, 0xdd, 0x49, 0x65, 0xe7, 0xd6, - 0xcb, 0x2e, 0x69, 0xa5, 0x97, 0x9c, 0x33, 0xc2, 0x6d, 0x9a, 0x1d, 0xbf, - 0xa3, 0x4f, 0x23, 0xea, 0xcb, 0xf6, 0x33, 0xae, 0x35, 0x96, 0x9f, 0x0e, - 0xd4, 0x1e, 0x44, 0x23, 0x41, 0xc8, 0xfa, 0xc5, 0x2a, 0x0c, 0xe0, 0xec, - 0xc5, 0x7a, 0x85, 0x57, 0x48, 0x5e, 0xd4, 0x9b, 0x94, 0x6b, 0x1c, 0x8f, - 0x1b, 0xc8, 0x5b, 0xd7, 0x9a, 0x35, 0x6f, 0x2c, 0xa9, 0x3e, 0xa0, 0xc0, - 0xe9, 0x75, 0x7f, 0x47, 0x3d, 0xa2, 0xa6, 0x42, 0x3f, 0xb2, 0xa2, 0x3f, - 0x86, 0xe9, 0x46, 0x23, 0xc9, 0xe0, 0x1f, 0x4e, 0x24, 0x82, 0xdb, 0x20, - 0xdf, 0xb0, 0x7d, 0x86, 0x96, 0x5f, 0xdc, 0x89, 0xa4, 0x73, 0x2c, 0xbf, - 0xef, 0x41, 0x1f, 0xf9, 0xf7, 0x96, 0x5f, 0x6e, 0x39, 0x7e, 0xb2, 0xe8, - 0xdb, 0x0f, 0x78, 0x43, 0x9a, 0x24, 0x71, 0xf0, 0xa0, 0x48, 0x46, 0xdf, - 0xe7, 0xd0, 0x67, 0xcb, 0x3e, 0x59, 0x7f, 0xfa, 0x4f, 0xc9, 0xe5, 0x19, - 0xe8, 0xfa, 0x4b, 0x2e, 0x8f, 0xd6, 0x5f, 0x7b, 0xd0, 0xc5, 0x97, 0xe3, - 0x09, 0x8e, 0x7f, 0x4d, 0xc8, 0x82, 0xf5, 0x3d, 0x32, 0xfd, 0x8d, 0x4c, - 0xdb, 0xd0, 0x84, 0xbf, 0xf3, 0x86, 0x78, 0x3f, 0x39, 0x64, 0x96, 0x5f, - 0xb4, 0x17, 0x70, 0xaa, 0x23, 0x55, 0xe1, 0x7e, 0xe2, 0xcb, 0x4f, 0xd9, - 0x12, 0x98, 0x83, 0xe3, 0x4b, 0xff, 0xfd, 0xbe, 0x0b, 0xd3, 0xdf, 0x7b, - 0x8f, 0x06, 0xec, 0x71, 0xac, 0xbf, 0x68, 0x2e, 0xe1, 0x54, 0x54, 0xab, - 0x05, 0x51, 0x0d, 0x29, 0x65, 0x39, 0xa9, 0xfc, 0x7a, 0xd3, 0xf0, 0xff, - 0x9d, 0x76, 0xfd, 0xa0, 0xbb, 0x85, 0x51, 0x1f, 0x2f, 0xfe, 0x06, 0xbf, - 0x0f, 0x4e, 0x62, 0x8f, 0xd6, 0x5f, 0xff, 0x13, 0xfa, 0x50, 0x2c, 0xe8, - 0xf7, 0x23, 0xf5, 0x97, 0x9e, 0x53, 0xf1, 0x19, 0xbc, 0x34, 0x11, 0x1e, - 0xfe, 0x9f, 0xc7, 0x8f, 0xa4, 0xb2, 0xff, 0xcf, 0xb4, 0x74, 0xf4, 0x70, - 0xc5, 0x97, 0xfa, 0x35, 0x85, 0xec, 0xea, 0xcb, 0xb2, 0x7e, 0xe1, 0xf7, - 0x08, 0x7b, 0x42, 0xa3, 0x45, 0x90, 0x9e, 0xa9, 0xe9, 0x9e, 0xc4, 0x62, - 0x97, 0xff, 0xfd, 0x20, 0x68, 0x57, 0xe6, 0x0e, 0x3e, 0xe0, 0x9e, 0x14, - 0xc5, 0x59, 0x79, 0xa1, 0x42, 0xb2, 0xfd, 0xf7, 0xd2, 0xcf, 0x2c, 0xae, - 0x1e, 0x48, 0x07, 0xef, 0xff, 0x36, 0x82, 0xb5, 0xbb, 0xb0, 0xdb, 0x33, - 0xa7, 0x77, 0x71, 0x65, 0xf0, 0x5d, 0xc2, 0xa8, 0xb1, 0xd7, 0xe8, 0xe9, - 0x38, 0x8b, 0x2b, 0x47, 0xaa, 0xc2, 0xeb, 0xfd, 0x86, 0x5b, 0x7b, 0x3a, - 0xb2, 0xe7, 0xe2, 0xcb, 0xfb, 0x61, 0x35, 0xac, 0xd2, 0xca, 0x91, 0xe3, - 0x38, 0xb5, 0xff, 0x13, 0x8b, 0xd3, 0x82, 0xd9, 0x65, 0xfc, 0x5e, 0xd0, - 0x21, 0x8b, 0x2f, 0xff, 0xc4, 0xe2, 0xce, 0xf0, 0xb0, 0x52, 0xce, 0x9b, - 0x16, 0x53, 0xa2, 0x10, 0x05, 0xb7, 0xf7, 0xef, 0xee, 0x40, 0xab, 0x2f, - 0xff, 0xa5, 0xb3, 0x69, 0x0d, 0xce, 0xc1, 0xd4, 0xe9, 0xdd, 0xdc, 0x59, - 0x7f, 0xd9, 0xbe, 0x25, 0xf4, 0xb3, 0xcb, 0x2b, 0x11, 0x9f, 0xf9, 0x79, - 0x32, 0xdc, 0x72, 0x59, 0x7f, 0xbc, 0x59, 0xbf, 0xaf, 0x25, 0x94, 0x33, - 0xca, 0xc1, 0x6b, 0xf1, 0xfb, 0xc7, 0xe5, 0x97, 0xff, 0xe0, 0x13, 0x8b, - 0xe1, 0x60, 0xa5, 0x9d, 0x36, 0x2c, 0xbe, 0xd6, 0xb3, 0x71, 0x65, 0x62, - 0x28, 0x58, 0x4e, 0xea, 0xb7, 0xec, 0xd6, 0x64, 0xcb, 0x2d, 0x3e, 0x17, - 0x61, 0xf6, 0x85, 0xac, 0x88, 0xb2, 0x17, 0x02, 0x91, 0x1b, 0xc4, 0xc4, - 0x2c, 0x85, 0xe7, 0x61, 0xe2, 0x4f, 0x3c, 0x86, 0x10, 0x85, 0xd7, 0xc2, - 0x9e, 0xa6, 0x59, 0x79, 0xb4, 0x60, 0xab, 0x2f, 0xc5, 0x9d, 0x7f, 0x2c, - 0xbc, 0xdc, 0x1b, 0xaf, 0xd6, 0x53, 0x60, 0xf3, 0xdb, 0x42, 0x6b, 0xfe, - 0x89, 0x8f, 0xdc, 0x32, 0x99, 0x65, 0xfe, 0x7f, 0xf8, 0xfe, 0xf3, 0xac, - 0xb9, 0x81, 0x59, 0x7f, 0xce, 0x33, 0xfa, 0x5e, 0x3d, 0x2c, 0xad, 0x22, - 0xf0, 0x8e, 0x7c, 0x67, 0xbc, 0x5e, 0xff, 0xd8, 0xd6, 0xb0, 0x9f, 0xe9, - 0x71, 0x65, 0xfb, 0xae, 0xc8, 0x25, 0x97, 0xdc, 0xe9, 0xb4, 0xb2, 0xfd, - 0x0d, 0x7b, 0x3a, 0xb2, 0xf4, 0x09, 0x8b, 0x2a, 0x72, 0x23, 0x70, 0x98, - 0x88, 0xf8, 0x51, 0x7e, 0xd7, 0x3f, 0x6e, 0xfa, 0xb2, 0xff, 0xf6, 0x37, - 0xe0, 0x7d, 0xf4, 0xb0, 0xbf, 0x75, 0x97, 0xff, 0xff, 0x19, 0x6f, 0xc1, - 0x93, 0xbe, 0xfc, 0xdd, 0xf6, 0xe9, 0xf8, 0xa3, 0xf5, 0x97, 0x8c, 0x1f, - 0xac, 0xb7, 0xdb, 0xa8, 0x95, 0x99, 0xe2, 0xf3, 0x0f, 0x4b, 0x2b, 0x0f, - 0x2b, 0xf2, 0xeb, 0xd8, 0xe4, 0xb2, 0xf7, 0x62, 0x65, 0x97, 0x1f, 0x8c, - 0xdb, 0xb8, 0xd5, 0xff, 0xff, 0x46, 0x8b, 0x07, 0x9d, 0xe9, 0x87, 0xa7, - 0xee, 0x3f, 0xcb, 0x2f, 0xff, 0xd9, 0x36, 0x37, 0x96, 0x6f, 0x2c, 0xfd, - 0x91, 0x25, 0x97, 0xfc, 0xff, 0x16, 0x7b, 0x98, 0xd2, 0xca, 0xc5, 0x5a, - 0xa1, 0x2f, 0x38, 0xcb, 0x37, 0x56, 0x7a, 0x54, 0x4c, 0xa0, 0x59, 0xbf, - 0x74, 0xf4, 0x09, 0x2c, 0xbf, 0xed, 0x8f, 0xb3, 0x3c, 0x8f, 0xab, 0x2f, - 0xe8, 0xd7, 0xfb, 0x80, 0xf2, 0xcb, 0xfc, 0x5e, 0x6c, 0xbf, 0x81, 0x0b, - 0x2f, 0xe9, 0x16, 0x7d, 0xe7, 0x59, 0x50, 0x7c, 0x6e, 0x6d, 0x7f, 0xf7, - 0x61, 0x81, 0xe9, 0xfb, 0x31, 0x8b, 0x2f, 0xf3, 0x8b, 0x9a, 0xda, 0x05, - 0x59, 0x50, 0x7f, 0x04, 0x87, 0x7d, 0xff, 0xe6, 0x22, 0xcb, 0xfe, 0x7d, - 0x6d, 0xd3, 0xcd, 0x4c, 0xb2, 0xff, 0xe7, 0x72, 0xff, 0x99, 0xbb, 0x33, - 0xba, 0xca, 0x0a, 0x20, 0x26, 0x3a, 0xbf, 0x4b, 0x9b, 0x63, 0x4b, 0x2f, - 0xbb, 0x9a, 0xd9, 0x65, 0xe7, 0x70, 0xaa, 0x2d, 0x05, 0xff, 0x9d, 0xa6, - 0xf0, 0xbe, 0xb6, 0xc6, 0x96, 0x5f, 0xdf, 0xc1, 0x47, 0xb8, 0xb2, 0xa1, - 0x1c, 0xc3, 0x2a, 0x09, 0x1e, 0x8a, 0x3f, 0x44, 0xbc, 0x00, 0x69, 0x65, - 0xe2, 0x8d, 0x2c, 0xbb, 0x53, 0x4c, 0x6e, 0x38, 0x3b, 0x7f, 0xff, 0xfb, - 0x5d, 0x72, 0x38, 0xf1, 0xf6, 0x39, 0xdc, 0xe6, 0xb0, 0x39, 0xe5, 0x95, - 0x88, 0xa3, 0x32, 0xfb, 0xf0, 0xf3, 0xf7, 0x85, 0x97, 0xff, 0xfe, 0x7d, - 0x4b, 0x86, 0x3c, 0xd6, 0xc7, 0xce, 0xbf, 0xfc, 0xc2, 0x59, 0x60, 0x62, - 0x24, 0xf8, 0x4f, 0x7e, 0xd9, 0x8e, 0xe4, 0xb2, 0xff, 0x9f, 0xfc, 0x3e, - 0x72, 0x3f, 0x59, 0x50, 0x7c, 0x1c, 0x27, 0xbf, 0xff, 0x77, 0x1a, 0xf3, - 0x23, 0x3d, 0xdc, 0xc2, 0x0a, 0xcb, 0xff, 0xf1, 0xfa, 0x59, 0xad, 0x3c, - 0x84, 0x27, 0xf7, 0x16, 0x5f, 0xe9, 0xbb, 0x1e, 0xec, 0x4c, 0xb2, 0xa1, - 0x7a, 0xfb, 0x62, 0x89, 0x1d, 0x0e, 0x12, 0xa1, 0x84, 0xc1, 0x90, 0x6e, - 0xc2, 0x97, 0x51, 0x85, 0x76, 0x32, 0x52, 0x85, 0xa7, 0x21, 0x11, 0xe2, - 0x1d, 0xea, 0x82, 0x2a, 0xdf, 0xf0, 0x3d, 0xc2, 0xcf, 0xbc, 0xeb, 0x2d, - 0x8b, 0x2f, 0xff, 0x0f, 0xb1, 0x07, 0xee, 0x19, 0x7d, 0x25, 0x96, 0x00, - 0xcf, 0x64, 0x84, 0x2e, 0xc6, 0x2c, 0xbf, 0xf9, 0xfe, 0xdf, 0xdd, 0xd3, - 0xf1, 0x43, 0x16, 0x50, 0xa9, 0x8c, 0x1c, 0x24, 0xb4, 0x4e, 0xe2, 0xd7, - 0xf4, 0x17, 0xa7, 0x33, 0x65, 0x97, 0xfd, 0x31, 0x43, 0x3b, 0x1b, 0xd8, - 0xb2, 0xff, 0xe7, 0xfb, 0x9c, 0xce, 0x9f, 0x01, 0xb2, 0xca, 0xc4, 0x40, - 0xf0, 0xee, 0xc6, 0x34, 0x69, 0xfa, 0x16, 0x37, 0xf6, 0xb6, 0x10, 0x6f, - 0xb2, 0xcb, 0xff, 0xe0, 0x6d, 0xa3, 0xf6, 0xc0, 0xd4, 0xb9, 0xba, 0x6b, - 0x2b, 0xa8, 0xb4, 0x72, 0xd2, 0x31, 0xbf, 0xe0, 0x3f, 0x9e, 0x4f, 0xf4, - 0x96, 0x5f, 0x9c, 0x4c, 0xfb, 0xcb, 0x28, 0x27, 0xc5, 0xc3, 0x9b, 0xfc, - 0x63, 0xc6, 0x4e, 0xc1, 0xac, 0xb9, 0xf8, 0xb2, 0xff, 0xf8, 0x1a, 0xd4, - 0x16, 0x0a, 0x7d, 0xee, 0x08, 0xb2, 0xcd, 0xb5, 0x95, 0xa3, 0xe5, 0x02, - 0x85, 0xf4, 0x6a, 0x26, 0x59, 0x7f, 0x98, 0x02, 0xf7, 0x01, 0xa5, 0x95, - 0x24, 0xc9, 0xc6, 0x69, 0xa7, 0xb6, 0x11, 0x6e, 0x11, 0x5e, 0x82, 0x15, - 0x65, 0xfc, 0x5f, 0x4b, 0xc0, 0x1a, 0xcb, 0xf6, 0xee, 0x13, 0x0d, 0x65, - 0x41, 0xec, 0x39, 0x7d, 0xe2, 0xcf, 0xd6, 0x5f, 0xec, 0xef, 0x26, 0xcc, - 0xd9, 0x65, 0x9a, 0xd1, 0xe8, 0x78, 0x72, 0xfe, 0x6b, 0xc5, 0x0c, 0xe2, - 0xca, 0x73, 0xd7, 0x01, 0x4d, 0xfa, 0x6e, 0xe7, 0xee, 0xb2, 0xa4, 0x9c, - 0x2f, 0x5d, 0x0a, 0x18, 0xfb, 0xc8, 0x6f, 0xff, 0xfe, 0x81, 0xf7, 0x3d, - 0xe7, 0xdb, 0x3c, 0xc3, 0x01, 0x4c, 0x58, 0xd2, 0xcb, 0xff, 0xf7, 0xb9, - 0x13, 0x76, 0x37, 0x96, 0x0f, 0xb1, 0xc5, 0x97, 0xff, 0x98, 0x7f, 0x4b, - 0x85, 0x81, 0xf0, 0x09, 0x65, 0xfe, 0xe6, 0x6e, 0xfe, 0xef, 0x32, 0xca, - 0xc4, 0x6c, 0x31, 0x5f, 0xa9, 0x55, 0x09, 0xbc, 0xe4, 0x69, 0x57, 0xe2, - 0x0b, 0xf0, 0xd6, 0x5f, 0xff, 0xda, 0x28, 0x8f, 0xa7, 0x73, 0xc5, 0x03, - 0xec, 0x79, 0x65, 0xc7, 0xd5, 0x97, 0xd2, 0x27, 0x11, 0x65, 0xfe, 0x1b, - 0xff, 0xad, 0x3f, 0xeb, 0x2f, 0xb4, 0x1d, 0xd6, 0x96, 0x5f, 0x0a, 0xd8, - 0x76, 0x96, 0x56, 0x1e, 0x7b, 0x93, 0xd1, 0xa2, 0x90, 0xa1, 0x09, 0x50, - 0x9c, 0x26, 0x13, 0x6e, 0xae, 0x38, 0xb0, 0x21, 0x8d, 0x7f, 0xf6, 0x8b, - 0x37, 0xeb, 0x0f, 0xb0, 0x35, 0x97, 0x9f, 0x74, 0xd6, 0x5f, 0xf8, 0x4f, - 0x0a, 0x62, 0xc6, 0x14, 0x2c, 0xb7, 0xcb, 0x2f, 0xff, 0x1b, 0xbc, 0xde, - 0xee, 0x4b, 0xa7, 0xbd, 0x65, 0x41, 0xee, 0xee, 0x89, 0x5f, 0x84, 0xf1, - 0x47, 0xeb, 0x2a, 0x13, 0x4b, 0xf9, 0x13, 0x43, 0xcc, 0x84, 0xe6, 0xf2, - 0x4b, 0xf4, 0x7b, 0x3b, 0x0b, 0x2f, 0xdf, 0xc7, 0xb1, 0x8b, 0x2f, 0xff, - 0xff, 0xf3, 0x37, 0x4f, 0xbf, 0xe3, 0x90, 0x73, 0xe9, 0x70, 0xfd, 0xc3, - 0xfa, 0x45, 0x1d, 0x85, 0x97, 0xfe, 0xcf, 0xa5, 0xc3, 0xf3, 0x96, 0x2c, - 0xbf, 0xd8, 0xce, 0xe4, 0xcf, 0x32, 0xcb, 0xfe, 0x31, 0xe1, 0xed, 0xd8, - 0x89, 0xc7, 0xe3, 0xe3, 0xda, 0xc4, 0xd4, 0xbb, 0x18, 0x15, 0xff, 0xff, - 0xd0, 0x65, 0x9e, 0x86, 0x34, 0x07, 0xda, 0x76, 0x74, 0xf5, 0xd7, 0x59, - 0x7f, 0xec, 0xfa, 0x5c, 0x9b, 0x4f, 0xee, 0x2c, 0xbf, 0x14, 0x06, 0x4c, - 0x59, 0x7f, 0xfb, 0x37, 0x7a, 0x09, 0xbb, 0x93, 0x4a, 0x3e, 0x59, 0x7f, - 0xf7, 0x32, 0x6e, 0xc6, 0xfc, 0xef, 0x61, 0x65, 0x0d, 0x17, 0xba, 0x27, - 0xf2, 0x85, 0xfe, 0x7f, 0xf8, 0xc7, 0xfb, 0xcb, 0x2b, 0x0f, 0x95, 0xcc, - 0x2f, 0xfe, 0x2c, 0xdb, 0x51, 0x1e, 0x3e, 0xc2, 0xcb, 0xfd, 0x11, 0x36, - 0x6f, 0x3d, 0x2c, 0xbe, 0x3d, 0x61, 0x2c, 0xa2, 0x3d, 0x4e, 0x1a, 0x5f, - 0xff, 0x8c, 0x1f, 0x77, 0x1a, 0x06, 0x1f, 0x79, 0x1b, 0x2c, 0xad, 0x97, - 0x33, 0x30, 0x98, 0x31, 0xbd, 0x68, 0xa7, 0xf7, 0x22, 0x8d, 0x8f, 0x84, - 0x1e, 0x84, 0xb3, 0x79, 0x0d, 0xf4, 0xd2, 0x39, 0x96, 0x5c, 0x5b, 0x2c, - 0xa9, 0xc6, 0xed, 0xb9, 0x24, 0xb3, 0x7a, 0xcb, 0xba, 0xde, 0xb2, 0xff, - 0xf6, 0x6f, 0xeb, 0xcb, 0xf7, 0xfb, 0xf3, 0xf9, 0x65, 0xbd, 0x07, 0xd3, - 0xd1, 0xaa, 0x92, 0x29, 0x0d, 0xf6, 0xa1, 0x7b, 0x73, 0x27, 0x47, 0x8e, - 0x1a, 0x0f, 0x0c, 0xcb, 0xff, 0xba, 0x73, 0xb0, 0xb0, 0xf4, 0xfb, 0xd6, - 0x5f, 0xfc, 0x64, 0xe3, 0x2c, 0x1f, 0x63, 0x8b, 0x2f, 0x09, 0x1a, 0x59, - 0x7f, 0xdb, 0x32, 0x35, 0xe2, 0x8d, 0x96, 0x5f, 0x6f, 0x82, 0x0a, 0xcb, - 0xff, 0xfa, 0x0b, 0x3f, 0xe6, 0x0f, 0xb1, 0xb3, 0x00, 0x43, 0x59, 0x46, - 0x7f, 0xdd, 0x23, 0xbf, 0x1f, 0xbd, 0x12, 0x59, 0x42, 0xa7, 0x46, 0x14, - 0x5d, 0x20, 0xb8, 0xef, 0xa1, 0x71, 0xbc, 0x86, 0xfe, 0x2f, 0x47, 0x3c, - 0x6b, 0x2f, 0xff, 0xe8, 0x9b, 0x07, 0xd8, 0xdf, 0xdc, 0xf1, 0x44, 0x31, - 0x65, 0xfd, 0xf7, 0x04, 0xd8, 0x04, 0xb2, 0xff, 0xa0, 0x3d, 0x39, 0x9d, - 0xf6, 0x59, 0x50, 0x8f, 0x16, 0x16, 0x3a, 0xdf, 0xe6, 0x37, 0xfa, 0x51, - 0xad, 0xa3, 0x5b, 0x2c, 0xbf, 0xf1, 0xef, 0x72, 0xff, 0xb9, 0xfb, 0xac, - 0xbe, 0x7e, 0x99, 0x2c, 0xbe, 0xcf, 0xe0, 0x96, 0x58, 0xb6, 0x3c, 0x1e, - 0x90, 0x5f, 0xf1, 0x80, 0xa5, 0xa8, 0xc1, 0xac, 0xbf, 0xff, 0xee, 0xe4, - 0x83, 0xd3, 0xec, 0x66, 0xa5, 0xe2, 0x86, 0x71, 0x65, 0xff, 0x03, 0xdb, - 0xbc, 0xc3, 0x21, 0xac, 0xbe, 0x04, 0x7c, 0x35, 0x94, 0x34, 0xe8, 0xde, - 0x10, 0x3c, 0x28, 0xf1, 0xbe, 0xf6, 0x56, 0x8e, 0xef, 0x9b, 0xe3, 0x5b, - 0x2c, 0xa8, 0x54, 0xbb, 0x91, 0xec, 0x3a, 0xfd, 0xfe, 0xd0, 0x66, 0xc3, - 0xe8, 0x16, 0x5f, 0xff, 0xfb, 0xae, 0x2f, 0x06, 0x79, 0xf0, 0x4c, 0x9f, - 0xe6, 0x44, 0x71, 0x65, 0xff, 0x8f, 0x79, 0x67, 0x3c, 0x29, 0x85, 0x65, - 0xfe, 0xf7, 0x77, 0x4f, 0xaf, 0x32, 0xcb, 0xfa, 0x02, 0x4f, 0xf7, 0x96, - 0x54, 0x91, 0x49, 0xba, 0x80, 0xc3, 0x7b, 0xf4, 0x7b, 0x6c, 0x69, 0x65, - 0xff, 0xbe, 0x09, 0x3e, 0xcf, 0x23, 0xea, 0xca, 0xd1, 0xf4, 0x00, 0xa6, - 0xfc, 0x30, 0x83, 0x37, 0x56, 0x5f, 0xf8, 0xa3, 0xee, 0xc1, 0x93, 0x8d, - 0x65, 0xa2, 0x63, 0xe7, 0x61, 0x5d, 0xfa, 0x3d, 0xd8, 0xf2, 0xcb, 0x8b, - 0xf5, 0x95, 0xa3, 0x7c, 0xe4, 0xf7, 0xff, 0xff, 0x81, 0xae, 0xe4, 0xd3, - 0x3e, 0xa6, 0xf7, 0x41, 0xff, 0x30, 0xf7, 0x8e, 0x16, 0x5f, 0xf1, 0xf7, - 0x9a, 0x32, 0x86, 0x2c, 0xbf, 0xa3, 0x9b, 0xa7, 0xf7, 0x96, 0x51, 0xa3, - 0x9b, 0x75, 0xfb, 0x46, 0xf7, 0xef, 0x75, 0xc8, 0x55, 0x97, 0xf9, 0xbc, - 0x80, 0x00, 0x98, 0xab, 0x2f, 0xf0, 0x36, 0x1f, 0x70, 0xa1, 0x65, 0x41, - 0xf5, 0x11, 0xbd, 0xff, 0xd8, 0x3e, 0xc3, 0x5f, 0x4b, 0xc0, 0x1a, 0xcb, - 0xb3, 0x8b, 0x2e, 0x7f, 0x2c, 0xbd, 0xc0, 0x4b, 0x46, 0xb3, 0xa2, 0xd6, - 0xc1, 0xa7, 0x15, 0x86, 0x41, 0x84, 0x91, 0x10, 0x79, 0xce, 0xff, 0xf6, - 0x41, 0x60, 0x4b, 0x3c, 0x07, 0x69, 0x65, 0xff, 0xc7, 0xee, 0xe1, 0xcb, - 0x99, 0xf7, 0x96, 0x50, 0xd1, 0x17, 0xc4, 0x7b, 0xff, 0xbf, 0x0f, 0xe5, - 0x9e, 0xe3, 0xb9, 0x2c, 0xbc, 0xc7, 0xf9, 0x65, 0x68, 0xf8, 0x7f, 0x44, - 0xa8, 0x5e, 0xe3, 0x19, 0xa6, 0x46, 0x20, 0x70, 0x9b, 0xec, 0x22, 0x5d, - 0x98, 0xa5, 0x48, 0x7a, 0x1b, 0xc0, 0x84, 0x25, 0xfe, 0xce, 0xcc, 0x7d, - 0x36, 0x2c, 0xbf, 0xd2, 0xcd, 0x70, 0xa3, 0x65, 0x97, 0xc2, 0xea, 0x18, - 0xb2, 0xec, 0xd9, 0x65, 0x41, 0xba, 0xdc, 0x23, 0xbf, 0xc6, 0x5e, 0x96, - 0x6b, 0x16, 0x5f, 0xd0, 0x1d, 0x1c, 0x31, 0x65, 0x48, 0xf7, 0x48, 0xc6, - 0xff, 0xf3, 0x3f, 0x7d, 0x66, 0xfc, 0x31, 0xf4, 0xd6, 0x54, 0x1f, 0x66, - 0x10, 0xde, 0xce, 0xba, 0xcb, 0xc0, 0x01, 0x2c, 0xbf, 0x1f, 0x7b, 0x83, - 0x59, 0x69, 0x96, 0x0c, 0xf0, 0xf8, 0x39, 0x43, 0x44, 0x73, 0xaf, 0x5f, - 0xdb, 0x16, 0x7e, 0x0e, 0x2c, 0xbd, 0xba, 0x6c, 0x59, 0x7f, 0xfc, 0xff, - 0xf2, 0x3f, 0xf6, 0x18, 0xf0, 0xa6, 0x59, 0xd2, 0xfe, 0xa1, 0x15, 0xae, - 0x9d, 0x7f, 0x35, 0x81, 0x0e, 0x34, 0xb2, 0xf4, 0x07, 0x7a, 0xca, 0xc3, - 0xcd, 0xf1, 0x7d, 0xff, 0xec, 0x6f, 0xfd, 0x91, 0x37, 0x8c, 0x1a, 0xe2, - 0xcb, 0xfc, 0xcc, 0xc2, 0xf6, 0xe6, 0x2c, 0xbf, 0xfb, 0x9e, 0x88, 0xd7, - 0xf3, 0x16, 0x34, 0xb2, 0xbe, 0x3f, 0xa7, 0x34, 0xbc, 0x2c, 0x80, 0xb2, - 0xfd, 0xd8, 0xd6, 0xcc, 0x59, 0x7f, 0x80, 0xe5, 0xdc, 0x79, 0x96, 0x5b, - 0xe9, 0x8f, 0x6d, 0xa2, 0x9a, 0x34, 0x52, 0x3b, 0xcd, 0x62, 0x7a, 0x26, - 0x42, 0xf0, 0xc9, 0x28, 0x63, 0x56, 0x2e, 0xc6, 0x7c, 0x66, 0x6d, 0xbd, - 0x87, 0x63, 0xc2, 0xb8, 0xa1, 0x9f, 0xc9, 0x47, 0xf7, 0x9b, 0x60, 0x25, - 0x97, 0x8b, 0x3f, 0x59, 0x68, 0x59, 0x5f, 0x9a, 0xcf, 0x0e, 0x5c, 0xfe, - 0x59, 0x5a, 0x37, 0x1d, 0x22, 0xbe, 0x64, 0x6b, 0x8b, 0x2f, 0xf4, 0x30, - 0xb3, 0xf0, 0x71, 0x65, 0xff, 0x6b, 0x3b, 0x9b, 0x4e, 0x3e, 0x2c, 0xac, - 0x45, 0x89, 0x90, 0x91, 0x10, 0x0c, 0xef, 0xf4, 0x8f, 0x9c, 0x8d, 0x49, - 0x65, 0xf3, 0xb2, 0x0d, 0x65, 0x0c, 0xf4, 0xe6, 0x33, 0xbf, 0x8c, 0x81, - 0x2c, 0xe2, 0xcb, 0xff, 0xf4, 0x8f, 0xdc, 0x0f, 0x4f, 0xdf, 0x48, 0xfd, - 0xc5, 0x97, 0xfe, 0xcf, 0x47, 0xdf, 0xbf, 0x7a, 0x6b, 0x2c, 0xc5, 0x97, - 0xf1, 0x90, 0x25, 0x9c, 0x9c, 0x7a, 0x1b, 0xcf, 0xea, 0x13, 0x3d, 0x14, - 0x8e, 0x62, 0xcf, 0x42, 0x9e, 0xff, 0xed, 0x03, 0xe9, 0x73, 0xb9, 0xb0, - 0x09, 0x65, 0xa7, 0xb7, 0x4e, 0xdc, 0xe9, 0xb9, 0x24, 0x6c, 0xb9, 0x44, - 0x39, 0xf6, 0x3e, 0x94, 0x33, 0x07, 0x2c, 0x4b, 0x27, 0xca, 0x85, 0x94, - 0x06, 0x18, 0xf2, 0x7e, 0x84, 0x81, 0xc6, 0x93, 0x34, 0x7a, 0x7a, 0x8e, - 0xf5, 0x91, 0xd6, 0x76, 0x90, 0xee, 0xf1, 0xf8, 0xff, 0x1a, 0x81, 0x4a, - 0x99, 0xe4, 0xf8, 0xc7, 0xa7, 0x8a, 0x40, 0xf5, 0xb9, 0x19, 0xa8, 0x91, - 0xe5, 0x37, 0xa2, 0x5f, 0xda, 0x9e, 0x3d, 0xe7, 0x0b, 0x2f, 0xe6, 0xf3, - 0x19, 0x44, 0xcb, 0x2f, 0x43, 0x92, 0xcb, 0xec, 0xeb, 0xf9, 0x65, 0x9b, - 0x18, 0x7d, 0x7d, 0x30, 0x21, 0xab, 0xf8, 0x9f, 0xdc, 0x8d, 0xd5, 0x97, - 0xff, 0xff, 0x39, 0x7b, 0x90, 0x72, 0xc6, 0xf2, 0xf4, 0x76, 0x05, 0x04, - 0x37, 0xac, 0xa3, 0x45, 0x27, 0x4b, 0xef, 0xb3, 0x9f, 0x9a, 0xcb, 0xa5, - 0xf2, 0xcb, 0xe0, 0xbb, 0x85, 0x51, 0x6b, 0x28, 0xcf, 0x1b, 0x43, 0x17, - 0xf9, 0x86, 0xc7, 0x9b, 0x3a, 0xb2, 0xff, 0x00, 0xb1, 0xbc, 0xda, 0x35, - 0x97, 0xdc, 0x72, 0x0a, 0xcb, 0x67, 0x4f, 0x59, 0xbc, 0xd6, 0xf6, 0xa1, - 0x8b, 0x2f, 0xee, 0xe7, 0x23, 0x66, 0xf5, 0x97, 0xfd, 0x29, 0xf9, 0xa0, - 0xbb, 0x85, 0x51, 0x41, 0xab, 0x0f, 0xe1, 0xcc, 0x6f, 0xb2, 0x68, 0xf2, - 0xcb, 0xfd, 0xcc, 0x20, 0xb9, 0x7e, 0xb2, 0xff, 0xa2, 0x51, 0xad, 0xa3, - 0x5b, 0x2c, 0xbe, 0xd1, 0x8a, 0xc5, 0x97, 0xbd, 0x9d, 0x59, 0x58, 0x6f, - 0xc5, 0x23, 0xbf, 0xdd, 0x9f, 0x1f, 0x80, 0xa6, 0x59, 0x7e, 0x7e, 0x32, - 0x3f, 0x59, 0x7f, 0x44, 0xdf, 0xb9, 0x4c, 0xb2, 0xf9, 0xff, 0xcd, 0x2c, - 0xac, 0x45, 0x80, 0xa6, 0xe6, 0x51, 0xd2, 0xfb, 0xfd, 0x31, 0xf8, 0x13, - 0x1f, 0x96, 0x5f, 0xff, 0x70, 0xf6, 0x7e, 0x39, 0x3f, 0xbb, 0x13, 0x2c, - 0xbf, 0xf3, 0x97, 0xf9, 0xe8, 0x23, 0xfd, 0x65, 0x79, 0x11, 0x9b, 0x89, - 0xf6, 0x9e, 0xd9, 0x5d, 0xae, 0x88, 0x6d, 0xc8, 0x8b, 0x1a, 0x0c, 0x86, - 0x68, 0x44, 0xe8, 0xa9, 0x90, 0x94, 0xe9, 0x03, 0x91, 0x11, 0x97, 0x1e, - 0x7d, 0x0d, 0x10, 0x1e, 0x09, 0x0c, 0x1b, 0xfc, 0x2c, 0xf7, 0xef, 0x73, - 0x65, 0x97, 0xff, 0xa7, 0xb1, 0xe5, 0x3f, 0x34, 0x17, 0x70, 0xaa, 0x28, - 0xb5, 0xfe, 0x9f, 0x9a, 0x0b, 0xb8, 0x55, 0x17, 0x52, 0xa1, 0xf2, 0xf4, - 0xe5, 0x0d, 0x9c, 0x38, 0x0c, 0x38, 0x8e, 0x51, 0x93, 0x27, 0x6c, 0xbb, - 0x6e, 0x00, 0xde, 0x3e, 0xcf, 0xe7, 0x92, 0x8a, 0x1e, 0x3c, 0x37, 0xf2, - 0xd5, 0xfb, 0x41, 0x77, 0x0a, 0xa2, 0x21, 0x5e, 0xe9, 0x92, 0xcb, 0xb0, - 0x6b, 0x2c, 0x15, 0x94, 0x13, 0xc2, 0xe8, 0xd9, 0x0b, 0x5f, 0x66, 0xf3, - 0xd2, 0xcb, 0xe3, 0xd6, 0x7c, 0xb2, 0xb1, 0x1d, 0x3f, 0x3b, 0x6e, 0x97, - 0x6e, 0x11, 0xdf, 0xef, 0x4f, 0x98, 0xa3, 0xfe, 0x2c, 0xa9, 0xe7, 0xf5, - 0x88, 0x76, 0xdc, 0x59, 0x7d, 0x1d, 0x86, 0x2c, 0xbe, 0x0b, 0xb8, 0x55, - 0x11, 0xb2, 0x82, 0x79, 0xfa, 0x21, 0xb4, 0xf1, 0xa2, 0x17, 0x18, 0xef, - 0xf4, 0xfc, 0xd0, 0x5d, 0xc2, 0xa8, 0xa6, 0xd7, 0xed, 0x05, 0xdc, 0x2a, - 0x8a, 0x81, 0x7b, 0x3e, 0x69, 0x65, 0xa7, 0xe1, 0xe9, 0x74, 0xd2, 0xff, - 0x4f, 0xcd, 0x05, 0xdc, 0x2a, 0x8a, 0x99, 0x78, 0x07, 0xa5, 0x97, 0xed, - 0x05, 0xdc, 0x2a, 0x8a, 0xc1, 0x7e, 0x36, 0x86, 0x0d, 0x2c, 0xb6, 0xcb, - 0x2e, 0x12, 0x4b, 0x2f, 0x39, 0x05, 0x65, 0x41, 0xe2, 0xfe, 0x25, 0xe1, - 0x8b, 0xb8, 0x4b, 0x2e, 0x18, 0xab, 0x2e, 0x67, 0x16, 0x5f, 0x9e, 0x5e, - 0x3d, 0x96, 0x5f, 0xb9, 0xc2, 0xcf, 0xd6, 0x51, 0x9e, 0x83, 0x94, 0x5f, - 0xc7, 0xb8, 0xf0, 0x7b, 0x8b, 0x2f, 0xf4, 0xfc, 0xd0, 0x5d, 0xc2, 0xa8, - 0x8f, 0xd7, 0x03, 0x8b, 0x2f, 0x14, 0x0d, 0x65, 0x42, 0x29, 0x24, 0x62, - 0x34, 0x13, 0x17, 0xb4, 0x2c, 0xba, 0x36, 0x59, 0x52, 0x34, 0xf8, 0x21, - 0x7f, 0x7d, 0x27, 0x91, 0x92, 0xcb, 0xd0, 0x53, 0x2c, 0xbe, 0x8e, 0x1c, - 0xcb, 0x2b, 0x0f, 0xac, 0x52, 0xdd, 0x0e, 0x5c, 0xfe, 0x59, 0x77, 0xbc, - 0xb2, 0xd3, 0xc6, 0xae, 0x3f, 0x07, 0x02, 0x69, 0xf3, 0x71, 0x97, 0xee, - 0x8b, 0x30, 0x63, 0xac, 0xef, 0x0c, 0x42, 0x62, 0xf4, 0x22, 0xf7, 0x0b, - 0xdb, 0xc5, 0xaf, 0xff, 0x4f, 0x63, 0xca, 0x7e, 0x68, 0x2e, 0xe1, 0x54, - 0x4d, 0xeb, 0xff, 0x98, 0xf2, 0x9f, 0x9a, 0x0b, 0xb8, 0x55, 0x13, 0xf2, - 0xfc, 0xdd, 0x37, 0x4d, 0xd3, 0x76, 0xdd, 0x2c, 0xb9, 0xe4, 0xb2, 0x9b, - 0xb3, 0xd8, 0x6d, 0x48, 0x57, 0x82, 0x23, 0x16, 0x5f, 0xb5, 0x1d, 0x04, - 0x2c, 0xbf, 0x77, 0x3d, 0x03, 0x59, 0x4d, 0x83, 0xec, 0x31, 0xe7, 0x27, - 0xbf, 0xcd, 0xc1, 0xba, 0x3d, 0xce, 0x9b, 0x6d, 0x65, 0xc4, 0x15, 0x97, - 0xdc, 0x99, 0x9c, 0x59, 0x7e, 0x2f, 0x74, 0xd8, 0xb2, 0xfa, 0x60, 0x38, - 0x8b, 0x2a, 0x0f, 0x2d, 0xc9, 0xee, 0x08, 0x56, 0x5f, 0xe0, 0xf4, 0xfd, - 0x98, 0xc5, 0x97, 0x6f, 0x0a, 0xe3, 0x02, 0x53, 0x70, 0x4d, 0x66, 0x11, - 0x4c, 0x5a, 0x66, 0xff, 0xc8, 0x38, 0x2f, 0xe3, 0x2b, 0xf3, 0x76, 0xd8, - 0xdc, 0xcf, 0x96, 0x5f, 0xcd, 0xd3, 0xed, 0xd3, 0xdd, 0x59, 0x7f, 0xd3, - 0xbd, 0xdc, 0x66, 0x6b, 0x16, 0x5f, 0x9b, 0x91, 0x45, 0xcd, 0xd5, 0x97, - 0xf7, 0x8c, 0x9a, 0xc2, 0x59, 0x76, 0xf0, 0xae, 0x30, 0x15, 0xba, 0xb2, - 0xef, 0xff, 0x59, 0x4d, 0xd2, 0x6a, 0x6d, 0x83, 0x56, 0xc9, 0xb3, 0x70, - 0x3a, 0xc3, 0x2f, 0x16, 0x00, 0x98, 0x41, 0x1b, 0xda, 0x7c, 0x59, 0x7c, - 0xe3, 0xc6, 0x2c, 0xa6, 0xe4, 0xde, 0x37, 0x11, 0xbb, 0xe6, 0xce, 0xcc, - 0xe2, 0xcb, 0xff, 0xf1, 0x3f, 0xa0, 0x82, 0x6c, 0x18, 0x1f, 0x52, 0x59, - 0x7e, 0x6b, 0xde, 0x86, 0x2c, 0xa6, 0xe4, 0xff, 0x36, 0x53, 0xbf, 0xe7, - 0xe9, 0xef, 0x9e, 0xd3, 0x4d, 0x24, 0xbf, 0xdd, 0x7f, 0x79, 0xdd, 0xa5, - 0x94, 0xd9, 0x4c, 0xfd, 0xb8, 0xc2, 0x91, 0xb5, 0x94, 0x37, 0x04, 0x0b, - 0xff, 0xf9, 0xb1, 0xcd, 0x41, 0xfb, 0xb8, 0x33, 0xe6, 0x17, 0xeb, 0x2e, - 0xe4, 0x2c, 0xa6, 0xec, 0xfd, 0x24, 0xbd, 0x7f, 0x6e, 0xc6, 0x9d, 0xe4, - 0xb2, 0xfd, 0xd3, 0x7f, 0xdb, 0x82, 0xcb, 0xd1, 0xf4, 0x96, 0x53, 0x74, - 0x8a, 0x16, 0xd0, 0x9f, 0xc5, 0xed, 0xe5, 0xd7, 0xff, 0x37, 0x2d, 0xcb, - 0x75, 0x31, 0x40, 0xf3, 0xef, 0x2c, 0xbe, 0x2c, 0x3f, 0xd6, 0x5f, 0x36, - 0xaf, 0xc5, 0x85, 0x94, 0xd8, 0x3c, 0xb6, 0xc9, 0x0d, 0xff, 0xa2, 0x22, - 0x22, 0x23, 0xee, 0x2c, 0xbd, 0x34, 0x79, 0x65, 0xd1, 0x10, 0x7b, 0x13, - 0x1d, 0xdf, 0xfe, 0xec, 0x4d, 0xf7, 0x33, 0xed, 0xd8, 0x82, 0x59, 0x78, - 0xfe, 0xc5, 0x97, 0xed, 0x1e, 0xce, 0xc4, 0x97, 0x34, 0xd2, 0x4a, 0xc3, - 0xc1, 0x68, 0xa2, 0xc0, 0x49, 0x3c, 0xd1, 0x5e, 0xee, 0x05, 0x65, 0x42, - 0x67, 0x1d, 0x2c, 0xfd, 0x3b, 0x8f, 0xe2, 0x11, 0xdf, 0x81, 0xb9, 0x00, - 0xf9, 0x65, 0xf3, 0x94, 0x37, 0xac, 0xac, 0x3c, 0xf7, 0x2c, 0xbf, 0xf3, - 0x79, 0xee, 0xf6, 0x68, 0xdd, 0x76, 0x2c, 0xbf, 0xf6, 0x32, 0x39, 0xcc, - 0x96, 0xe6, 0x2c, 0xae, 0xa2, 0x20, 0x92, 0x2f, 0xcc, 0x76, 0x60, 0xd6, - 0x5f, 0xf7, 0x83, 0xd3, 0x22, 0x8f, 0x96, 0x54, 0x1e, 0xfb, 0x93, 0xd1, - 0xa2, 0x87, 0xb0, 0x81, 0xbf, 0xd8, 0x33, 0xdf, 0xcf, 0xc2, 0xb2, 0xff, - 0xff, 0xd9, 0xbc, 0xfd, 0x2c, 0xff, 0x85, 0x9f, 0xea, 0x36, 0x7d, 0x05, - 0x65, 0xd1, 0x27, 0x45, 0x2f, 0x0d, 0xaf, 0xef, 0x73, 0x33, 0x68, 0x59, - 0x5d, 0x3d, 0xa2, 0x2d, 0xbe, 0xe0, 0xfc, 0x05, 0x97, 0xff, 0xff, 0x6f, - 0x8d, 0x60, 0xc9, 0xf4, 0x2b, 0xf8, 0x1e, 0x3f, 0x73, 0xa6, 0xb2, 0xff, - 0x68, 0x04, 0x0f, 0x03, 0xcb, 0x2f, 0x76, 0x09, 0x65, 0xa0, 0xcf, 0x3f, - 0xc6, 0x95, 0x09, 0x96, 0x04, 0x84, 0xc8, 0xfb, 0x0c, 0x2b, 0xc4, 0x70, - 0xb2, 0xfd, 0x02, 0x33, 0xa6, 0xb2, 0xb4, 0x78, 0x44, 0x35, 0x7e, 0x7d, - 0xa1, 0xc2, 0xb2, 0xfe, 0x12, 0x74, 0x72, 0x18, 0xb2, 0xba, 0x7a, 0xee, - 0x4f, 0x7f, 0x4b, 0x9e, 0xc2, 0x15, 0x65, 0xff, 0xa5, 0xc8, 0x94, 0x7f, - 0xcc, 0xde, 0xb2, 0xff, 0xe8, 0x0e, 0x6b, 0x3a, 0x7a, 0xeb, 0xac, 0xbc, - 0xd3, 0xb4, 0xb2, 0xff, 0xe8, 0xd4, 0x83, 0xd3, 0x98, 0x9d, 0xa5, 0x97, - 0xff, 0x69, 0xf6, 0x1f, 0x63, 0x9e, 0x07, 0x56, 0x57, 0x11, 0x17, 0xe4, - 0x5b, 0x33, 0x49, 0x87, 0x75, 0x0b, 0x90, 0xa9, 0xbf, 0xc6, 0x24, 0x34, - 0x3c, 0x62, 0xca, 0x84, 0xef, 0xf2, 0x34, 0xfe, 0x9e, 0x5f, 0xff, 0x00, - 0x8a, 0x05, 0x67, 0x63, 0xef, 0x47, 0x56, 0x5f, 0xf4, 0x76, 0x3e, 0x94, - 0xa3, 0x65, 0x97, 0xc1, 0xe9, 0xe9, 0x65, 0x68, 0xf7, 0x1c, 0xea, 0xff, - 0xf7, 0x4d, 0x83, 0x89, 0xdb, 0x80, 0xe9, 0xe9, 0x65, 0xfd, 0xe8, 0xe9, - 0x44, 0x96, 0x5f, 0xe2, 0x71, 0x4f, 0x51, 0x29, 0xc7, 0xf6, 0x69, 0xf7, - 0x1f, 0xcb, 0x2f, 0xf7, 0xe0, 0xcf, 0xd8, 0xf2, 0x59, 0x67, 0x91, 0xe6, - 0x7c, 0x2f, 0x7f, 0xc7, 0xec, 0xd6, 0x81, 0xb6, 0xf5, 0x97, 0xfd, 0xcc, - 0xf0, 0xf3, 0x3f, 0xe2, 0xca, 0xe9, 0xfa, 0xf8, 0xf2, 0xff, 0x8f, 0xd9, - 0xad, 0x03, 0x6d, 0xeb, 0x2f, 0x70, 0x05, 0x38, 0xf7, 0xba, 0x45, 0x43, - 0x56, 0x86, 0x13, 0x5d, 0x42, 0xb3, 0xb0, 0x9c, 0x28, 0x4b, 0x72, 0x1f, - 0x77, 0xcc, 0x31, 0xc2, 0xcb, 0xf8, 0xfb, 0xad, 0x1e, 0xcb, 0x2a, 0x0f, - 0x3f, 0xa4, 0x37, 0x35, 0xe5, 0x97, 0xff, 0x19, 0xf6, 0x6c, 0xf4, 0x7a, - 0x06, 0xb2, 0xd0, 0xb2, 0xff, 0xfa, 0x3e, 0x93, 0x97, 0xf3, 0xbf, 0x3d, - 0x18, 0xab, 0x2a, 0x11, 0x7f, 0x30, 0xc6, 0xe2, 0x1b, 0x78, 0x85, 0xf7, - 0xb9, 0xd3, 0x59, 0x7d, 0xb3, 0x0e, 0x4b, 0x2f, 0xa3, 0xf1, 0x18, 0xb2, - 0xf8, 0x80, 0xf2, 0x59, 0x41, 0x3c, 0x5e, 0x12, 0x5f, 0xee, 0xc3, 0x27, - 0xff, 0xfc, 0x2c, 0xa8, 0x46, 0x0e, 0x34, 0x19, 0x15, 0xfd, 0x31, 0xf7, - 0xd8, 0x15, 0x95, 0x89, 0x9f, 0x6a, 0x1c, 0x6e, 0x5b, 0x7f, 0x86, 0x24, - 0x6e, 0xf4, 0x1c, 0x59, 0x7e, 0x6f, 0x36, 0x67, 0x96, 0x57, 0xc7, 0xc4, - 0xc3, 0x8b, 0xdc, 0x86, 0x96, 0x5c, 0xfd, 0x59, 0x74, 0xd0, 0xb2, 0xe8, - 0xf2, 0xca, 0x83, 0x5a, 0x28, 0xbd, 0xf0, 0xf0, 0xa4, 0xb2, 0xfd, 0x87, - 0x2e, 0xc2, 0xcb, 0xa6, 0xf1, 0x9e, 0x3f, 0x48, 0x6f, 0xff, 0xc3, 0xec, - 0x68, 0xff, 0x81, 0x22, 0x62, 0x86, 0x2c, 0xbf, 0xc2, 0xc1, 0x7b, 0x8f, - 0xd5, 0x95, 0x08, 0xb7, 0x32, 0xe7, 0x56, 0xbf, 0x16, 0x39, 0x6c, 0xb2, - 0xa1, 0x3f, 0x5c, 0x23, 0x31, 0xd7, 0x43, 0x28, 0xc7, 0xf8, 0x5b, 0x79, - 0xf3, 0x4b, 0x2f, 0xe8, 0xdb, 0x51, 0x83, 0x59, 0x7f, 0x87, 0xd8, 0xf7, - 0xa1, 0x8b, 0x2b, 0x47, 0xf7, 0xd1, 0xb1, 0x0b, 0x6f, 0xfb, 0x51, 0xa7, - 0x89, 0x44, 0x96, 0x5f, 0xff, 0x16, 0x6f, 0x0b, 0xeb, 0x67, 0xf3, 0xfd, - 0xfa, 0xca, 0x84, 0x5d, 0x19, 0x83, 0x9b, 0xdf, 0xe2, 0x7d, 0xbe, 0x94, - 0x37, 0xac, 0xbf, 0xdc, 0xeb, 0x89, 0xd8, 0x92, 0xca, 0xd8, 0xfa, 0xfe, - 0x37, 0xbb, 0x26, 0x59, 0x7f, 0xff, 0xec, 0xf4, 0x1c, 0x9f, 0x9c, 0x8c, - 0x28, 0x96, 0x31, 0xfe, 0x59, 0x58, 0x7f, 0xfc, 0x17, 0xbf, 0xfe, 0xec, - 0x30, 0xf4, 0x6d, 0xf0, 0x26, 0xd8, 0xd2, 0xcb, 0xfb, 0x00, 0x11, 0x33, - 0xe5, 0x95, 0x32, 0x20, 0xf7, 0xaa, 0x5f, 0xf8, 0xf5, 0x1c, 0x10, 0x8a, - 0x34, 0xb2, 0xff, 0xa2, 0x44, 0xfe, 0x91, 0xef, 0x59, 0x78, 0x48, 0xfd, - 0x65, 0x74, 0xf5, 0xf8, 0x73, 0x6d, 0xd5, 0x97, 0xbd, 0x2c, 0x59, 0x77, - 0x31, 0x65, 0xfa, 0x26, 0x38, 0xe2, 0xcb, 0xff, 0xb9, 0x1a, 0x0f, 0x8b, - 0x36, 0x72, 0x59, 0x50, 0x9c, 0x66, 0xc4, 0xd9, 0x09, 0x43, 0x22, 0x71, - 0x4f, 0xc7, 0x08, 0x5b, 0xc4, 0xf7, 0x79, 0x8b, 0x2f, 0xd3, 0x03, 0xd1, - 0xd5, 0x95, 0x07, 0x80, 0x01, 0x7b, 0xff, 0x47, 0x9f, 0x99, 0xde, 0x9b, - 0x16, 0x5f, 0x8a, 0x36, 0x8d, 0x96, 0x50, 0xcf, 0x96, 0x63, 0xdb, 0xf8, - 0x70, 0xfa, 0xfc, 0x0b, 0x2e, 0xce, 0xac, 0xad, 0x8f, 0x13, 0x79, 0x75, - 0xff, 0xf6, 0x1b, 0x0f, 0xf7, 0xf1, 0x66, 0xda, 0x85, 0x97, 0xbc, 0x73, - 0x2c, 0xbf, 0xc6, 0x2b, 0xcb, 0x86, 0x35, 0x95, 0x09, 0x95, 0x63, 0x3f, - 0x49, 0x78, 0x9d, 0xe1, 0xdb, 0xdb, 0x02, 0x4b, 0x2f, 0xf1, 0xf3, 0xae, - 0xc8, 0xdd, 0x59, 0x7f, 0xfa, 0x69, 0x1e, 0xf8, 0xd6, 0x1c, 0x81, 0xa5, - 0x95, 0xa4, 0x40, 0xb9, 0xad, 0xfa, 0x37, 0x4d, 0xa0, 0xac, 0xbf, 0xec, - 0x67, 0x0f, 0x73, 0x35, 0x0b, 0x2a, 0x1b, 0x8f, 0x5d, 0xa1, 0x37, 0x28, - 0xd2, 0x47, 0x29, 0x4b, 0x21, 0x06, 0x17, 0x8f, 0x88, 0x4e, 0x74, 0xc3, - 0x76, 0x17, 0x73, 0x43, 0x83, 0x51, 0xc0, 0xb2, 0x54, 0x5f, 0x63, 0x8e, - 0x78, 0x4c, 0x7f, 0x0a, 0x32, 0x94, 0x61, 0xc8, 0x5a, 0x7a, 0x3b, 0x00, - 0x24, 0xef, 0x84, 0xf8, 0x84, 0x4d, 0xe5, 0x77, 0x0b, 0xe5, 0x97, 0xff, - 0xfc, 0xdc, 0x5b, 0x31, 0x8d, 0xaf, 0x4d, 0x96, 0xd3, 0x7e, 0xeb, 0x70, - 0x04, 0xe9, 0xdd, 0xdc, 0x59, 0x71, 0xc2, 0xcb, 0xd3, 0x08, 0xc5, 0x97, - 0xfd, 0x9e, 0xe6, 0x7b, 0xb9, 0xfa, 0xca, 0x14, 0xfb, 0x5c, 0x54, 0x87, - 0xee, 0x72, 0x59, 0x5a, 0x3c, 0x36, 0x17, 0x5f, 0x47, 0xb1, 0x8b, 0x2f, - 0xde, 0x82, 0x3f, 0xd6, 0x5d, 0xf7, 0xcb, 0x2f, 0xda, 0x06, 0xff, 0xda, - 0x59, 0x7f, 0x63, 0x4f, 0xfb, 0x31, 0x65, 0x4e, 0x45, 0xe6, 0x10, 0xfc, - 0x4f, 0xd1, 0x92, 0x2d, 0xbf, 0xf4, 0x30, 0xfe, 0xe0, 0x26, 0x00, 0xab, - 0x2f, 0xc5, 0xee, 0xe4, 0x96, 0x5d, 0xcc, 0x59, 0x46, 0x6f, 0x5c, 0x9e, - 0xff, 0x14, 0x35, 0xb9, 0x9a, 0x85, 0x96, 0x6a, 0x72, 0x34, 0xe4, 0xfe, - 0x31, 0xfb, 0xed, 0xa3, 0xdc, 0x59, 0x7a, 0x3f, 0xe2, 0xca, 0xd1, 0xe0, - 0x11, 0x1d, 0xf3, 0xe9, 0xe4, 0xb2, 0xda, 0xc3, 0xc2, 0x22, 0x1b, 0xcd, - 0x34, 0xd2, 0xcb, 0xed, 0x88, 0xe1, 0x24, 0xf3, 0x41, 0x7f, 0xdb, 0xbd, - 0x72, 0x90, 0xe3, 0x65, 0x97, 0xcf, 0xe8, 0x1a, 0xcb, 0xbe, 0x92, 0xcb, - 0xfc, 0x2c, 0x7b, 0x9d, 0x70, 0x2c, 0xbf, 0x1e, 0xd9, 0xf7, 0x96, 0x5c, - 0x61, 0x59, 0x50, 0x88, 0xb1, 0x46, 0x18, 0x69, 0xe2, 0x9b, 0xfe, 0x97, - 0xdc, 0x3d, 0x07, 0xb8, 0xb2, 0xfc, 0x2b, 0xf3, 0x7c, 0x96, 0x57, 0xc8, - 0xa2, 0xd1, 0xef, 0x8e, 0xaf, 0x60, 0x37, 0x16, 0x53, 0x61, 0x79, 0x99, - 0xb4, 0x18, 0x88, 0xd1, 0x07, 0x0d, 0xec, 0x8c, 0x78, 0xe1, 0x77, 0xd4, - 0x67, 0x33, 0x23, 0xc0, 0x46, 0x9d, 0xb8, 0x63, 0x7f, 0xdd, 0x79, 0x8a, - 0x33, 0x52, 0x59, 0x7f, 0xe6, 0xb3, 0x84, 0x71, 0xac, 0xd9, 0x65, 0x6e, - 0x9f, 0xb6, 0xf3, 0x8b, 0xff, 0xff, 0xff, 0x6e, 0xce, 0xee, 0x7d, 0x2e, - 0xb2, 0x70, 0x7a, 0x0f, 0x7b, 0x0b, 0xb9, 0xe8, 0x1c, 0xe9, 0xdd, 0xdc, - 0x59, 0x7f, 0xc3, 0xc0, 0x36, 0xcf, 0xae, 0xc5, 0x97, 0xe8, 0x61, 0x64, - 0xcb, 0x30, 0xde, 0x5e, 0xdf, 0x83, 0x59, 0x7f, 0x74, 0xe0, 0x81, 0x0b, - 0x2f, 0xf4, 0x6e, 0x8b, 0x9c, 0x7d, 0xd5, 0x94, 0x29, 0xf2, 0x74, 0xae, - 0xba, 0x8a, 0x57, 0x84, 0x15, 0xf7, 0x60, 0x4e, 0xac, 0xa1, 0xa6, 0x4b, - 0xc8, 0x6d, 0xf8, 0x9e, 0xfe, 0x89, 0x76, 0x37, 0x9a, 0xcb, 0xf3, 0x00, - 0x50, 0xc5, 0x96, 0x1a, 0xcb, 0x9f, 0x8b, 0x2d, 0xa6, 0x1a, 0x70, 0x08, - 0xd4, 0x1f, 0xab, 0xa7, 0x5d, 0x2f, 0x2c, 0xbe, 0x9a, 0x3c, 0xeb, 0x2f, - 0x81, 0xfe, 0x10, 0x4d, 0xc8, 0x05, 0xed, 0x25, 0x95, 0xb1, 0xe4, 0xf4, - 0xe2, 0xff, 0xe8, 0xe8, 0x83, 0xf1, 0xe4, 0xd0, 0xc5, 0x97, 0xfe, 0xf1, - 0xb4, 0x1e, 0x9e, 0xf3, 0x1a, 0xcb, 0xfd, 0xa9, 0x77, 0x37, 0xc3, 0x16, - 0x5f, 0x01, 0xb7, 0xcc, 0x59, 0x5f, 0x22, 0x70, 0xd0, 0x5c, 0xd6, 0xfc, - 0xf2, 0xe1, 0xef, 0x59, 0x7f, 0xd9, 0xac, 0x9d, 0x9a, 0x81, 0xac, 0xbc, - 0xc0, 0x6f, 0x59, 0x7f, 0x64, 0xbe, 0x96, 0x79, 0x65, 0xbd, 0x24, 0x43, - 0x61, 0xcf, 0x47, 0xef, 0xa3, 0xc0, 0x62, 0xca, 0x54, 0x41, 0xcb, 0xf9, - 0xf6, 0xfd, 0xc8, 0x68, 0xac, 0x1a, 0xb7, 0x02, 0x7a, 0x9b, 0x83, 0x14, - 0xc4, 0x50, 0xf9, 0xda, 0xff, 0x8f, 0x3d, 0xcd, 0x60, 0xf1, 0x65, 0xfd, - 0xd7, 0x61, 0x47, 0xcb, 0x2f, 0x99, 0xc7, 0x97, 0x4f, 0x90, 0x43, 0x7b, - 0xfb, 0xfe, 0x96, 0x7b, 0x8b, 0x2f, 0xe2, 0xcd, 0xe5, 0x9c, 0x59, 0x68, - 0xd1, 0xed, 0xf8, 0xba, 0xa1, 0x34, 0x3c, 0x84, 0x3f, 0x21, 0x2b, 0x7f, - 0x3f, 0x63, 0x74, 0x12, 0x59, 0x52, 0x5d, 0xa9, 0x0c, 0x28, 0xf5, 0x0a, - 0x26, 0x11, 0xf6, 0x1c, 0x3f, 0x97, 0x94, 0x2b, 0xfd, 0x28, 0x67, 0x79, - 0xcd, 0xfd, 0x22, 0xcf, 0xbd, 0x8b, 0x2f, 0xff, 0xc2, 0x7f, 0xfc, 0x7d, - 0x9b, 0x0d, 0xdc, 0x2e, 0x35, 0x95, 0x08, 0x86, 0xd1, 0x6d, 0xfc, 0x5e, - 0x96, 0x6b, 0x16, 0x5d, 0xb8, 0xeb, 0x29, 0xcf, 0x14, 0x42, 0xcb, 0xfd, - 0xdc, 0x0b, 0xf6, 0x3a, 0xb2, 0xff, 0xe7, 0x3f, 0x41, 0x07, 0x3d, 0xd3, - 0x59, 0x7f, 0x11, 0xff, 0xce, 0x9a, 0xcb, 0xb4, 0x35, 0x97, 0x34, 0xd2, - 0xca, 0x91, 0xb0, 0x68, 0x5e, 0xf4, 0x1e, 0xf4, 0x93, 0xcd, 0x15, 0xff, - 0x19, 0x1f, 0xfc, 0xce, 0xba, 0xca, 0xc4, 0xd6, 0x3a, 0x64, 0xe8, 0x3c, - 0x7f, 0xf1, 0x7d, 0xfd, 0x05, 0xee, 0xe4, 0x96, 0x5d, 0xff, 0x16, 0x5f, - 0xc7, 0xd3, 0x14, 0x58, 0x59, 0x61, 0x06, 0x78, 0xde, 0x18, 0xad, 0x22, - 0x6f, 0x8e, 0x54, 0x69, 0x83, 0x89, 0x0e, 0x4b, 0xfb, 0x77, 0x24, 0x64, - 0xeb, 0x2f, 0x34, 0xd3, 0x49, 0x29, 0x24, 0xf3, 0x41, 0x7c, 0x6d, 0x1c, - 0xc9, 0x28, 0x27, 0x80, 0x63, 0xb7, 0xec, 0xd4, 0x6f, 0xc5, 0x95, 0x0c, - 0xd1, 0xed, 0x89, 0xf2, 0x50, 0x61, 0xce, 0xef, 0xea, 0x32, 0x46, 0x33, - 0xf6, 0x54, 0x0b, 0x94, 0x94, 0x23, 0xb8, 0x43, 0x7d, 0xa9, 0x03, 0x16, - 0x5f, 0xe2, 0xfb, 0xc2, 0x75, 0xff, 0x59, 0x78, 0x8f, 0x8b, 0x2f, 0x1e, - 0x6c, 0xb2, 0xf8, 0x6e, 0x5f, 0xac, 0xbf, 0xfa, 0x0b, 0xf2, 0x8f, 0xa6, - 0x82, 0xfd, 0x65, 0x62, 0x35, 0x0c, 0xdb, 0xa3, 0x7f, 0x8e, 0x70, 0x8a, - 0xfa, 0x5f, 0xc8, 0x96, 0x5f, 0xa6, 0xdc, 0xff, 0x73, 0x16, 0x5f, 0x47, - 0x9f, 0xab, 0x2c, 0x6b, 0x2f, 0xf9, 0xc5, 0x0f, 0x4c, 0x6f, 0x25, 0x97, - 0xdb, 0x6c, 0xff, 0x2c, 0xbb, 0xfe, 0x19, 0xf7, 0x10, 0x80, 0x87, 0x37, - 0xd9, 0xae, 0x9a, 0xcb, 0xff, 0xcf, 0x22, 0xcd, 0xef, 0x34, 0x67, 0xb8, - 0xb2, 0xa0, 0xfa, 0xdc, 0x86, 0xff, 0xf3, 0x5f, 0xf7, 0x33, 0x63, 0xcd, - 0xf1, 0xf2, 0xcb, 0xff, 0xdf, 0xc3, 0x35, 0xa8, 0xdb, 0xce, 0xe2, 0xac, - 0xbc, 0xc8, 0x0a, 0xcb, 0xfe, 0x79, 0x73, 0xf7, 0xdf, 0x83, 0x59, 0x76, - 0x77, 0x0f, 0x5f, 0xa3, 0x97, 0xa4, 0x23, 0x16, 0x5f, 0x3f, 0xc3, 0x1a, - 0xca, 0x91, 0xf6, 0xb9, 0x67, 0x07, 0xaf, 0x63, 0x37, 0x56, 0x5f, 0xf9, - 0xf7, 0xe0, 0x85, 0x1d, 0x3d, 0x96, 0x5f, 0xec, 0xe1, 0x67, 0xba, 0x6b, - 0x28, 0x68, 0x90, 0xd0, 0xf9, 0x20, 0x56, 0x2b, 0x11, 0x9a, 0x14, 0xdd, - 0x20, 0xfd, 0x3b, 0xd1, 0x88, 0x6f, 0x85, 0xf5, 0xf4, 0xbf, 0xcf, 0xd6, - 0x5f, 0xde, 0xc9, 0x8a, 0x18, 0xb8, 0x80, 0x97, 0xc4, 0x3e, 0xc2, 0xa2, - 0x02, 0x4f, 0x37, 0x55, 0xf2, 0x27, 0x9d, 0x7a, 0xff, 0xe3, 0xfb, 0x83, - 0xc2, 0x82, 0x04, 0x2c, 0xbf, 0x68, 0xc0, 0xdb, 0x85, 0x97, 0xfb, 0x59, - 0xf7, 0x3f, 0x7f, 0x2c, 0xb8, 0x01, 0x83, 0xe0, 0x14, 0xae, 0xfd, 0x12, - 0x7f, 0x9a, 0x59, 0x7f, 0xd3, 0xb5, 0xac, 0xef, 0xd2, 0xe2, 0xcb, 0xff, - 0xfd, 0x9c, 0x03, 0xfd, 0x98, 0x42, 0xf3, 0x98, 0x5e, 0xe2, 0xca, 0x0a, - 0x27, 0x7e, 0x3d, 0xbf, 0x3b, 0x43, 0x17, 0x7a, 0xca, 0xc4, 0xf9, 0x8e, - 0x14, 0x5a, 0x2e, 0x78, 0x63, 0x11, 0x25, 0xb6, 0x59, 0x7e, 0x9d, 0x93, - 0x1b, 0x16, 0x5f, 0xfe, 0x04, 0x4e, 0x6f, 0xf1, 0xf3, 0xbf, 0x3b, 0x4b, - 0x2b, 0x63, 0xfb, 0xe1, 0x55, 0xff, 0xb0, 0x7d, 0x79, 0xf1, 0xd8, 0xf9, - 0x65, 0x36, 0x11, 0xe1, 0xa8, 0x46, 0xb0, 0x8e, 0xff, 0x88, 0x5d, 0x11, - 0x84, 0x04, 0xb2, 0xfd, 0xe8, 0xc2, 0x85, 0x94, 0x67, 0xba, 0x47, 0x17, - 0x84, 0x2f, 0x2c, 0xbc, 0x6c, 0x75, 0x95, 0xb1, 0xb8, 0x14, 0x76, 0xfc, - 0x1c, 0x3e, 0x31, 0x65, 0xff, 0xf7, 0xdf, 0x72, 0x0b, 0xc2, 0x4d, 0xd3, - 0xf7, 0x16, 0x53, 0x0f, 0xed, 0xc9, 0xea, 0x13, 0xad, 0xc8, 0x4b, 0x1a, - 0xc0, 0x21, 0x3d, 0x79, 0xbe, 0x3e, 0x59, 0x7a, 0x31, 0x8b, 0x2f, 0xf8, - 0x5f, 0x66, 0xb4, 0x73, 0x71, 0x65, 0x48, 0xfd, 0x98, 0x40, 0xe3, 0x77, - 0xfe, 0xc6, 0x40, 0x4f, 0xda, 0x03, 0x16, 0x5f, 0xb6, 0x04, 0xce, 0x35, - 0x97, 0x8f, 0xee, 0x2c, 0xbf, 0xfb, 0x91, 0xb6, 0x6a, 0x62, 0x8f, 0xf8, - 0xb2, 0xff, 0x46, 0x4c, 0x51, 0xa9, 0x2c, 0xa9, 0x23, 0xf5, 0xcf, 0xbf, - 0x2a, 0xf0, 0xeb, 0x48, 0xd7, 0xda, 0x79, 0x4c, 0xb2, 0xfd, 0xce, 0x47, - 0xed, 0xd2, 0xca, 0x14, 0xf4, 0x5a, 0x23, 0xa8, 0x46, 0x03, 0xc2, 0x72, - 0xff, 0x6a, 0x6e, 0x19, 0x78, 0xd6, 0x5f, 0xf1, 0x0b, 0x9a, 0xfd, 0x87, - 0xc5, 0x97, 0xfb, 0xa7, 0xf7, 0xfa, 0x71, 0xac, 0xbe, 0xfb, 0xfd, 0x42, - 0x4b, 0x9a, 0x69, 0x25, 0x41, 0xbd, 0x68, 0x92, 0xe2, 0x34, 0x93, 0xcd, - 0x0d, 0xff, 0xff, 0xc5, 0x3f, 0x31, 0xbe, 0x26, 0x36, 0x44, 0xd3, 0x8b, - 0xe9, 0x74, 0x1f, 0xac, 0xa5, 0x97, 0x6a, 0x53, 0x93, 0x40, 0x94, 0x24, - 0xfe, 0x27, 0xfd, 0xee, 0xa1, 0x3c, 0xd7, 0x8d, 0xea, 0xfc, 0x52, 0x08, - 0x36, 0x59, 0x7a, 0x35, 0x32, 0xca, 0x73, 0xc6, 0x01, 0x4d, 0x37, 0x2d, - 0x84, 0x74, 0x43, 0xdb, 0x64, 0x99, 0x11, 0x8c, 0xc3, 0x25, 0xd0, 0x1c, - 0x61, 0x5a, 0x94, 0x13, 0xd9, 0x5d, 0xcf, 0x0b, 0xb2, 0x8f, 0xaf, 0xc4, - 0xc0, 0x94, 0x00, 0xd3, 0x75, 0xef, 0x1b, 0x4b, 0x2f, 0x6c, 0xec, 0x59, - 0x7f, 0x9c, 0xbe, 0x97, 0x44, 0xe2, 0xcb, 0x8c, 0x6b, 0x2f, 0x78, 0xda, - 0x5c, 0x61, 0x0b, 0xc0, 0x71, 0x15, 0x10, 0x3b, 0xe3, 0x55, 0x52, 0x45, - 0x87, 0x4d, 0x7c, 0x81, 0x4e, 0x8f, 0xd0, 0x43, 0x36, 0xf1, 0x69, 0xb6, - 0xb2, 0xff, 0x60, 0x63, 0x62, 0x80, 0xac, 0xb7, 0xeb, 0x2d, 0xbb, 0x38, - 0xf1, 0x0c, 0xca, 0xe8, 0x02, 0xcb, 0xf0, 0x0b, 0xf1, 0x24, 0xb2, 0xff, - 0xf8, 0xb3, 0x93, 0x84, 0xec, 0x7e, 0xc7, 0x94, 0xec, 0x3c, 0x0e, 0x0b, - 0x50, 0x11, 0xaf, 0xbd, 0xb2, 0xff, 0xed, 0x1f, 0xc2, 0x7b, 0x0e, 0x4f, - 0xc5, 0x97, 0xfc, 0x0d, 0xa2, 0x74, 0x7a, 0x06, 0xb2, 0xb4, 0x88, 0x0e, - 0xa2, 0xde, 0x7d, 0x6c, 0xb2, 0xe6, 0x9a, 0x59, 0x7f, 0xb4, 0x79, 0xbc, - 0x49, 0x4f, 0x09, 0xb6, 0x68, 0x76, 0xff, 0xc6, 0x2c, 0xee, 0x03, 0xf6, - 0x44, 0x96, 0x5f, 0xee, 0x67, 0x9d, 0x98, 0x4b, 0x28, 0x69, 0x8e, 0x69, - 0x67, 0xa9, 0xfe, 0x43, 0xbf, 0xf7, 0x30, 0xb3, 0xb8, 0x1c, 0x25, 0x97, - 0xfd, 0x2e, 0x7b, 0xb8, 0xcc, 0x92, 0xcb, 0xff, 0x60, 0xbd, 0x79, 0x08, - 0xff, 0x42, 0xca, 0x92, 0x2d, 0x0c, 0xec, 0x8e, 0x6a, 0x13, 0x20, 0xc8, - 0x79, 0x5f, 0xfc, 0xc6, 0x3c, 0xb3, 0x41, 0x77, 0x0a, 0xa2, 0x18, 0x5f, - 0xff, 0xfe, 0x7e, 0x61, 0x60, 0x7b, 0x1f, 0x4b, 0x73, 0x3a, 0x13, 0xc2, - 0x71, 0x56, 0x56, 0x23, 0x20, 0x0a, 0x15, 0x0b, 0xa5, 0xa7, 0x19, 0xdf, - 0x65, 0x70, 0x94, 0x3b, 0xef, 0xc5, 0x1f, 0xfd, 0xfa, 0xcb, 0xa0, 0x45, - 0x97, 0xe7, 0xd8, 0xa2, 0x49, 0x2a, 0x63, 0x7d, 0xd1, 0x7b, 0xff, 0x7b, - 0xae, 0x7e, 0x8d, 0x47, 0xeb, 0x2f, 0xdd, 0x72, 0x13, 0x65, 0x95, 0x24, - 0x78, 0xb1, 0xa0, 0x88, 0x9a, 0x3e, 0xbf, 0xf1, 0x86, 0x38, 0xfa, 0xd1, - 0xb4, 0xb2, 0xff, 0xde, 0x32, 0xdb, 0x3e, 0xf7, 0x5d, 0x65, 0xff, 0xc7, - 0xa1, 0x43, 0xd3, 0xe9, 0x03, 0x65, 0x96, 0xe6, 0x22, 0x17, 0xf3, 0xfb, - 0xe0, 0x67, 0x0d, 0x65, 0xdc, 0x02, 0xcb, 0xfa, 0x5d, 0x77, 0x28, 0x59, - 0x68, 0x09, 0xe1, 0x7c, 0x2f, 0x7f, 0xf6, 0x7a, 0x3a, 0x78, 0x28, 0xb1, - 0x25, 0x97, 0xed, 0x05, 0xdc, 0x2a, 0x88, 0x29, 0x7b, 0xb0, 0xc5, 0x97, - 0xfe, 0x8d, 0x9f, 0xda, 0xc9, 0x6e, 0x62, 0xca, 0x1a, 0x35, 0x71, 0x10, - 0xcd, 0x08, 0x72, 0xfd, 0xd8, 0x60, 0x3e, 0x59, 0x7d, 0xee, 0x47, 0xe9, - 0x2f, 0x3e, 0xb6, 0x49, 0x7c, 0x02, 0x71, 0x52, 0x5f, 0xe3, 0xdb, 0x3d, - 0xc8, 0xfd, 0x25, 0x24, 0xbf, 0xb0, 0x31, 0xd8, 0x62, 0x4b, 0x9a, 0x69, - 0x25, 0xfc, 0x50, 0x5b, 0x1e, 0x92, 0x56, 0x26, 0x24, 0x12, 0x36, 0x0e, - 0xf4, 0x8b, 0xf3, 0x42, 0x0b, 0x68, 0xb0, 0x41, 0x9b, 0x8f, 0x49, 0x27, - 0x9f, 0x9d, 0x49, 0x50, 0x8c, 0xc7, 0x5d, 0x8e, 0xba, 0xff, 0xfd, 0x0d, - 0x70, 0xb3, 0xef, 0x39, 0x6d, 0x9f, 0x79, 0x65, 0x42, 0xe9, 0x56, 0x1e, - 0x9c, 0x30, 0xf4, 0x53, 0xd6, 0x37, 0x96, 0x1c, 0x47, 0x37, 0x98, 0xe3, - 0x59, 0x7f, 0xff, 0xc5, 0x9e, 0xf4, 0x7d, 0x29, 0xdd, 0x86, 0x03, 0xee, - 0x76, 0x16, 0x5f, 0xd8, 0x5c, 0x32, 0xc5, 0x97, 0xf3, 0x30, 0x7d, 0xcd, - 0x96, 0x5f, 0xfe, 0x27, 0x17, 0x9f, 0xfb, 0xdf, 0x7b, 0x02, 0xb2, 0xa0, - 0xfe, 0xc5, 0x2e, 0xbd, 0xd0, 0x31, 0x65, 0x0a, 0x9b, 0x56, 0xe8, 0xe7, - 0x5a, 0x8a, 0x14, 0xad, 0xe4, 0x57, 0xf9, 0xcb, 0x39, 0xa8, 0xe2, 0xcb, - 0xf8, 0x78, 0x4f, 0xee, 0x2c, 0xa9, 0x1e, 0xef, 0x0c, 0x6f, 0x9e, 0x6c, - 0xea, 0xcb, 0xfe, 0x83, 0x27, 0xf4, 0xc6, 0xd2, 0xcb, 0x6a, 0x71, 0xed, - 0x70, 0x8a, 0xa1, 0x14, 0xc6, 0xf9, 0x7e, 0xd7, 0xd2, 0xcf, 0x2c, 0xbf, - 0xfe, 0x73, 0xff, 0x98, 0x2b, 0xb3, 0x51, 0x84, 0xb2, 0xfd, 0xe3, 0xcf, - 0xbc, 0xb2, 0xff, 0xff, 0xba, 0x7a, 0xc1, 0xbb, 0x30, 0xbc, 0x50, 0xd6, - 0x7b, 0x8b, 0x2d, 0x0b, 0x2f, 0xa3, 0x78, 0xe0, 0x27, 0xe9, 0xfb, 0x25, - 0xff, 0x9e, 0x5d, 0x7f, 0x73, 0x0a, 0x4b, 0x2b, 0xa7, 0xf1, 0xe3, 0xba, - 0xd2, 0x75, 0xbd, 0x29, 0xe2, 0x77, 0xa3, 0x14, 0xbf, 0xfd, 0x9a, 0xff, - 0xda, 0xcd, 0xbd, 0x19, 0xc5, 0x97, 0x83, 0x8c, 0x59, 0x7f, 0x0d, 0xfd, - 0xc0, 0x49, 0x65, 0xd2, 0xdc, 0x83, 0xca, 0x10, 0x72, 0xfe, 0x7d, 0x47, - 0x8f, 0x7a, 0xca, 0xf8, 0xf7, 0xc8, 0xc6, 0xff, 0xff, 0xda, 0xd4, 0x7d, - 0x2f, 0xb8, 0x7a, 0x0f, 0x70, 0x4d, 0x1c, 0x0d, 0x65, 0xff, 0x3e, 0xb3, - 0xe9, 0x47, 0xf0, 0xb2, 0xa1, 0x19, 0x58, 0x44, 0x06, 0xfb, 0xff, 0xf0, - 0x45, 0x7e, 0x66, 0xa4, 0x7d, 0x72, 0xfa, 0x4b, 0x2f, 0xfc, 0x18, 0xf7, - 0x33, 0xc7, 0xf3, 0x4b, 0x2c, 0xf8, 0x89, 0x61, 0x55, 0xaa, 0x15, 0x77, - 0x0d, 0x13, 0xb1, 0xdf, 0x14, 0x31, 0x2f, 0xdc, 0x20, 0x6f, 0x92, 0xcb, - 0xdb, 0x08, 0x15, 0x97, 0xc4, 0x73, 0x6e, 0xac, 0xa8, 0x3e, 0xe7, 0x2a, - 0xe0, 0xfd, 0xcf, 0xfa, 0xca, 0x91, 0xe2, 0x78, 0xb6, 0xff, 0xfc, 0xef, - 0x27, 0xec, 0xec, 0xd8, 0x1e, 0x03, 0x88, 0xa8, 0xbe, 0xd7, 0xb7, 0x83, - 0xcb, 0x2e, 0x81, 0xac, 0xa8, 0x36, 0xbf, 0x8f, 0xdf, 0xce, 0x18, 0x28, - 0xfd, 0x65, 0xff, 0xb8, 0x65, 0xf4, 0xb4, 0x08, 0xe2, 0xcb, 0xf6, 0x6b, - 0x07, 0x0b, 0x2a, 0x64, 0xd3, 0x35, 0x09, 0xae, 0x90, 0xf8, 0xb3, 0x79, - 0xfd, 0xfb, 0xb9, 0x34, 0x6e, 0xac, 0xbf, 0x0f, 0x5a, 0xc6, 0x96, 0x56, - 0xc7, 0xa8, 0x45, 0x77, 0xf1, 0x96, 0x7a, 0x26, 0x59, 0x50, 0x79, 0xd2, - 0x22, 0xba, 0x5c, 0x59, 0x7f, 0x72, 0x46, 0x17, 0xd2, 0xcb, 0x05, 0x65, - 0xff, 0xfe, 0xfc, 0xf4, 0x2f, 0x61, 0x93, 0x48, 0xcb, 0xb1, 0xa8, 0x59, - 0x6f, 0x61, 0xf9, 0xf0, 0x46, 0xf1, 0xeb, 0x16, 0x5e, 0x2c, 0x92, 0xca, - 0x09, 0xb6, 0xf0, 0xdd, 0x41, 0xff, 0x1a, 0xed, 0xff, 0x88, 0xe5, 0xee, - 0xe6, 0x8f, 0x8b, 0x2f, 0xd2, 0x2c, 0xcd, 0x96, 0x5d, 0xad, 0x96, 0x54, - 0x1b, 0xfc, 0x27, 0xbf, 0xce, 0x38, 0xfe, 0x1a, 0xe2, 0xca, 0xe9, 0xe9, - 0xb8, 0xfd, 0xfd, 0xb8, 0xda, 0xe7, 0x4e, 0xee, 0xe2, 0xe2, 0x01, 0x5f, - 0xef, 0x7e, 0x21, 0x4b, 0xb8, 0xb8, 0x80, 0x57, 0x9f, 0x52, 0x5c, 0x40, - 0x2a, 0xc3, 0xeb, 0x02, 0x15, 0xcf, 0x25, 0xc4, 0x02, 0xbe, 0x72, 0xfa, - 0x4b, 0x88, 0x05, 0x7f, 0x8c, 0x3d, 0xcf, 0xff, 0x85, 0xc4, 0x02, 0xbc, - 0x64, 0x35, 0xc4, 0x02, 0xa1, 0xa2, 0xed, 0x84, 0x7d, 0x2f, 0xde, 0x83, - 0x61, 0x57, 0x10, 0x0a, 0xf6, 0xa3, 0xcb, 0x88, 0x05, 0x4b, 0x88, 0x05, - 0x7b, 0x70, 0xff, 0x5c, 0x40, 0x2b, 0xa1, 0x8b, 0x88, 0x05, 0x43, 0x3e, - 0x8c, 0x18, 0x32, 0xdb, 0xe3, 0x60, 0xe1, 0x71, 0x00, 0xaf, 0x79, 0xc2, - 0xb8, 0x80, 0x57, 0xfe, 0x27, 0x94, 0xfe, 0x98, 0x5f, 0x4b, 0x88, 0x05, - 0x7f, 0xf3, 0xf8, 0x1b, 0x19, 0x7b, 0xaf, 0x25, 0xc4, 0x02, 0xb9, 0xc6, - 0xb8, 0x80, 0x57, 0xf8, 0x9d, 0xae, 0x72, 0x3f, 0x5c, 0x40, 0x2b, 0xf1, - 0x8a, 0xe5, 0xfa, 0xe2, 0x01, 0x5c, 0x7c, 0x5c, 0x40, 0x2a, 0xd1, 0xec, - 0x78, 0xd6, 0xff, 0xf7, 0x4f, 0xde, 0xce, 0x4e, 0xd1, 0xc3, 0x17, 0x10, - 0x0a, 0xfd, 0xe2, 0x8f, 0xa4, 0xa8, 0x80, 0x57, 0x7f, 0x0b, 0x88, 0x05, - 0x3c, 0xda, 0xdf, 0x8e, 0x18, 0xe3, 0x5c, 0x40, 0x2b, 0xe0, 0x39, 0x05, - 0x71, 0x00, 0xaf, 0x46, 0x82, 0xb8, 0x80, 0x57, 0xfe, 0xcf, 0xb8, 0x38, - 0xc2, 0xff, 0x8b, 0x88, 0x05, 0x7e, 0x03, 0xca, 0x50, 0xb8, 0x80, 0x57, - 0xe7, 0x0f, 0x63, 0xe5, 0xc4, 0x02, 0xac, 0x45, 0xaf, 0x53, 0x00, 0x69, - 0x76, 0xbf, 0x5c, 0x40, 0x2a, 0x92, 0xb3, 0x41, 0x91, 0xe4, 0x26, 0x42, - 0x44, 0x70, 0x8d, 0xe9, 0xb7, 0xe6, 0x7c, 0x2e, 0xf4, 0x37, 0x80, 0x5f, - 0x7e, 0xcf, 0x71, 0xfe, 0x5c, 0x40, 0x2b, 0xfc, 0x38, 0x0c, 0xda, 0x8f, - 0x2e, 0x20, 0x10, 0xcd, 0xad, 0xed, 0x43, 0x4b, 0x88, 0x05, 0x41, 0x3f, - 0xbd, 0x28, 0xdf, 0xe0, 0x3c, 0xa5, 0x02, 0x31, 0x71, 0x00, 0xaf, 0x8c, - 0xa5, 0xc5, 0xc4, 0x02, 0xbf, 0x9e, 0x69, 0x67, 0xd2, 0x5c, 0x40, 0x2a, - 0xc4, 0x66, 0xf4, 0x8b, 0xf4, 0x10, 0x17, 0x5f, 0xf7, 0x63, 0x93, 0xf8, - 0x0d, 0x7e, 0xb8, 0x80, 0x56, 0x35, 0xc4, 0x02, 0xb9, 0xf6, 0x19, 0xf3, - 0xf5, 0x2a, 0xed, 0x7e, 0xb8, 0x80, 0x57, 0xe7, 0xf7, 0x0f, 0xe5, 0xc4, - 0x02, 0xbf, 0x8c, 0x81, 0x2c, 0xe2, 0xe2, 0x01, 0x54, 0x22, 0x4c, 0x89, - 0x7c, 0x6b, 0x50, 0xca, 0x82, 0x1c, 0x2d, 0xf2, 0x1b, 0x86, 0x7f, 0x30, - 0xfe, 0xa1, 0x23, 0xd2, 0xd7, 0x2e, 0xfc, 0xa4, 0x93, 0x39, 0x2e, 0x17, - 0xd2, 0x86, 0x37, 0x21, 0x48, 0x24, 0x30, 0x6f, 0x78, 0xda, 0x5c, 0x61, - 0x2b, 0xce, 0xe1, 0x54, 0x40, 0x29, 0xe9, 0x8a, 0xfd, 0x0e, 0xbb, 0xe1, - 0x5b, 0x50, 0xd8, 0xb2, 0xed, 0xfb, 0x2c, 0xbf, 0xb6, 0x8d, 0x75, 0xf7, - 0x56, 0x5b, 0x8b, 0x2f, 0x8a, 0x07, 0xd5, 0x95, 0xd3, 0x65, 0xbc, 0x46, - 0xa1, 0x14, 0x18, 0x34, 0x6c, 0x77, 0xff, 0x48, 0xb0, 0x3d, 0x3f, 0xff, - 0x04, 0xcb, 0x2f, 0xde, 0xc1, 0xbf, 0x56, 0x5d, 0xfc, 0x24, 0xb0, 0xa9, - 0x2f, 0x76, 0x36, 0x59, 0x73, 0x4d, 0x24, 0xa3, 0x3d, 0xfd, 0xd1, 0x79, - 0x84, 0x9a, 0x1d, 0xb7, 0x12, 0x4f, 0x3c, 0x0b, 0x33, 0x11, 0xd4, 0x70, - 0xc6, 0xbf, 0xbd, 0xcc, 0x6b, 0xa6, 0xb2, 0xde, 0x59, 0x63, 0xf1, 0xbf, - 0x01, 0x75, 0xff, 0xfb, 0xe9, 0x70, 0xbe, 0x81, 0x79, 0x1f, 0x48, 0xd8, - 0xb2, 0xff, 0xf7, 0xb9, 0x82, 0x9e, 0x84, 0xff, 0xf8, 0xf9, 0x65, 0x36, - 0x5b, 0x18, 0xd8, 0x17, 0xda, 0x31, 0xe9, 0x10, 0x0e, 0x19, 0xe1, 0xa5, - 0xdc, 0x1a, 0x86, 0xa1, 0x94, 0xe5, 0xbf, 0xc6, 0x63, 0xe6, 0xb0, 0x13, - 0x08, 0xb3, 0x7f, 0xd9, 0x23, 0x1b, 0x87, 0x92, 0x59, 0x7f, 0xcc, 0x32, - 0x09, 0xe8, 0xff, 0x59, 0x41, 0x3f, 0x0e, 0x9c, 0x5e, 0x0f, 0x49, 0x65, - 0xff, 0xde, 0xdc, 0xc9, 0xa4, 0xfa, 0xd8, 0x70, 0xb2, 0x98, 0x7c, 0xa4, - 0x39, 0x71, 0x7e, 0xb2, 0xe8, 0xe2, 0xcb, 0xde, 0x13, 0x79, 0x9a, 0xdd, - 0xe2, 0xf7, 0xfb, 0x3e, 0xf7, 0x9e, 0x5c, 0x59, 0x7a, 0x4d, 0xb9, 0x2c, - 0xbb, 0xe9, 0x2e, 0x30, 0x05, 0xff, 0xec, 0x6a, 0x3d, 0x93, 0x48, 0xfd, - 0xc7, 0x59, 0x5f, 0x22, 0x40, 0x88, 0x78, 0x4b, 0x7f, 0xfe, 0x8c, 0xef, - 0x09, 0xfc, 0x0f, 0x0f, 0xa6, 0x2a, 0xca, 0x85, 0x4a, 0xb9, 0x08, 0x73, - 0x4e, 0xd1, 0xbb, 0xc3, 0x10, 0x8c, 0x2f, 0xff, 0xc4, 0x40, 0xfb, 0x3e, - 0xf0, 0xf4, 0xff, 0x66, 0xcb, 0x2f, 0xd9, 0xed, 0x47, 0x16, 0x51, 0x9f, - 0xf9, 0x2c, 0x5f, 0xa6, 0x94, 0x6b, 0x65, 0x97, 0xd0, 0x2c, 0x31, 0x65, - 0x48, 0xfb, 0x34, 0x40, 0xc2, 0xab, 0xff, 0x4b, 0x93, 0x8b, 0x19, 0x1a, - 0x15, 0x65, 0xfa, 0x74, 0xec, 0xeb, 0xac, 0xbf, 0xa5, 0x1a, 0xfc, 0x46, - 0x2c, 0xbf, 0xfb, 0x79, 0x67, 0x3d, 0x85, 0x2c, 0xe2, 0xcb, 0xe6, 0x40, - 0x3c, 0xb2, 0xb0, 0xf9, 0x9d, 0x12, 0xfc, 0xfe, 0xf3, 0xe9, 0x65, 0xef, - 0x39, 0x2c, 0xb3, 0xe2, 0x3e, 0x0a, 0x12, 0xdc, 0x20, 0x6f, 0x27, 0xa9, - 0xc9, 0xb5, 0xf6, 0x32, 0x3b, 0xfe, 0x8d, 0xd1, 0xf6, 0x36, 0x72, 0x59, - 0x7f, 0xd0, 0x18, 0x61, 0xb3, 0xf3, 0x59, 0x5a, 0x44, 0xff, 0x4b, 0x1b, - 0xce, 0xef, 0xe1, 0x1a, 0xd1, 0xe7, 0x52, 0x5f, 0xb9, 0xd8, 0xcd, 0x96, - 0x5f, 0xfd, 0xf9, 0x1e, 0x7d, 0xe9, 0xa4, 0xfa, 0x59, 0x7d, 0x37, 0x5e, - 0x65, 0x97, 0xc1, 0x7d, 0x6c, 0xb2, 0xfd, 0x93, 0x4a, 0x3e, 0x59, 0x71, - 0xcc, 0xb2, 0xf1, 0xc1, 0x2c, 0xbf, 0x66, 0x87, 0xdc, 0x59, 0x43, 0x3c, - 0x1e, 0x0d, 0x57, 0x4f, 0xeb, 0x8b, 0x17, 0x8a, 0x24, 0x92, 0xff, 0xc5, - 0xf9, 0xb7, 0xb7, 0x82, 0x51, 0xba, 0xb2, 0xb0, 0xf8, 0xdc, 0x6e, 0xa7, - 0x27, 0xfb, 0xf1, 0x46, 0x91, 0xba, 0x48, 0x44, 0x7e, 0x85, 0x1b, 0x7c, - 0x21, 0x6a, 0x17, 0x53, 0x70, 0xbc, 0xe5, 0x25, 0xf4, 0xcd, 0xe5, 0x16, - 0x5f, 0xdf, 0x73, 0x5a, 0x8f, 0x2c, 0xbf, 0xa5, 0xc1, 0x74, 0xe1, 0x59, - 0x78, 0xbd, 0xc5, 0x97, 0x88, 0xe4, 0xb2, 0xfd, 0xc0, 0x10, 0x02, 0xb2, - 0xfe, 0xf4, 0xd2, 0xcf, 0xa4, 0xb2, 0xa1, 0x17, 0xc6, 0x5e, 0xe3, 0x80, - 0x1b, 0x10, 0xa2, 0xff, 0xee, 0xb5, 0x1a, 0xe6, 0x34, 0xfa, 0x15, 0x65, - 0xf0, 0xc7, 0x8c, 0x59, 0x77, 0xf0, 0x92, 0xe6, 0x9a, 0x49, 0x46, 0x6c, - 0x1a, 0x17, 0xbf, 0x0c, 0x0f, 0xa9, 0x24, 0x9e, 0x68, 0x6b, 0x11, 0x5a, - 0x2b, 0x9d, 0xff, 0xef, 0x7c, 0x13, 0xee, 0xe4, 0x7b, 0xa2, 0x71, 0x65, - 0xfe, 0x89, 0x1f, 0xa5, 0x1e, 0x59, 0x73, 0x6f, 0x8b, 0x34, 0x6c, 0xaf, - 0xfb, 0xaf, 0xee, 0x04, 0xb3, 0x65, 0x97, 0x04, 0xd6, 0x5f, 0x11, 0xfd, - 0x25, 0x97, 0xfc, 0x7f, 0x77, 0x07, 0xa7, 0x0a, 0xca, 0x83, 0xdb, 0xd1, - 0x15, 0xfe, 0xe6, 0x1f, 0x85, 0x3e, 0xac, 0xbf, 0xee, 0xc6, 0xa0, 0x26, - 0x41, 0x59, 0x78, 0x57, 0xe0, 0x51, 0xf9, 0xa7, 0x1f, 0x10, 0xb7, 0x99, - 0xd6, 0x27, 0x0f, 0xe8, 0xcd, 0x6a, 0x4a, 0xdd, 0x35, 0x0f, 0x46, 0x11, - 0x82, 0x10, 0x4d, 0x47, 0x65, 0x7f, 0x34, 0x2b, 0xf8, 0xa1, 0x65, 0xf0, - 0x19, 0x83, 0x59, 0x5f, 0x1e, 0x83, 0x79, 0x75, 0xff, 0xbb, 0x8d, 0xee, - 0x42, 0xe7, 0xde, 0x59, 0x7f, 0xd8, 0x1e, 0x98, 0xfa, 0x01, 0x56, 0x5e, - 0xf6, 0x05, 0x65, 0x30, 0xf5, 0xb8, 0x75, 0x7a, 0x4c, 0xfd, 0x65, 0x0a, - 0x8d, 0x8f, 0xe1, 0x31, 0xe2, 0x2b, 0xfe, 0x15, 0xe7, 0x43, 0x08, 0xc5, - 0x59, 0x7f, 0xe7, 0xe3, 0x20, 0xf5, 0xa3, 0x69, 0x65, 0xb8, 0x29, 0xfc, - 0xf4, 0xee, 0xf9, 0xe4, 0xfa, 0x59, 0x7f, 0xd9, 0xef, 0x18, 0xbe, 0xc0, - 0xac, 0xbf, 0xa3, 0xee, 0x67, 0xde, 0x59, 0x76, 0xa1, 0x65, 0x0c, 0xf1, - 0x7c, 0x5f, 0x7f, 0xbc, 0x61, 0x31, 0xc7, 0x96, 0x5f, 0xb9, 0x01, 0xc6, - 0x2c, 0xa8, 0x3d, 0x9e, 0x19, 0x5b, 0x83, 0x4c, 0x6b, 0x1f, 0xb4, 0xf7, - 0x5f, 0x27, 0x34, 0xc2, 0x9f, 0x46, 0x77, 0x7f, 0xde, 0x3d, 0xa3, 0xef, - 0xf5, 0x0b, 0x2f, 0x73, 0xd8, 0xb2, 0xec, 0xe4, 0xe3, 0xd7, 0x10, 0xee, - 0xff, 0x74, 0x27, 0xc0, 0x48, 0xd6, 0x5f, 0xfd, 0x9e, 0x3f, 0xa4, 0x50, - 0xd9, 0x6e, 0x3b, 0x8b, 0x2f, 0xff, 0x02, 0x5d, 0x73, 0xf1, 0x97, 0x81, - 0xd5, 0x97, 0xf8, 0x5f, 0x7c, 0x13, 0xd7, 0x16, 0x5f, 0xb3, 0xdf, 0xbf, - 0x96, 0x54, 0x26, 0x57, 0x23, 0x3d, 0x28, 0x81, 0x27, 0x70, 0xda, 0xff, - 0xfd, 0x1d, 0x7c, 0x28, 0xd0, 0xa3, 0x03, 0xea, 0x4b, 0x2a, 0x49, 0xfe, - 0x7a, 0x35, 0xb6, 0xf4, 0xda, 0x85, 0xeb, 0xac, 0x85, 0x69, 0xc3, 0xf9, - 0xe5, 0x25, 0x02, 0x54, 0x5d, 0xf7, 0x4d, 0xe4, 0xb2, 0xff, 0x61, 0x4b, - 0x38, 0x23, 0x16, 0x5f, 0x99, 0xcf, 0xdd, 0xd6, 0x57, 0x8f, 0x6c, 0x43, - 0x3b, 0xfd, 0x85, 0x3b, 0xb9, 0xf3, 0x4b, 0x2f, 0xe8, 0xe9, 0xef, 0xc9, - 0x96, 0x56, 0x8f, 0x97, 0xf3, 0x6b, 0xfe, 0x91, 0x03, 0xf9, 0xc1, 0x67, - 0xeb, 0x2b, 0x64, 0xd9, 0x64, 0xf9, 0x90, 0x88, 0xf8, 0x8e, 0xff, 0xb3, - 0xe9, 0x75, 0xbd, 0xbe, 0x37, 0x56, 0x5f, 0xfc, 0xfd, 0xe1, 0xc8, 0xfd, - 0x1e, 0xe2, 0xcb, 0xfd, 0x9e, 0xe9, 0xee, 0x3e, 0xcb, 0x2f, 0xf8, 0xa3, - 0x3e, 0xf6, 0x6a, 0x16, 0x5f, 0xfa, 0x3a, 0x27, 0x0b, 0x3d, 0xdc, 0x59, - 0x7f, 0x66, 0xfe, 0xe7, 0xee, 0xb2, 0xa1, 0x3a, 0x4c, 0x44, 0x34, 0x3e, - 0xa1, 0xb9, 0xb7, 0xe6, 0xe4, 0x7d, 0x7e, 0x7d, 0xe3, 0x1c, 0x2c, 0xbb, - 0x9c, 0x59, 0x79, 0xa6, 0x9a, 0x59, 0x77, 0xee, 0x92, 0x79, 0xa0, 0xad, - 0x1f, 0x07, 0x0d, 0xef, 0xfd, 0x9c, 0x27, 0x16, 0x62, 0x39, 0x96, 0x5f, - 0xdf, 0xc4, 0xba, 0x27, 0x16, 0x5f, 0xf1, 0xfe, 0x26, 0x6f, 0x20, 0x71, - 0x65, 0xfc, 0x65, 0xf8, 0x42, 0x6b, 0x2f, 0x3f, 0xf8, 0x92, 0xa4, 0x9c, - 0xfb, 0x21, 0x13, 0xd2, 0x2f, 0xcf, 0xc8, 0xc3, 0x79, 0xe6, 0xe1, 0x6d, - 0xf4, 0x0c, 0xc6, 0xb2, 0xfe, 0xe7, 0x4c, 0x2f, 0xa5, 0x97, 0xe1, 0xe8, - 0xc1, 0xb2, 0xcb, 0xf6, 0x7b, 0x8f, 0xf2, 0xcb, 0xfc, 0xd6, 0x16, 0x6f, - 0x3d, 0x2c, 0xbf, 0x8b, 0x3e, 0xfc, 0x49, 0x2c, 0xbf, 0xfe, 0xe7, 0xb3, - 0xa2, 0x33, 0x03, 0x1d, 0x86, 0x2c, 0xac, 0x4c, 0xca, 0x62, 0xdd, 0x14, - 0x91, 0x47, 0x8d, 0x00, 0x61, 0x7e, 0xcc, 0xf7, 0x71, 0x65, 0xce, 0xc5, - 0x97, 0xfc, 0x0e, 0x7a, 0x26, 0x07, 0xdc, 0x59, 0x7f, 0xb3, 0x7e, 0x4f, - 0x69, 0xa6, 0x92, 0x5f, 0xa6, 0x8c, 0xef, 0x16, 0x54, 0xe4, 0x4f, 0x11, - 0xe0, 0x87, 0x57, 0xf9, 0xb7, 0x00, 0x0f, 0x4f, 0x4b, 0x2f, 0x31, 0xfc, - 0xb2, 0xa6, 0x4c, 0xe7, 0xb0, 0xb4, 0x01, 0x96, 0xf3, 0x7a, 0x59, 0x7d, - 0xf0, 0x4f, 0x4b, 0x2d, 0xfb, 0x76, 0x6b, 0xbc, 0x17, 0x7e, 0xde, 0xec, - 0x36, 0x2c, 0xa8, 0x3d, 0x62, 0x2d, 0xbf, 0x64, 0xd2, 0x89, 0x2c, 0xbf, - 0xb6, 0x1c, 0x61, 0x0d, 0x65, 0x42, 0xe5, 0xbc, 0x9b, 0xce, 0x35, 0x3e, - 0xab, 0xbc, 0x6b, 0xfc, 0x86, 0x57, 0x88, 0x04, 0x28, 0xbc, 0xff, 0x9a, - 0xcb, 0xfe, 0x19, 0x03, 0x99, 0xb6, 0x6c, 0xb2, 0xf4, 0x68, 0x96, 0x5f, - 0xec, 0x19, 0x3f, 0x0c, 0x6b, 0x2d, 0xd5, 0x97, 0x80, 0xfb, 0x11, 0xe1, - 0x70, 0xc6, 0xc7, 0xa4, 0x48, 0x79, 0x76, 0x98, 0x98, 0x73, 0x8e, 0x36, - 0xe1, 0x95, 0x7f, 0x08, 0x32, 0x8c, 0xd9, 0x65, 0x89, 0x65, 0xf4, 0x6d, - 0x12, 0x59, 0x43, 0x3e, 0x07, 0x2e, 0x21, 0x0b, 0xff, 0xd8, 0x37, 0x66, - 0x7d, 0x2c, 0xff, 0x06, 0xb2, 0xee, 0xba, 0xcb, 0xa6, 0xe2, 0xcb, 0xf6, - 0x6f, 0x32, 0x1e, 0x1a, 0xe1, 0x05, 0xaf, 0xe9, 0xde, 0xce, 0x72, 0x16, - 0x5f, 0xbb, 0x9f, 0x7a, 0x16, 0x5f, 0x9b, 0xdf, 0x61, 0x24, 0xb2, 0xa7, - 0x26, 0x75, 0x3d, 0xe2, 0x0f, 0xb0, 0xbc, 0x05, 0x17, 0xc3, 0xce, 0xba, - 0xcb, 0xff, 0x61, 0x4b, 0xb8, 0x45, 0x0d, 0x2c, 0xbf, 0xf6, 0x6b, 0x4f, - 0x29, 0xdb, 0xe3, 0x75, 0x65, 0x42, 0x20, 0x64, 0x79, 0x5a, 0x4c, 0x44, - 0x93, 0x7d, 0x0a, 0x2b, 0xfd, 0xae, 0x77, 0x08, 0xf8, 0xb2, 0xa1, 0x56, - 0xf9, 0xca, 0x78, 0x73, 0x5b, 0xfe, 0xc1, 0xe1, 0x41, 0x02, 0x16, 0x59, - 0xa5, 0x97, 0xff, 0xc5, 0xfe, 0x7d, 0xe8, 0xfa, 0x5e, 0xfe, 0x24, 0xb2, - 0xa0, 0xf9, 0x4c, 0x4a, 0xa1, 0xf3, 0xf6, 0x76, 0x8c, 0x6a, 0x53, 0xaa, - 0x83, 0x9e, 0x6a, 0xc8, 0xf6, 0x05, 0x8d, 0x64, 0x33, 0x97, 0x9f, 0x43, - 0xe8, 0xe3, 0x6e, 0x9a, 0x1e, 0xba, 0xac, 0x6b, 0x99, 0x2e, 0x7f, 0xb3, - 0xd2, 0xce, 0xaf, 0xfc, 0x3b, 0x4a, 0x94, 0xed, 0xc9, 0x6d, 0x5e, 0x9e, - 0xb7, 0x04, 0x72, 0x3b, 0xe5, 0xbc, 0x08, 0x6c, 0xdf, 0x09, 0xab, 0xfe, - 0xcd, 0x14, 0x7a, 0x59, 0xd5, 0x97, 0xff, 0x10, 0x45, 0x7e, 0x64, 0xa0, - 0x82, 0xb2, 0xfd, 0xfe, 0x0d, 0xe4, 0xb2, 0x8c, 0xfa, 0xc9, 0x0e, 0xff, - 0xbd, 0xce, 0x9c, 0x31, 0xc6, 0xb2, 0xff, 0xdd, 0x32, 0x8f, 0xb8, 0x6c, - 0x85, 0x97, 0xb9, 0x1a, 0x59, 0x77, 0xb8, 0x13, 0xd9, 0xf8, 0xf6, 0xa1, - 0x18, 0x00, 0x84, 0x8d, 0xfe, 0x09, 0x64, 0xa4, 0xfc, 0x59, 0x7f, 0x3b, - 0x59, 0xf8, 0x9e, 0x59, 0x70, 0xcd, 0x65, 0xf7, 0xdc, 0x8f, 0x96, 0x5c, - 0xf2, 0x9c, 0x6e, 0x8c, 0x5a, 0xfe, 0xe6, 0x0c, 0xf9, 0xb2, 0xcb, 0xd2, - 0x8f, 0xd6, 0x5f, 0x84, 0x9a, 0x51, 0xba, 0x92, 0xa1, 0x57, 0x56, 0x42, - 0x88, 0x58, 0x70, 0x19, 0x3e, 0x8c, 0xba, 0xd5, 0xc2, 0xdf, 0x17, 0x08, - 0x3b, 0x60, 0xac, 0xbf, 0xf8, 0x52, 0x03, 0x89, 0x9c, 0x38, 0x25, 0x97, - 0xb7, 0x0c, 0x6b, 0x2b, 0x47, 0xc4, 0xc4, 0x3b, 0xd0, 0xfa, 0x59, 0x7f, - 0x33, 0xdd, 0x8d, 0xf0, 0xb2, 0xfb, 0x08, 0x3f, 0xac, 0xbf, 0xf7, 0x80, - 0xce, 0xc1, 0x93, 0x8d, 0x65, 0xf4, 0xa4, 0xfe, 0x59, 0x5f, 0x1e, 0xfb, - 0x9e, 0xdf, 0x0b, 0xa7, 0x69, 0x65, 0x84, 0x54, 0x40, 0xab, 0x79, 0x54, - 0x0a, 0x2b, 0xc6, 0xf5, 0xa1, 0xfa, 0xc4, 0x41, 0x9b, 0x0d, 0xfc, 0x6d, - 0xb0, 0xf6, 0x1a, 0x59, 0x7f, 0xba, 0x62, 0x4f, 0xff, 0xf8, 0x49, 0x5a, - 0x3e, 0xad, 0xc3, 0x2b, 0xe2, 0x6f, 0x6d, 0xf1, 0x65, 0x19, 0xe7, 0x08, - 0x4b, 0x7f, 0x77, 0x00, 0xdb, 0xce, 0x2c, 0xbf, 0xe2, 0xf7, 0x01, 0xf7, - 0x8d, 0xa5, 0x97, 0xff, 0xec, 0x6a, 0x18, 0x07, 0x1f, 0xbe, 0x09, 0x93, - 0x4b, 0x2f, 0xfe, 0xcf, 0xbc, 0x1e, 0x98, 0xfb, 0x9b, 0x2c, 0xbf, 0x9f, - 0x99, 0x84, 0x2a, 0xca, 0xc3, 0xf2, 0x02, 0x35, 0x42, 0x64, 0xa3, 0x3b, - 0xec, 0x32, 0x6f, 0xfa, 0x3d, 0xc9, 0xd8, 0xc3, 0x1a, 0xcb, 0xff, 0x4e, - 0x27, 0x16, 0x77, 0x3f, 0xfe, 0x16, 0x5f, 0xfe, 0xd8, 0x1f, 0xf2, 0x47, - 0xce, 0x46, 0xa4, 0xb2, 0xc6, 0x2a, 0x24, 0xb4, 0x8b, 0x7f, 0x9f, 0xbf, - 0x72, 0x0b, 0xcb, 0x2b, 0x87, 0xb9, 0xe2, 0x9b, 0xff, 0xfc, 0x3e, 0xc0, - 0x7a, 0x73, 0x3b, 0xc8, 0x57, 0x11, 0xf7, 0x56, 0x5f, 0x16, 0x6f, 0xc5, - 0x95, 0xb2, 0x21, 0xda, 0x65, 0xbf, 0xdd, 0x39, 0xa5, 0x05, 0x25, 0x97, - 0xff, 0xf4, 0x7b, 0x82, 0x17, 0xba, 0x07, 0x97, 0xb9, 0x8d, 0x2c, 0xbf, - 0xf4, 0x35, 0xc6, 0xc3, 0x87, 0x3e, 0xf2, 0xca, 0x84, 0x7c, 0x84, 0x97, - 0x46, 0x7e, 0x5d, 0xbe, 0x97, 0x73, 0x65, 0x97, 0xfd, 0x1f, 0x31, 0xfd, - 0x9f, 0x79, 0x65, 0xcf, 0xb2, 0xca, 0xf8, 0xfd, 0x08, 0x8d, 0xa3, 0xab, - 0xfc, 0xc7, 0xe1, 0x46, 0x0a, 0xb2, 0xfc, 0x0e, 0xea, 0x1a, 0x59, 0x76, - 0xe3, 0xac, 0xba, 0x03, 0x87, 0xe9, 0xe3, 0x21, 0x0a, 0x6e, 0xd3, 0xac, - 0xbf, 0xfb, 0x79, 0xf3, 0x98, 0x41, 0x72, 0xfd, 0x65, 0xfe, 0xe9, 0x8c, - 0x78, 0xd4, 0xcb, 0x2f, 0x46, 0xbf, 0xc3, 0xfa, 0x0a, 0x2d, 0x69, 0x18, - 0x7d, 0x84, 0x85, 0xff, 0x9f, 0xee, 0x67, 0x8d, 0x8f, 0x25, 0x96, 0xf2, - 0xca, 0xfc, 0xf3, 0xc4, 0x3e, 0xbf, 0xfd, 0x99, 0xd3, 0x0f, 0x73, 0xd8, - 0x2c, 0x96, 0x5f, 0xff, 0xe9, 0x8a, 0x19, 0xa8, 0x0e, 0x6b, 0x3a, 0x7a, - 0xeb, 0xac, 0xbf, 0xfe, 0x7d, 0x7f, 0xb9, 0x9a, 0x89, 0x1f, 0xde, 0xc5, - 0x97, 0xff, 0xff, 0x03, 0x9d, 0x79, 0x72, 0x47, 0xe1, 0x35, 0x1d, 0x8f, - 0x71, 0xfe, 0x59, 0x7e, 0x8c, 0x2f, 0x6e, 0x2c, 0xbf, 0x8f, 0xef, 0xf4, - 0xe3, 0x59, 0x66, 0x2c, 0xa6, 0x1f, 0x4f, 0x4a, 0x48, 0xbe, 0xed, 0x6e, - 0xac, 0xbd, 0x20, 0x0d, 0x65, 0xcf, 0xf4, 0xe3, 0xe5, 0x98, 0xb9, 0xc6, - 0xab, 0x15, 0x18, 0x9a, 0xfe, 0x94, 0xf9, 0x1a, 0x15, 0xff, 0xfd, 0x85, - 0xb7, 0x39, 0x1f, 0xe7, 0x4f, 0x4e, 0xd7, 0x96, 0x5f, 0xc3, 0xc2, 0x17, - 0x50, 0xb2, 0xa4, 0xca, 0x87, 0x1c, 0x6a, 0xc1, 0x35, 0xfa, 0x32, 0x89, - 0xa3, 0xa2, 0xd4, 0x2c, 0x19, 0x0a, 0x4e, 0xc3, 0xf7, 0xf7, 0x72, 0x24, - 0xf4, 0xa7, 0xa6, 0x90, 0xf7, 0x17, 0x2f, 0x7c, 0xdb, 0x6f, 0x59, 0x7f, - 0xff, 0x8b, 0x07, 0xd8, 0x68, 0xb0, 0xf6, 0xdc, 0x07, 0x4f, 0x4b, 0x2a, - 0x19, 0x82, 0xa7, 0x4a, 0xa9, 0x78, 0x72, 0x00, 0x96, 0xfa, 0x02, 0x61, - 0x59, 0x7c, 0x3d, 0x1b, 0x4b, 0x2d, 0x0b, 0x2f, 0xff, 0xa6, 0x77, 0x97, - 0x21, 0x83, 0xec, 0x10, 0x56, 0x54, 0x1e, 0xf9, 0x88, 0x5f, 0xf6, 0x4d, - 0x28, 0xfb, 0x3e, 0xf2, 0xcb, 0x6d, 0x87, 0xb6, 0x44, 0x15, 0x24, 0xc9, - 0x46, 0x43, 0xa8, 0x6e, 0xdf, 0x0f, 0xa0, 0xd9, 0x65, 0xfc, 0xf2, 0xcd, - 0x80, 0x4b, 0x2e, 0xc1, 0xac, 0xa1, 0x9e, 0x18, 0x4b, 0x6f, 0xfd, 0xac, - 0xdd, 0x9b, 0xae, 0xc3, 0xe2, 0xcb, 0x6d, 0x08, 0xcb, 0xc6, 0x7d, 0x11, - 0x5c, 0xdb, 0xc5, 0x95, 0x87, 0x9e, 0xe6, 0xb7, 0xfe, 0xde, 0x7e, 0x94, - 0x4e, 0xf4, 0x01, 0x65, 0xfb, 0x70, 0x1d, 0xc0, 0xac, 0xac, 0x3e, 0xdf, - 0x21, 0x5f, 0xed, 0x47, 0x8f, 0xf8, 0x92, 0xcb, 0xfb, 0xed, 0x9e, 0x51, - 0xba, 0xb2, 0xe2, 0x92, 0xca, 0x83, 0xc8, 0xd8, 0xca, 0x9b, 0x0d, 0x97, - 0xfc, 0x39, 0xc8, 0x88, 0x51, 0xb0, 0x97, 0x9c, 0x20, 0x59, 0x0a, 0x5e, - 0xd3, 0x3b, 0x9e, 0x37, 0x12, 0x8d, 0x43, 0x90, 0x8d, 0xf1, 0x08, 0x1e, - 0xef, 0xfc, 0xd8, 0x12, 0x18, 0x1e, 0xbf, 0xdf, 0xac, 0xbf, 0xd2, 0x9b, - 0x09, 0xfb, 0x8b, 0x2f, 0xbe, 0x94, 0x31, 0x65, 0xff, 0x41, 0x6d, 0xcc, - 0x64, 0x6e, 0xac, 0xba, 0x3a, 0xb2, 0xfe, 0x79, 0x87, 0x05, 0xb2, 0xca, - 0xd9, 0x14, 0x43, 0x23, 0x23, 0xbd, 0xe2, 0xd7, 0xd1, 0x31, 0xf5, 0x65, - 0xe6, 0xf8, 0x62, 0xca, 0x73, 0xc1, 0x6f, 0x22, 0xbf, 0x10, 0xfb, 0x12, - 0x59, 0x7c, 0xdf, 0x04, 0x15, 0x97, 0xf7, 0x70, 0x57, 0x8d, 0x96, 0x5f, - 0x44, 0xda, 0x85, 0x97, 0x33, 0x16, 0x53, 0x0d, 0xc7, 0x48, 0xaf, 0xa0, - 0x0d, 0xb3, 0x59, 0x7e, 0xce, 0x14, 0x34, 0xb2, 0xfc, 0xfc, 0xf1, 0xcc, - 0xb2, 0xff, 0x1e, 0xa3, 0x67, 0xd0, 0x56, 0x5b, 0xd3, 0x93, 0x9d, 0x82, - 0x4c, 0x27, 0x09, 0x21, 0xb3, 0x68, 0x87, 0xa4, 0xbc, 0x27, 0xf1, 0x45, - 0xff, 0xed, 0x04, 0xb3, 0x79, 0x64, 0x6a, 0x38, 0xb2, 0xff, 0x3c, 0xdd, - 0xc6, 0x67, 0x16, 0x56, 0x1f, 0xe6, 0xf4, 0x9b, 0xdb, 0x91, 0xe5, 0x97, - 0xd1, 0xbc, 0xf7, 0xac, 0xbb, 0x18, 0xb2, 0xc2, 0xce, 0x37, 0x66, 0x4b, - 0x5b, 0x22, 0x0c, 0x96, 0xaf, 0xc2, 0xfb, 0x31, 0x8b, 0x2f, 0xfd, 0x29, - 0x18, 0x61, 0x93, 0x72, 0x16, 0x56, 0x22, 0x28, 0xc8, 0xdc, 0xa2, 0xff, - 0xf4, 0xc5, 0x82, 0x8a, 0xfe, 0xe1, 0x94, 0xcb, 0x2f, 0xbb, 0x9b, 0x12, - 0xcb, 0xf6, 0x0c, 0xf5, 0xc5, 0x97, 0xe1, 0x24, 0x7f, 0xf1, 0x65, 0xfb, - 0x41, 0x8c, 0xd9, 0x65, 0xef, 0x7b, 0xe5, 0x97, 0xff, 0x7c, 0x13, 0xec, - 0xe6, 0xfc, 0xe9, 0xb1, 0x65, 0x7e, 0x7d, 0x1e, 0x1e, 0xb8, 0x1a, 0x59, - 0x58, 0x8c, 0xae, 0x42, 0x43, 0x70, 0x8e, 0xd1, 0xb2, 0x6a, 0x4c, 0x27, - 0x6a, 0x1e, 0x95, 0x0b, 0xce, 0xf9, 0x28, 0x74, 0xe3, 0x00, 0xec, 0x66, - 0x0e, 0x5b, 0xc4, 0xcf, 0x46, 0xe9, 0x7f, 0xe2, 0x31, 0x3e, 0xcd, 0xff, - 0x40, 0x8b, 0x2f, 0xff, 0x1e, 0x68, 0x70, 0xd6, 0x76, 0x3e, 0xe2, 0xcb, - 0xe1, 0x23, 0x5f, 0xac, 0xbf, 0xf4, 0x7d, 0xde, 0xc6, 0xd0, 0x06, 0x2c, - 0xb8, 0x49, 0x2c, 0xb9, 0xf4, 0xb2, 0xff, 0xfc, 0x2e, 0x78, 0xf9, 0xd0, - 0x67, 0xbf, 0x71, 0xc2, 0xcb, 0xfb, 0xc7, 0xb3, 0x20, 0x2b, 0x28, 0x68, - 0x9a, 0xd0, 0xb7, 0x55, 0xaf, 0xff, 0x7f, 0x34, 0x8f, 0x52, 0x9a, 0x47, - 0xa9, 0x2c, 0xbd, 0xe3, 0xd9, 0x65, 0x7c, 0x7d, 0x7a, 0x4e, 0xbf, 0x33, - 0x01, 0xad, 0x96, 0x5e, 0x81, 0x8d, 0x65, 0xd8, 0xde, 0xb2, 0xfb, 0xf1, - 0x0a, 0x4b, 0x2c, 0xe4, 0x6f, 0x7c, 0x33, 0x7e, 0xe7, 0x30, 0xbf, 0x59, - 0x5f, 0x9e, 0x69, 0x12, 0xd4, 0x27, 0x5e, 0x70, 0x9b, 0x72, 0x3f, 0x14, - 0x82, 0x14, 0xd7, 0x7d, 0x32, 0xcb, 0xf0, 0x9e, 0xfd, 0x98, 0xb2, 0x98, - 0x78, 0x7f, 0x8c, 0xdd, 0x1c, 0x59, 0x7d, 0x1d, 0x81, 0xac, 0xa0, 0x9b, - 0x79, 0x85, 0xaf, 0xfa, 0x4f, 0xaf, 0x14, 0x33, 0x8b, 0x2f, 0xf4, 0x0e, - 0x34, 0x08, 0xfd, 0x65, 0xcc, 0xe4, 0xc7, 0xd6, 0xc3, 0x8b, 0xff, 0xe8, - 0xcf, 0xbd, 0xdc, 0x39, 0x18, 0xa2, 0xe2, 0xcb, 0xf1, 0x43, 0x79, 0x42, - 0xcb, 0xff, 0xf9, 0xda, 0x1b, 0xbe, 0xb6, 0xeb, 0xfb, 0xa7, 0xa9, 0x2c, - 0xbf, 0xe7, 0x2c, 0xf7, 0x8d, 0xaf, 0x2c, 0xbf, 0xff, 0xfa, 0x69, 0x19, - 0x7a, 0x3f, 0x6f, 0xf1, 0x8b, 0xac, 0x8f, 0xa4, 0x6c, 0x59, 0x50, 0x8a, - 0xf2, 0x38, 0xa8, 0x55, 0x75, 0x8b, 0x47, 0x08, 0xdd, 0x17, 0xba, 0x81, - 0x14, 0x02, 0x30, 0xba, 0x6c, 0xb3, 0xc6, 0xa1, 0x1a, 0x53, 0xe9, 0x78, - 0xf8, 0x14, 0x39, 0x92, 0xba, 0x49, 0xfa, 0x07, 0x25, 0x30, 0xfa, 0x5a, - 0x7d, 0xff, 0xde, 0xfa, 0x59, 0xe3, 0xdf, 0x04, 0x15, 0x97, 0xf4, 0x03, - 0xe3, 0xf9, 0xbd, 0x65, 0xfb, 0x1a, 0xcf, 0xbc, 0xb2, 0xa7, 0x1e, 0xd9, - 0x99, 0x5f, 0xef, 0xa5, 0x83, 0xee, 0x6c, 0xb2, 0xbe, 0x47, 0xce, 0xa1, - 0x42, 0x44, 0x77, 0xf6, 0xd1, 0xaf, 0xa5, 0xc5, 0x97, 0xb5, 0x9c, 0x59, - 0x7e, 0x32, 0xdf, 0x92, 0x59, 0x7b, 0x0f, 0x65, 0x94, 0x29, 0xf0, 0x30, - 0x73, 0xa5, 0x17, 0xf4, 0x6d, 0x9e, 0xc6, 0x2c, 0xbf, 0xfb, 0x08, 0x01, - 0xee, 0x32, 0x67, 0x0a, 0xca, 0x34, 0x50, 0xe8, 0xc3, 0x85, 0xb7, 0xcc, - 0x38, 0x1a, 0xcb, 0xfc, 0x42, 0xf6, 0x18, 0xc2, 0x59, 0x7f, 0x6e, 0x9c, - 0x37, 0x83, 0xcb, 0x2f, 0xd1, 0x36, 0x60, 0x56, 0x54, 0x22, 0xbb, 0x08, - 0x4c, 0xcf, 0xa6, 0x77, 0xc4, 0xc7, 0xf2, 0xcb, 0xc4, 0x72, 0x59, 0x7f, - 0xee, 0xe4, 0xc7, 0x30, 0x1b, 0xc1, 0xc5, 0x97, 0x8f, 0x42, 0xac, 0xbe, - 0xf1, 0xc7, 0xcb, 0x28, 0xd1, 0x06, 0x48, 0x9c, 0x1d, 0xbf, 0xe8, 0x9a, - 0x3d, 0xdc, 0xd0, 0x56, 0x5e, 0xec, 0x4c, 0xb2, 0xd1, 0xf1, 0xeb, 0x37, - 0x9c, 0xd4, 0x91, 0x5f, 0xc8, 0x42, 0x5e, 0x23, 0x35, 0x97, 0xff, 0x02, - 0x63, 0xec, 0x7d, 0x28, 0x9a, 0x16, 0x5f, 0x86, 0xe5, 0x1d, 0x59, 0x7f, - 0x4a, 0x3e, 0xf6, 0x75, 0x65, 0xff, 0xef, 0x70, 0xff, 0x89, 0x73, 0x33, - 0xef, 0x2c, 0xa9, 0x8f, 0xe7, 0x85, 0xd5, 0xd4, 0x61, 0x35, 0x09, 0xfb, - 0xfd, 0xd7, 0x9b, 0x0d, 0xbc, 0x6b, 0x28, 0xcf, 0x7f, 0x85, 0x37, 0xfb, - 0x87, 0xd3, 0x98, 0xf6, 0x59, 0x7f, 0xfc, 0x0d, 0x6a, 0x0b, 0x05, 0x3e, - 0xf7, 0x04, 0x59, 0x58, 0x88, 0x4d, 0x1a, 0x5e, 0x9b, 0x50, 0xb2, 0xfc, - 0xe6, 0x38, 0x25, 0x97, 0x40, 0x16, 0x54, 0x1e, 0xc1, 0x0e, 0xf0, 0x96, - 0xfb, 0x68, 0x6f, 0x85, 0x97, 0xdd, 0xfd, 0xfc, 0xb2, 0xdd, 0x59, 0x6d, - 0xee, 0x6d, 0x00, 0x47, 0x7f, 0xf1, 0xb0, 0xf9, 0xd8, 0x3d, 0x03, 0x75, - 0x65, 0x42, 0x31, 0xcd, 0x65, 0xca, 0x2f, 0xe2, 0xe1, 0xef, 0x81, 0xac, - 0xbf, 0xef, 0xcc, 0xbd, 0x1c, 0x07, 0x56, 0x5e, 0x23, 0x15, 0x65, 0xf9, - 0xf5, 0xa8, 0xd9, 0x65, 0xfd, 0xe3, 0xd1, 0xf8, 0x0b, 0x2a, 0x72, 0x2a, - 0x98, 0x73, 0xe1, 0xc1, 0x0a, 0x2f, 0x71, 0xff, 0x59, 0x50, 0x7b, 0xbe, - 0x40, 0xbf, 0x80, 0x27, 0x73, 0xee, 0x2c, 0xbf, 0xff, 0xff, 0x6a, 0x3c, - 0x4e, 0x13, 0xe4, 0xc7, 0xa0, 0xc7, 0x3d, 0x1f, 0x40, 0x99, 0xc5, 0x97, - 0xfb, 0xb9, 0xf4, 0x68, 0xd8, 0xb2, 0xff, 0xff, 0xff, 0xb9, 0x9e, 0xeb, - 0xb3, 0x9a, 0xd1, 0xfd, 0xe7, 0x71, 0x73, 0x26, 0x07, 0xa1, 0xaf, 0xa1, - 0x65, 0xf8, 0x13, 0x66, 0xe6, 0x2c, 0xae, 0x23, 0x0b, 0xd0, 0x97, 0xbf, - 0xef, 0xb8, 0x46, 0xcf, 0x66, 0xea, 0xcb, 0xb3, 0x4b, 0x2a, 0x0f, 0x4b, - 0xa7, 0x97, 0xf7, 0x89, 0xff, 0xc2, 0x59, 0x7e, 0x27, 0xff, 0x09, 0x65, - 0x4e, 0x3d, 0x2f, 0x16, 0x54, 0x2a, 0x89, 0x1c, 0x20, 0xde, 0x1e, 0xbe, - 0x7a, 0x03, 0x9d, 0xff, 0xbc, 0x7c, 0x27, 0xf4, 0xce, 0x35, 0x97, 0xdf, - 0xbf, 0xdc, 0x59, 0x73, 0x4d, 0x2c, 0xae, 0x1b, 0xd6, 0x89, 0x2f, 0xba, - 0xf9, 0xd4, 0x93, 0xcd, 0x15, 0x62, 0x34, 0x0e, 0x13, 0xb7, 0xe1, 0x31, - 0x87, 0xa5, 0x97, 0x31, 0xd6, 0x5f, 0xef, 0x41, 0x05, 0xb9, 0xfd, 0x8b, - 0x2b, 0xa7, 0x9e, 0x01, 0x6b, 0xdd, 0x8f, 0xd6, 0x5f, 0xf8, 0x03, 0xe9, - 0xe8, 0xfe, 0x9a, 0x16, 0x5c, 0xdd, 0xef, 0x59, 0x58, 0x98, 0xa1, 0xbb, - 0xb9, 0x11, 0x0e, 0xf9, 0x02, 0xf7, 0x67, 0x6e, 0xac, 0xbc, 0x41, 0x35, - 0x97, 0xee, 0xc1, 0x66, 0xcb, 0x2a, 0x0f, 0x90, 0xc8, 0x9c, 0x6e, 0xff, - 0x76, 0x3c, 0x06, 0x03, 0xcb, 0x2a, 0x19, 0xe9, 0x9b, 0x1a, 0xca, 0x33, - 0x11, 0xc3, 0x77, 0x0e, 0x85, 0x21, 0xfa, 0x34, 0xd3, 0x28, 0xdd, 0x1a, - 0x9a, 0x36, 0x7d, 0x42, 0x95, 0x8f, 0x5d, 0x87, 0xa3, 0x96, 0xff, 0x19, - 0xab, 0x6c, 0x84, 0xa5, 0x5c, 0xf2, 0x32, 0x4f, 0x46, 0x75, 0xbe, 0x15, - 0x6d, 0xe5, 0x97, 0xf8, 0x3d, 0x3f, 0x71, 0xfe, 0x59, 0x7b, 0x35, 0xbd, - 0x65, 0xf1, 0xe8, 0x49, 0x96, 0x5f, 0xf8, 0xbf, 0x63, 0xc8, 0xa3, 0xdc, - 0x59, 0x76, 0x62, 0xcb, 0xe0, 0xf4, 0xc4, 0x59, 0x42, 0xa3, 0xb0, 0xcd, - 0x3a, 0x3c, 0xe4, 0x8d, 0xb3, 0xe1, 0x05, 0x6f, 0xd3, 0x44, 0xdd, 0x85, - 0x97, 0xff, 0x8b, 0xdc, 0x13, 0xc6, 0x40, 0x96, 0x71, 0x65, 0xc2, 0x42, - 0xcb, 0xcd, 0x34, 0xd2, 0x4b, 0xe9, 0x7b, 0x02, 0x92, 0x79, 0xa0, 0xbf, - 0x60, 0xcf, 0xfe, 0x2e, 0xef, 0xe5, 0x68, 0xfa, 0x48, 0xd2, 0xf4, 0x72, - 0x4b, 0x2a, 0x13, 0x50, 0xc2, 0x9d, 0x25, 0x3c, 0x28, 0x3f, 0x21, 0xbe, - 0x60, 0xf0, 0x96, 0x5d, 0xee, 0x2c, 0xbf, 0xde, 0xec, 0x7b, 0x9d, 0x35, - 0x97, 0x3c, 0x96, 0x5f, 0xa7, 0x64, 0xc7, 0xb2, 0xca, 0x9c, 0x7e, 0x8c, - 0x33, 0xe0, 0xb5, 0xb8, 0xb2, 0xff, 0x7b, 0xe9, 0x76, 0x0b, 0x64, 0x97, - 0xfe, 0xcf, 0xa4, 0x78, 0x45, 0x83, 0x59, 0x7e, 0xd9, 0x80, 0xfb, 0xcb, - 0x2a, 0x13, 0x69, 0xfa, 0x11, 0x7a, 0x31, 0x21, 0x1e, 0x1a, 0xf8, 0xf2, - 0xc6, 0xb2, 0xf9, 0xc4, 0x71, 0xac, 0xbb, 0xe9, 0x39, 0xb2, 0x00, 0x85, - 0xff, 0x14, 0x35, 0xc3, 0x2f, 0xa4, 0xb2, 0xff, 0xff, 0xdc, 0xfc, 0xf4, - 0x3c, 0x2e, 0x98, 0x7a, 0x7e, 0x16, 0x0a, 0x4b, 0x2e, 0x80, 0xac, 0xa2, - 0x45, 0xdf, 0x8e, 0x77, 0xb6, 0x5e, 0x12, 0x37, 0x56, 0x5e, 0x17, 0xa6, - 0xb2, 0xb6, 0x37, 0xa6, 0x41, 0x7e, 0x28, 0x6b, 0x09, 0x65, 0xff, 0x77, - 0xe8, 0x16, 0x69, 0x46, 0xea, 0xcb, 0x70, 0x67, 0xcb, 0x84, 0xd5, 0xa4, - 0x56, 0xfa, 0x10, 0xd6, 0xd9, 0x65, 0x42, 0xac, 0xbc, 0x84, 0x71, 0xc3, - 0xa1, 0xe3, 0x1b, 0x01, 0x45, 0xff, 0xf1, 0x4b, 0xc0, 0xee, 0xa1, 0xa9, - 0x1f, 0xf8, 0xb2, 0xff, 0xfd, 0xe7, 0xd6, 0x1f, 0xfc, 0xce, 0x9e, 0xba, - 0xeb, 0x2f, 0xdf, 0x72, 0x6c, 0xf2, 0xca, 0xc4, 0x67, 0xfc, 0xa2, 0x4a, - 0x97, 0xf1, 0xf8, 0x9f, 0xfe, 0x2c, 0xbf, 0xfd, 0xe9, 0xb3, 0x58, 0xec, - 0x8e, 0x98, 0xd6, 0x5f, 0xc0, 0x66, 0x77, 0xe7, 0x59, 0x42, 0xa2, 0x90, - 0x8b, 0x78, 0x93, 0x7f, 0xf8, 0xc6, 0x4f, 0xf1, 0x67, 0xb0, 0xff, 0x59, - 0x7d, 0xb6, 0xcf, 0xba, 0xb2, 0xf8, 0x23, 0x06, 0xcb, 0x2f, 0x4b, 0x80, - 0x59, 0x74, 0x7b, 0x0f, 0x07, 0xa4, 0x97, 0xee, 0xbe, 0xb3, 0x4b, 0x2e, - 0x03, 0xac, 0xa0, 0x9b, 0xd2, 0x27, 0xbe, 0x97, 0x80, 0x35, 0x97, 0xe8, - 0x39, 0x3f, 0x16, 0x57, 0xc7, 0x93, 0xa2, 0x3b, 0xff, 0x7d, 0xc3, 0x17, - 0x3c, 0x7a, 0xc5, 0x95, 0xb2, 0x32, 0xc9, 0xa7, 0xc4, 0x77, 0xfd, 0xac, - 0xe1, 0x66, 0xfe, 0x9a, 0xcb, 0xfc, 0x32, 0xcd, 0xe7, 0xa7, 0x59, 0x50, - 0x89, 0xc3, 0x30, 0x01, 0xcd, 0xfb, 0x6d, 0xd3, 0xcf, 0x96, 0x5f, 0x8f, - 0x91, 0xb3, 0x17, 0x67, 0xea, 0xfd, 0x0f, 0xaf, 0xc0, 0xbb, 0x3f, 0x57, - 0x3c, 0x97, 0x67, 0xea, 0xf8, 0x12, 0xce, 0x2e, 0xcf, 0xd5, 0x0c, 0xf4, - 0x88, 0x8e, 0xfd, 0x19, 0xcc, 0x25, 0xd9, 0xfa, 0xa5, 0xd9, 0xfa, 0xb9, - 0xfc, 0xbb, 0x3f, 0x4c, 0x2e, 0x2d, 0x22, 0x3f, 0xc0, 0x25, 0x5f, 0x66, - 0xe1, 0xfe, 0xbb, 0x3f, 0x54, 0xbb, 0x3f, 0x57, 0x7f, 0x0b, 0xb3, 0xf5, - 0x7f, 0xd9, 0xfb, 0xeb, 0x37, 0xe0, 0xd7, 0x67, 0xea, 0xfe, 0xce, 0x9f, - 0x01, 0xb2, 0xec, 0xfd, 0x57, 0xe8, 0xa6, 0x22, 0x4e, 0x23, 0xdf, 0x6b, - 0x68, 0xf2, 0xec, 0xfd, 0x52, 0xec, 0xfd, 0x61, 0xb0, 0xb9, 0xa6, 0x97, - 0x67, 0xea, 0xa4, 0xac, 0x74, 0x66, 0xb9, 0x08, 0x7f, 0xa1, 0x3b, 0xa2, - 0x76, 0x19, 0x72, 0x17, 0xde, 0x60, 0x68, 0x9e, 0xe8, 0x15, 0x36, 0x7e, - 0x93, 0xd1, 0x21, 0x7f, 0xdb, 0x46, 0xfc, 0x3d, 0x66, 0xcb, 0x2a, 0x47, - 0xe9, 0xa3, 0x9b, 0xfa, 0x30, 0x48, 0x94, 0x96, 0x5f, 0xee, 0x64, 0xa5, - 0x1e, 0xf9, 0x65, 0x62, 0x20, 0xc8, 0x8b, 0x85, 0xb7, 0xfe, 0xc0, 0x8f, - 0x34, 0xd3, 0xf6, 0x65, 0x97, 0xff, 0x70, 0xb2, 0x68, 0xdb, 0xf7, 0xfb, - 0x8b, 0x2e, 0x96, 0xc9, 0x2f, 0xa6, 0x77, 0xd2, 0xca, 0xd9, 0x1d, 0xff, - 0x17, 0x75, 0x00, 0x91, 0xdb, 0xc6, 0x2e, 0x3d, 0x96, 0x56, 0x97, 0x89, - 0x1e, 0x76, 0xff, 0xc9, 0xd7, 0xf9, 0x9c, 0x2c, 0xf6, 0x7e, 0xb2, 0xff, - 0xa6, 0x2c, 0xdf, 0xdf, 0x9f, 0x75, 0x65, 0xfd, 0xec, 0xec, 0x6b, 0xf5, - 0x97, 0xfd, 0xa3, 0x67, 0x04, 0x8c, 0x99, 0x65, 0xff, 0x06, 0x3f, 0x18, - 0x1f, 0x52, 0x59, 0x7f, 0xe7, 0x7d, 0xb1, 0x8e, 0x5f, 0x49, 0x65, 0xe7, - 0x17, 0x98, 0x7f, 0x13, 0x1d, 0x59, 0xa9, 0xc9, 0x8a, 0x68, 0xb8, 0xa1, - 0x65, 0x50, 0x9e, 0x26, 0x19, 0xbc, 0x6a, 0x77, 0xc6, 0x29, 0xb4, 0xb2, - 0xfb, 0xdd, 0xcd, 0x96, 0x53, 0x0f, 0x18, 0x88, 0xee, 0x1b, 0x4b, 0x2a, - 0x0d, 0xce, 0x10, 0xde, 0x67, 0xfa, 0x59, 0x7f, 0xfb, 0xef, 0x74, 0xc4, - 0x1e, 0x61, 0x70, 0xd6, 0x5f, 0xff, 0xa5, 0xa8, 0xde, 0xf3, 0x40, 0xfb, - 0x0c, 0x79, 0x96, 0x5f, 0xe6, 0xf7, 0xe1, 0xf2, 0x6c, 0x59, 0x53, 0x91, - 0xed, 0x83, 0xdf, 0x25, 0x69, 0x62, 0xff, 0xa3, 0xe8, 0xce, 0x71, 0x9f, - 0x2c, 0xbc, 0x65, 0x25, 0x95, 0x0d, 0x9f, 0xce, 0xc9, 0xd2, 0x9c, 0x55, - 0xc8, 0xc9, 0xce, 0x1a, 0x7b, 0xa6, 0x13, 0x24, 0x69, 0xa3, 0xb1, 0xe8, - 0x3c, 0xf2, 0x91, 0x47, 0xfd, 0xc8, 0x59, 0x82, 0x31, 0x56, 0x8f, 0xdb, - 0xce, 0xaf, 0xff, 0xf8, 0xfa, 0xfd, 0x89, 0x4f, 0xcf, 0xe2, 0x5c, 0x1f, - 0x63, 0x4b, 0x2f, 0xfc, 0x2c, 0x7c, 0x51, 0xde, 0x80, 0x2b, 0x2f, 0xfe, - 0xd4, 0x61, 0x64, 0x8f, 0xb9, 0xbd, 0x65, 0xff, 0xf1, 0x38, 0xbc, 0xcd, - 0xf1, 0xf7, 0xb8, 0x06, 0x2c, 0xa1, 0xa2, 0x58, 0x90, 0xef, 0xf1, 0x47, - 0xbe, 0x99, 0xd8, 0xb2, 0xed, 0xf8, 0xb2, 0x98, 0x79, 0x84, 0x69, 0x7f, - 0x13, 0x8b, 0xd7, 0x92, 0xcb, 0x9f, 0x4b, 0x2f, 0xc1, 0xc6, 0x47, 0x16, - 0x5e, 0x69, 0xa6, 0x92, 0x5e, 0x12, 0x3f, 0x49, 0x3c, 0xd0, 0x5f, 0xf3, - 0xc8, 0x4d, 0x66, 0xf7, 0xd2, 0xcb, 0xff, 0xf7, 0x72, 0x42, 0x11, 0x66, - 0xd3, 0x4a, 0x35, 0xb2, 0xca, 0x24, 0x49, 0xf8, 0xee, 0xff, 0x14, 0x8d, - 0x99, 0xf7, 0x96, 0x5f, 0x7c, 0x13, 0x25, 0x97, 0xbf, 0x89, 0x39, 0xea, - 0xf8, 0xce, 0xff, 0xbc, 0xe5, 0x9c, 0xd4, 0x71, 0x65, 0xf4, 0xa3, 0xff, - 0x96, 0x5f, 0xdf, 0xc1, 0x67, 0xde, 0x59, 0x73, 0xff, 0x38, 0xf4, 0x84, - 0x24, 0xbf, 0xfc, 0x21, 0x4c, 0x2b, 0x8f, 0xb8, 0x1c, 0xd2, 0xca, 0x34, - 0xce, 0x5c, 0xcc, 0xa1, 0x13, 0xc3, 0x1b, 0xdb, 0xe3, 0x4b, 0x2a, 0x4b, - 0xa5, 0x03, 0x68, 0xc8, 0x6b, 0x1b, 0x73, 0x08, 0x7a, 0x5a, 0xe2, 0xdf, - 0xa3, 0x94, 0x30, 0xfd, 0x1d, 0x86, 0xf4, 0x0b, 0x8f, 0x65, 0x97, 0xf8, - 0x82, 0x33, 0xdf, 0x03, 0x59, 0x43, 0x3c, 0xb0, 0x0b, 0xdb, 0xf5, 0x97, - 0xfd, 0x91, 0xbb, 0x3b, 0xaf, 0x9a, 0x59, 0x79, 0x87, 0x32, 0xcb, 0xf6, - 0x7f, 0xc8, 0x92, 0xcb, 0xf1, 0xb0, 0x63, 0xc5, 0x96, 0xfc, 0x8f, 0x3f, - 0x70, 0xa2, 0xff, 0xbd, 0xdc, 0xe4, 0xef, 0x1e, 0xcb, 0x2a, 0x0f, 0x9c, - 0xca, 0xef, 0xf8, 0x8c, 0x0d, 0xbe, 0x6e, 0x47, 0x96, 0x5e, 0x7d, 0x7e, - 0xb2, 0xa4, 0x9c, 0xec, 0xc2, 0x4c, 0x3c, 0xec, 0x34, 0xc8, 0x83, 0x70, - 0xfe, 0xfb, 0x3c, 0x26, 0xcb, 0x2f, 0x34, 0xd3, 0x49, 0x88, 0x40, 0xbe, - 0x0b, 0xb8, 0x53, 0x10, 0x81, 0x3c, 0xd7, 0x5f, 0x3e, 0xb1, 0xa5, 0x95, - 0xa3, 0xe3, 0xde, 0x83, 0x79, 0xa6, 0x9a, 0x4c, 0x41, 0xe5, 0x26, 0x20, - 0xf2, 0x79, 0xae, 0xbf, 0xbc, 0xec, 0x64, 0x31, 0x65, 0xfd, 0x9e, 0xe8, - 0x1e, 0x4b, 0x2f, 0x34, 0xd3, 0x4b, 0x2f, 0x72, 0x05, 0x49, 0x3c, 0xd0, - 0x56, 0x26, 0x4c, 0x15, 0x2f, 0x8a, 0xc8, 0xb7, 0xc9, 0xb5, 0xba, 0xa8, - 0x95, 0x91, 0xed, 0xde, 0x6a, 0x09, 0x65, 0xff, 0xdd, 0x89, 0x1f, 0xb3, - 0xa1, 0x86, 0x2c, 0xa8, 0x44, 0x6b, 0x97, 0x6f, 0x1c, 0xbf, 0xf7, 0x4c, - 0x70, 0x5e, 0xcf, 0xbc, 0xb2, 0xff, 0x14, 0x33, 0x9c, 0x01, 0x2c, 0xa0, - 0x9f, 0x87, 0x0f, 0xaf, 0xff, 0x67, 0x4f, 0x5d, 0x7c, 0xe1, 0xbe, 0xcb, - 0x2f, 0xfd, 0xb3, 0x31, 0x98, 0x5e, 0xc0, 0xac, 0xbe, 0x8f, 0x43, 0x16, - 0x57, 0xc8, 0xc9, 0x61, 0x11, 0x24, 0x78, 0xfa, 0xff, 0xbb, 0x04, 0x1f, - 0xb8, 0xfb, 0xab, 0x2f, 0xd2, 0x20, 0x6c, 0x4b, 0x2f, 0xe1, 0xf3, 0x19, - 0x1b, 0xab, 0x2f, 0x01, 0xc4, 0x59, 0x76, 0xdf, 0x2c, 0xb3, 0x8c, 0xdb, - 0x7e, 0x3b, 0x52, 0x47, 0x8f, 0xc7, 0x8e, 0x50, 0xd3, 0x35, 0xf1, 0x1c, - 0x0a, 0xb2, 0xf0, 0x91, 0xfa, 0xca, 0xd8, 0xdf, 0xb0, 0x86, 0xfc, 0x18, - 0xec, 0x31, 0x25, 0xf8, 0x9c, 0x8b, 0x12, 0x5d, 0x81, 0x49, 0x73, 0x4d, - 0x24, 0xac, 0x3f, 0xae, 0x13, 0xf8, 0x91, 0xa1, 0x6b, 0xfc, 0x42, 0x47, - 0xfd, 0xc6, 0xf4, 0x93, 0xcd, 0xe5, 0xff, 0xed, 0x87, 0xa7, 0x09, 0x66, - 0xfd, 0x1f, 0x16, 0x54, 0x2b, 0x18, 0xc8, 0xcb, 0x8d, 0xf5, 0xe1, 0xb0, - 0x04, 0x9b, 0xff, 0xa3, 0xfe, 0x66, 0x0d, 0xc9, 0xc5, 0x59, 0x7f, 0xc5, - 0xff, 0x5f, 0xde, 0x3f, 0xd6, 0x5f, 0xff, 0xba, 0x7b, 0xcc, 0x87, 0xc8, - 0xd1, 0xe7, 0xdc, 0x59, 0x7f, 0x14, 0x66, 0x9f, 0xf5, 0x97, 0xfe, 0x8d, - 0x76, 0x0f, 0xb0, 0x46, 0xb2, 0xe9, 0x73, 0x11, 0xee, 0x13, 0xaf, 0x2b, - 0x34, 0x59, 0x7f, 0xa0, 0xb1, 0x87, 0xf4, 0x96, 0x5f, 0xff, 0x70, 0xb3, - 0xef, 0xdf, 0x8f, 0xa3, 0xfb, 0xf5, 0x95, 0xf2, 0x33, 0x7c, 0x92, 0xd1, - 0x95, 0x75, 0x51, 0xcb, 0xca, 0x07, 0xbd, 0xbc, 0x46, 0x2c, 0xbf, 0xb8, - 0x20, 0xc0, 0x52, 0x59, 0x7f, 0x18, 0x47, 0x8f, 0xfa, 0xcb, 0xff, 0xf7, - 0xb9, 0xf4, 0xe1, 0xe0, 0xe1, 0xf5, 0x85, 0xfa, 0xcb, 0xff, 0xff, 0x4e, - 0xf4, 0xb3, 0xfd, 0xcc, 0x9c, 0x3c, 0x1c, 0x3e, 0xb0, 0xbf, 0x42, 0x17, - 0xff, 0x67, 0xa7, 0x07, 0xa7, 0xde, 0x9f, 0xea, 0x84, 0x2d, 0x52, 0x46, - 0x5f, 0x1d, 0xef, 0x46, 0xd3, 0xf8, 0x9a, 0x37, 0xa3, 0x23, 0xbf, 0x33, - 0x8d, 0x3f, 0xcb, 0x2d, 0xc1, 0x9f, 0x40, 0x87, 0xd7, 0xf6, 0x4d, 0x23, - 0xd7, 0x16, 0x5f, 0xd1, 0xf0, 0x9c, 0x8c, 0x59, 0x7f, 0x3e, 0xb4, 0xff, - 0xc2, 0xca, 0x86, 0x7e, 0xd0, 0xe1, 0xeb, 0x91, 0xdf, 0x9c, 0xb1, 0x2d, - 0x4e, 0x40, 0xbc, 0xa8, 0xcf, 0xca, 0xdb, 0x64, 0x04, 0x5f, 0xc8, 0xf6, - 0xfc, 0x52, 0x02, 0xe1, 0x0b, 0xaf, 0x34, 0xd3, 0x49, 0x2f, 0x39, 0x0d, - 0x24, 0xf3, 0x41, 0x7d, 0x9a, 0xcf, 0x2c, 0xaf, 0xcf, 0x3b, 0x85, 0xb7, - 0xdd, 0x37, 0x92, 0xcb, 0xff, 0xc2, 0x11, 0x66, 0xd1, 0xf4, 0xa5, 0x0c, - 0x59, 0x7f, 0x70, 0xf5, 0xa3, 0x62, 0xca, 0x91, 0xfc, 0x79, 0x2e, 0xf3, - 0x36, 0x1a, 0xca, 0x23, 0xc0, 0xf1, 0x15, 0xe9, 0xc2, 0xee, 0x2c, 0xbd, - 0xe7, 0x1a, 0xca, 0xd1, 0xbf, 0xe1, 0x1d, 0xfc, 0x18, 0xfc, 0xf4, 0x2a, - 0x4b, 0xf8, 0x4c, 0xd6, 0x64, 0xcb, 0x2f, 0xcf, 0xd9, 0xc3, 0x85, 0x95, - 0x25, 0x40, 0x63, 0x23, 0xc8, 0x6c, 0x9b, 0x01, 0x10, 0xf0, 0xbf, 0xc5, - 0xd7, 0xe7, 0xd6, 0xb3, 0xe5, 0x97, 0xff, 0xbd, 0xd3, 0x7f, 0xf3, 0x43, - 0x82, 0x92, 0xcb, 0xff, 0xdf, 0x4e, 0xfb, 0xf8, 0x20, 0xbe, 0xc4, 0xeb, - 0x2a, 0x11, 0x7f, 0x85, 0x04, 0x93, 0x7e, 0x8e, 0x08, 0x52, 0x59, 0x7d, - 0x38, 0x27, 0x25, 0x97, 0xfe, 0x0e, 0x6b, 0x0f, 0x9d, 0x8d, 0xeb, 0x2f, - 0xff, 0xfe, 0x73, 0xf1, 0xf4, 0x27, 0x3a, 0x47, 0xd7, 0x2f, 0x4b, 0x35, - 0x8b, 0x2f, 0x77, 0x1b, 0xd6, 0x57, 0x51, 0x1e, 0xee, 0x17, 0xfc, 0x51, - 0xf7, 0x23, 0xd0, 0x35, 0x97, 0xb8, 0x27, 0x27, 0x1e, 0xd6, 0x11, 0x50, - 0xd3, 0x82, 0xf8, 0x93, 0xd1, 0x94, 0x5f, 0xf6, 0xa2, 0x47, 0xe3, 0x29, - 0x2c, 0xbf, 0xff, 0xff, 0xe8, 0xe4, 0x7b, 0x6c, 0x6b, 0x59, 0xd7, 0x13, - 0x98, 0x2b, 0x97, 0xf0, 0x51, 0x37, 0x61, 0x65, 0xfb, 0x9d, 0x70, 0xc2, - 0xcb, 0xf3, 0xec, 0xd3, 0xc9, 0x65, 0x42, 0x63, 0x84, 0x6e, 0xd4, 0x25, - 0x44, 0x27, 0xbf, 0xee, 0x76, 0x1f, 0x5a, 0xcf, 0x96, 0x5f, 0xff, 0xf8, - 0x5f, 0xa5, 0xec, 0x2f, 0x72, 0x77, 0x39, 0x9a, 0xc2, 0x79, 0x2c, 0xac, - 0x45, 0x41, 0x9c, 0xdf, 0xfd, 0x3c, 0x65, 0x00, 0x0e, 0x0a, 0x7a, 0x59, - 0x76, 0x34, 0xb2, 0xd9, 0x07, 0xbb, 0xc4, 0x6b, 0xf7, 0x60, 0x9f, 0xab, - 0x2f, 0xed, 0xba, 0xfe, 0xd4, 0x2c, 0xbf, 0xc3, 0xec, 0x4c, 0xef, 0xf2, - 0xcb, 0xdd, 0xff, 0x7a, 0xca, 0xd1, 0xea, 0x37, 0x9a, 0x5f, 0x77, 0xe7, - 0xdd, 0x59, 0x52, 0x4c, 0x64, 0x64, 0xda, 0x26, 0x78, 0x41, 0x11, 0x2d, - 0xff, 0xd9, 0xaf, 0xd8, 0x7c, 0x13, 0x91, 0x8b, 0x2f, 0xc3, 0xd4, 0x7d, - 0xba, 0xb2, 0xff, 0xe1, 0x5a, 0x8d, 0x76, 0x0d, 0xfd, 0xc5, 0x97, 0xff, - 0xfe, 0xf4, 0x6b, 0xf0, 0xf4, 0xe4, 0x7a, 0x7f, 0xfc, 0x50, 0xce, 0x2c, - 0xbb, 0x77, 0x8b, 0x28, 0x54, 0x43, 0xbb, 0x6d, 0x49, 0x36, 0x0c, 0x45, - 0x32, 0xc7, 0x86, 0x65, 0xe6, 0xe8, 0xbf, 0x59, 0x7f, 0x4b, 0x51, 0x27, - 0xd2, 0xcb, 0xb1, 0x8b, 0x2f, 0xfe, 0xc2, 0xfe, 0x70, 0x9a, 0xfd, 0x87, - 0xc5, 0x94, 0x33, 0xdf, 0x60, 0xb5, 0xf7, 0xfe, 0xcf, 0xd6, 0x5f, 0xa3, - 0x9c, 0x3d, 0xeb, 0x2b, 0xe4, 0x7d, 0x9c, 0x23, 0x34, 0x45, 0xd2, 0x4b, - 0xdb, 0x9f, 0x42, 0xcb, 0xfe, 0x0f, 0x4a, 0x3e, 0x38, 0xea, 0xca, 0x86, - 0x53, 0xcc, 0xa3, 0x27, 0x19, 0x6e, 0x47, 0x54, 0x71, 0xaa, 0x6a, 0x1d, - 0x6f, 0x1c, 0xb9, 0x47, 0x5d, 0xc4, 0x00, 0x46, 0x3b, 0xb8, 0x84, 0x21, - 0x05, 0xff, 0x9c, 0xc6, 0x0f, 0x73, 0x6c, 0x69, 0x65, 0xcd, 0xd1, 0x2c, - 0xbf, 0x73, 0x05, 0x8e, 0x2c, 0xbf, 0xa3, 0xe6, 0x39, 0x7e, 0xb2, 0xfe, - 0xdd, 0xe1, 0x97, 0xd2, 0x59, 0x7f, 0xe7, 0xd6, 0xe1, 0xf7, 0x1f, 0xef, - 0xd6, 0x5f, 0xff, 0x8f, 0xd0, 0xcc, 0xfb, 0xd0, 0xc1, 0x34, 0xff, 0xac, - 0xbe, 0x32, 0x71, 0xac, 0xbf, 0xee, 0x46, 0xbd, 0x13, 0xc6, 0x6b, 0x2a, - 0x48, 0xb1, 0x1a, 0xbf, 0x08, 0x2f, 0xff, 0xec, 0xec, 0xec, 0x61, 0xf6, - 0x27, 0x73, 0x98, 0x5f, 0xac, 0xbf, 0xf8, 0xf5, 0x12, 0xec, 0x4c, 0x40, - 0x15, 0x65, 0x75, 0x14, 0x7c, 0x5e, 0xb8, 0x3b, 0x8b, 0x2f, 0xe1, 0x7d, - 0x1d, 0x8e, 0x2c, 0xbf, 0xee, 0x16, 0x7b, 0x91, 0xad, 0x96, 0x5f, 0xdd, - 0x3f, 0xb8, 0xff, 0x2c, 0xbf, 0xd8, 0x3c, 0xd4, 0xa3, 0x4b, 0x2f, 0x74, - 0xfc, 0xb2, 0xa4, 0x8f, 0xe3, 0x1a, 0x98, 0xbb, 0xf3, 0x9e, 0x17, 0x88, - 0x65, 0x7f, 0xf6, 0x39, 0x6c, 0xd6, 0x10, 0xfb, 0x0b, 0x2f, 0x06, 0x37, - 0x56, 0x5f, 0xe9, 0xba, 0xfa, 0xd1, 0x8d, 0x65, 0x61, 0xe9, 0xb8, 0xfd, - 0xff, 0x13, 0xfc, 0x26, 0x8d, 0x98, 0xb2, 0xf8, 0xfa, 0xec, 0x59, 0x7f, - 0xc4, 0x59, 0xb7, 0xbd, 0x0c, 0x59, 0x53, 0x26, 0x90, 0x50, 0x96, 0xe1, - 0x07, 0x8e, 0x44, 0x21, 0xbf, 0x6b, 0x38, 0x6d, 0x2c, 0xbd, 0x0d, 0xc5, - 0xd6, 0x5f, 0xc2, 0x40, 0x02, 0x06, 0x2c, 0xb8, 0xc9, 0x65, 0xf4, 0xa0, - 0x82, 0xb2, 0x86, 0x6d, 0xb0, 0x56, 0xd3, 0x2c, 0xbe, 0x6c, 0x3c, 0x7c, - 0xb2, 0xd0, 0x46, 0xe3, 0xc2, 0x55, 0x38, 0xff, 0x4d, 0x62, 0xfa, 0x3f, - 0xc2, 0x59, 0x52, 0x5e, 0xcf, 0x19, 0x46, 0x17, 0x04, 0xc4, 0xe1, 0xe7, - 0x34, 0x34, 0xf5, 0x19, 0x0b, 0x23, 0xa1, 0x75, 0x1e, 0x14, 0x00, 0x85, - 0xa8, 0x71, 0x6e, 0x11, 0xdf, 0x31, 0xb4, 0x6e, 0x2d, 0xca, 0xcb, 0xbd, - 0xc5, 0x94, 0x67, 0x95, 0x31, 0x9d, 0xf0, 0x90, 0xd7, 0x16, 0x5d, 0xff, - 0x96, 0x5d, 0xff, 0x56, 0x5f, 0x6b, 0x59, 0xc5, 0x97, 0x64, 0xcb, 0x2d, - 0x29, 0xc8, 0x8d, 0xd8, 0x91, 0x83, 0x0e, 0x30, 0x21, 0x15, 0xf8, 0xfc, - 0xe5, 0x8b, 0x2f, 0xda, 0x1e, 0x61, 0x2c, 0xbf, 0xfb, 0x74, 0xf3, 0xb1, - 0xbf, 0x9d, 0x8f, 0x96, 0x5f, 0xdf, 0x68, 0x1f, 0x7a, 0x4b, 0x29, 0xd1, - 0x41, 0xc2, 0x60, 0x24, 0xdf, 0x9a, 0xf7, 0xb3, 0x65, 0x94, 0xb2, 0xff, - 0x16, 0xb3, 0x98, 0x7d, 0x59, 0x4d, 0x83, 0x79, 0x81, 0x77, 0xff, 0xd2, - 0xf1, 0x63, 0xf8, 0xb3, 0xde, 0xc6, 0x96, 0x5e, 0x93, 0xb7, 0xac, 0xbf, - 0xfe, 0xc1, 0x9f, 0xb1, 0x9d, 0x88, 0x0b, 0x1d, 0x65, 0xd9, 0xbd, 0x65, - 0xff, 0x07, 0xb8, 0x36, 0x1e, 0xb1, 0x65, 0x42, 0x27, 0x76, 0x4d, 0xc1, - 0x8b, 0xfa, 0x23, 0x5d, 0x8d, 0xeb, 0x2f, 0xdf, 0x99, 0x4d, 0xba, 0xb2, - 0xff, 0xf7, 0xb9, 0x93, 0x76, 0x37, 0xe7, 0x7b, 0x0b, 0x2f, 0xee, 0x8c, - 0xf7, 0xc0, 0xd6, 0x56, 0x1f, 0xdb, 0xa6, 0x5f, 0x70, 0xf3, 0xf5, 0x97, - 0xf8, 0xc1, 0xae, 0xe6, 0xfe, 0x2c, 0xbf, 0xff, 0xd9, 0xe3, 0xfa, 0x45, - 0x13, 0xbc, 0x78, 0xde, 0x3e, 0xe2, 0xcb, 0xec, 0xf1, 0xf1, 0x65, 0xfc, - 0xdd, 0x4c, 0x4d, 0xce, 0xc0, 0x59, 0x5b, 0xa8, 0xf4, 0x98, 0xd7, 0x8c, - 0x9e, 0x21, 0xbf, 0xf0, 0x1d, 0x9c, 0x32, 0x7d, 0x0a, 0xb2, 0xa4, 0xba, - 0x82, 0x38, 0x62, 0xe1, 0x78, 0x59, 0xbe, 0x24, 0x99, 0x3b, 0x50, 0xbc, - 0xe9, 0x7f, 0xe5, 0xc5, 0x0a, 0x7e, 0x10, 0x7a, 0x31, 0x66, 0x90, 0x6f, - 0xff, 0xde, 0x3e, 0x6d, 0x8d, 0x70, 0xf6, 0x27, 0xfb, 0xcb, 0x2f, 0x35, - 0x9d, 0x59, 0x7f, 0x14, 0x9a, 0x7e, 0xf1, 0x65, 0xf8, 0x5e, 0xb9, 0x1a, - 0xcb, 0x73, 0x0f, 0x54, 0xcb, 0xaf, 0xdb, 0x0c, 0x9c, 0x55, 0x97, 0xc7, - 0xcc, 0x1e, 0x26, 0x32, 0xeb, 0x1e, 0x72, 0x10, 0x9a, 0xff, 0xcf, 0xbb, - 0xf8, 0x38, 0x65, 0xf4, 0x96, 0x5f, 0xe1, 0xe1, 0x1b, 0x5d, 0x02, 0xcb, - 0xff, 0xee, 0x9c, 0x78, 0xff, 0x89, 0x4f, 0x69, 0xa6, 0x92, 0x5f, 0xfc, - 0x71, 0xef, 0xe2, 0x53, 0xda, 0x69, 0xa4, 0x95, 0x88, 0x9f, 0xea, 0xad, - 0x6c, 0x8f, 0x4f, 0x43, 0x4a, 0xff, 0x74, 0x0e, 0xc1, 0xbb, 0x16, 0x51, - 0x1e, 0xe7, 0x8a, 0x6f, 0x87, 0x98, 0x2a, 0x4b, 0xe7, 0xfd, 0xfc, 0xb2, - 0xff, 0xb4, 0xe1, 0x9d, 0xd8, 0x10, 0x96, 0x5e, 0x04, 0x69, 0x65, 0xde, - 0xe0, 0xcf, 0x5e, 0x63, 0xbb, 0xd2, 0x20, 0x2a, 0x21, 0x95, 0xee, 0xc6, - 0xcb, 0x2f, 0xde, 0x89, 0x0a, 0xc5, 0x97, 0x9a, 0x69, 0xa4, 0x97, 0xb0, - 0x82, 0x92, 0x79, 0xa0, 0xbf, 0xf6, 0x6d, 0x83, 0x79, 0x14, 0x6c, 0xb2, - 0xa1, 0x16, 0x9f, 0xa4, 0x91, 0x6d, 0xfb, 0xdd, 0x72, 0x15, 0x65, 0xfd, - 0xf4, 0xb8, 0x4e, 0x15, 0x97, 0x89, 0xb5, 0xb6, 0x56, 0x56, 0x1e, 0xa3, - 0x97, 0x5c, 0xda, 0xdb, 0x5a, 0xcb, 0xf6, 0x7b, 0xc0, 0xd9, 0x65, 0xff, - 0x8f, 0x6e, 0x9b, 0xcb, 0xc7, 0xb2, 0xcb, 0x49, 0xb5, 0xa2, 0x2c, 0x88, - 0xfc, 0x53, 0x79, 0xf7, 0x61, 0x65, 0xfb, 0x07, 0xd7, 0xdd, 0x59, 0x7e, - 0x2c, 0x1c, 0x31, 0x65, 0x42, 0xbe, 0x4d, 0x88, 0x46, 0x45, 0x8f, 0x3f, - 0x17, 0xcc, 0x53, 0xa8, 0x68, 0xb0, 0xbf, 0xaf, 0x8f, 0x0a, 0xb0, 0x1d, - 0xef, 0x1e, 0x68, 0xaa, 0xfe, 0x66, 0x1e, 0xa6, 0x92, 0xcb, 0xff, 0xe1, - 0x44, 0x72, 0xeb, 0xcb, 0x98, 0xc8, 0xdd, 0x59, 0x50, 0x88, 0x13, 0x2e, - 0xbd, 0xe3, 0x85, 0x97, 0x61, 0x2c, 0xa3, 0x36, 0x00, 0x1b, 0xbf, 0x14, - 0x7d, 0x1c, 0x59, 0x7f, 0xec, 0x32, 0x7f, 0x71, 0xa8, 0x25, 0x97, 0xba, - 0xfa, 0x83, 0xe3, 0xe1, 0x3d, 0xf1, 0xea, 0x3c, 0xb2, 0xfb, 0x99, 0x12, - 0x59, 0x43, 0x3c, 0x22, 0x21, 0xbf, 0x44, 0xbb, 0x9f, 0x2c, 0xbe, 0x91, - 0xc0, 0x56, 0x5d, 0xf7, 0xeb, 0x2f, 0xe6, 0x47, 0x3f, 0x30, 0xac, 0xbd, - 0xc8, 0x17, 0xf3, 0xc7, 0xe0, 0xcd, 0xfe, 0x06, 0x6b, 0xff, 0xcc, 0x96, - 0x5b, 0x8b, 0x2e, 0x6e, 0x76, 0x59, 0x52, 0x35, 0xce, 0x23, 0x7f, 0xec, - 0x61, 0x8f, 0x58, 0x37, 0x62, 0xcb, 0xec, 0x60, 0x83, 0x59, 0x5d, 0x3e, - 0x02, 0x3d, 0xbf, 0xf7, 0x44, 0xe6, 0x68, 0x2e, 0xe1, 0x54, 0x41, 0x8b, - 0xff, 0xb6, 0x81, 0x73, 0x5e, 0xf4, 0x67, 0x16, 0x58, 0xc6, 0x89, 0x12, - 0x4c, 0xbf, 0xf7, 0x40, 0xe2, 0xe7, 0xbd, 0x9d, 0x59, 0x7f, 0xee, 0x7e, - 0xff, 0x70, 0x4d, 0x75, 0xd6, 0x5f, 0x03, 0xb8, 0x15, 0x95, 0x24, 0x65, - 0x0c, 0x9f, 0xc7, 0xfb, 0x88, 0x57, 0xfd, 0xce, 0x46, 0xa4, 0x13, 0xd9, - 0x65, 0xfc, 0x01, 0x4b, 0x36, 0x02, 0xca, 0x83, 0xe9, 0xe9, 0xd5, 0xee, - 0x83, 0x75, 0x65, 0xff, 0xed, 0x3e, 0xfc, 0x20, 0xf4, 0xff, 0x13, 0xcb, - 0x2a, 0x13, 0x37, 0x94, 0x2a, 0x5b, 0x64, 0x20, 0x20, 0xaf, 0x97, 0x04, - 0x3a, 0x6a, 0x4c, 0x5c, 0x84, 0x07, 0xa5, 0x59, 0xdf, 0xbc, 0x61, 0x31, - 0xac, 0xbe, 0x8f, 0x1c, 0xcb, 0x2f, 0xe0, 0x38, 0x80, 0x71, 0x16, 0x54, - 0xc7, 0xa3, 0xa2, 0x2b, 0xb7, 0xe2, 0xca, 0xc3, 0x76, 0xe4, 0x77, 0x7f, - 0xfa, 0xcb, 0xfe, 0x0f, 0x4f, 0x44, 0x7e, 0xe2, 0xca, 0x61, 0xe8, 0xfe, - 0x33, 0x7f, 0xbf, 0x3e, 0xf7, 0x3f, 0x75, 0x97, 0xfb, 0x87, 0x85, 0x9f, - 0x34, 0xb2, 0xff, 0xff, 0x67, 0xbc, 0xfa, 0x28, 0xfa, 0x42, 0x6b, 0xf6, - 0x1f, 0x16, 0x56, 0xea, 0x25, 0x98, 0x67, 0x7e, 0x07, 0xc1, 0xc6, 0x2c, - 0xbf, 0xe6, 0x1b, 0x58, 0x43, 0xec, 0x2c, 0xbb, 0xa0, 0x59, 0x7f, 0xfe, - 0x91, 0x90, 0xfb, 0x9f, 0x08, 0xe5, 0xe2, 0x1a, 0xcb, 0xfd, 0x83, 0xee, - 0x7d, 0x9c, 0x59, 0x78, 0xda, 0xdd, 0x59, 0x7f, 0xb3, 0x7f, 0x3d, 0xe8, - 0x62, 0xca, 0xd1, 0xea, 0xf4, 0x82, 0xa1, 0x39, 0xd1, 0x93, 0x61, 0x49, - 0x9c, 0x4c, 0x2e, 0x4a, 0xbc, 0x84, 0x45, 0xcd, 0x1a, 0xcb, 0xf3, 0x03, - 0x84, 0x15, 0x95, 0x06, 0xf8, 0xc5, 0xef, 0xfe, 0x7d, 0xb8, 0xe3, 0x8d, - 0xa2, 0x50, 0xb2, 0xfe, 0xce, 0x6e, 0x66, 0xa1, 0x65, 0x69, 0x12, 0x5c, - 0x1f, 0xdc, 0x44, 0xbe, 0x38, 0x29, 0x96, 0x54, 0x99, 0x69, 0x23, 0x84, - 0x1e, 0x3a, 0x04, 0x87, 0xe2, 0x83, 0x9c, 0x78, 0x99, 0x65, 0x90, 0xb3, - 0x77, 0x0f, 0xc8, 0xf9, 0x29, 0x9f, 0xd1, 0x9b, 0xb4, 0x67, 0x7f, 0xb9, - 0xcc, 0x2f, 0xf7, 0x31, 0x65, 0xf1, 0x1b, 0x7c, 0x2c, 0xbe, 0x10, 0xb3, - 0x8b, 0x2d, 0x32, 0xcb, 0xfb, 0x98, 0x5f, 0xee, 0x62, 0xca, 0x9c, 0x8b, - 0xdc, 0x36, 0x72, 0x3f, 0xc8, 0xb8, 0x25, 0x7d, 0xe7, 0x72, 0x59, 0x5b, - 0xcf, 0xad, 0xa4, 0xbb, 0xfe, 0x07, 0xbf, 0x03, 0x23, 0x3c, 0xb2, 0xff, - 0xf1, 0x6d, 0x3a, 0x63, 0x2c, 0x1e, 0x10, 0xab, 0x2f, 0xe3, 0xf9, 0xbf, - 0xb1, 0xe5, 0x97, 0xe0, 0x70, 0xcf, 0xe5, 0x97, 0x84, 0xc8, 0x59, 0x7f, - 0xb0, 0x7a, 0x70, 0xfb, 0xf5, 0x97, 0xec, 0x21, 0xf6, 0x16, 0x57, 0x4f, - 0x69, 0xa3, 0x4a, 0x84, 0xcf, 0xb7, 0x53, 0x26, 0x31, 0x72, 0x8e, 0x3b, - 0x5f, 0xff, 0xec, 0x27, 0xf7, 0x33, 0x5f, 0xff, 0x19, 0xf7, 0xb8, 0x6b, - 0x2e, 0xcd, 0xc5, 0x96, 0x71, 0x9f, 0xd7, 0x98, 0x6f, 0x46, 0xa6, 0x59, - 0x53, 0x9d, 0x3d, 0xd3, 0x76, 0x81, 0x13, 0xdd, 0x5b, 0x46, 0x38, 0x38, - 0x57, 0xe4, 0xec, 0xa0, 0x63, 0xe5, 0xf9, 0x4c, 0xe7, 0x5d, 0xfb, 0x1a, - 0x13, 0xd2, 0xe6, 0xbf, 0x8f, 0xf8, 0x89, 0x41, 0x1b, 0xc3, 0x50, 0xc7, - 0xdc, 0x27, 0xbd, 0xf6, 0xdb, 0xd6, 0x5f, 0x83, 0xd8, 0xf9, 0xbd, 0x65, - 0xc0, 0x6d, 0xac, 0xbf, 0x75, 0xf4, 0xc3, 0x59, 0x7f, 0x08, 0x1e, 0xc7, - 0xcd, 0xeb, 0x2a, 0x72, 0x28, 0x64, 0x58, 0x11, 0xb0, 0x13, 0xde, 0x9d, - 0xfb, 0x4b, 0x2b, 0xe3, 0xe0, 0xf1, 0xfd, 0xfd, 0x8d, 0x66, 0x10, 0xab, - 0x2f, 0x3e, 0x71, 0x65, 0xf9, 0xf6, 0x30, 0x49, 0x65, 0xef, 0xff, 0x85, - 0x94, 0xc3, 0xe1, 0xe8, 0xd9, 0x14, 0x51, 0xa2, 0xf1, 0xe1, 0x1d, 0x7f, - 0xfc, 0x18, 0xe7, 0x21, 0x99, 0xe3, 0xe7, 0x5d, 0x65, 0xfe, 0x22, 0x89, - 0x32, 0x0d, 0x65, 0xfb, 0x37, 0x96, 0x71, 0x65, 0xfe, 0xf1, 0xef, 0x3f, - 0x4a, 0x12, 0x59, 0x8b, 0x2f, 0xec, 0x21, 0x75, 0x13, 0xcc, 0xf1, 0x44, - 0x34, 0xac, 0x4c, 0xc4, 0xd3, 0x88, 0xc3, 0x8d, 0xb7, 0x81, 0xf4, 0x96, - 0x5f, 0x4b, 0x4f, 0xbd, 0x65, 0x68, 0xf0, 0x88, 0x7a, 0xff, 0x14, 0x8b, - 0x19, 0x01, 0x59, 0x7e, 0x3e, 0x94, 0x49, 0x65, 0xe7, 0xe1, 0xac, 0xb6, - 0x2c, 0xbd, 0x98, 0x2a, 0xcb, 0x30, 0x66, 0xb1, 0xbc, 0x42, 0xa1, 0x1d, - 0x38, 0x43, 0xa3, 0x1e, 0x93, 0x3a, 0x3d, 0xff, 0x1e, 0xfc, 0xd0, 0x5d, - 0xc2, 0xa8, 0xc3, 0x57, 0xb7, 0x01, 0xe5, 0x97, 0x1e, 0xf5, 0x97, 0xcf, - 0xa7, 0x11, 0x65, 0xd8, 0x2a, 0xcb, 0xff, 0xa1, 0x86, 0x3c, 0x21, 0x7b, - 0x0c, 0x59, 0x5d, 0x3d, 0xaf, 0x0b, 0xd0, 0xd3, 0x1c, 0x0a, 0x33, 0x08, - 0x38, 0x31, 0xe7, 0xcb, 0xc2, 0x89, 0xd5, 0x97, 0xff, 0xc7, 0xee, 0xc7, - 0x23, 0xb0, 0x7b, 0x40, 0xab, 0x2f, 0xf7, 0x62, 0x69, 0x1e, 0xa4, 0xb2, - 0xff, 0x78, 0xda, 0x98, 0x9d, 0xa5, 0x97, 0xfd, 0x9b, 0xe0, 0x7d, 0xc3, - 0xf2, 0xcb, 0xdc, 0x7f, 0xd6, 0x5b, 0xc4, 0x7a, 0xde, 0x39, 0xbf, 0x43, - 0x3d, 0x81, 0x59, 0x7e, 0x89, 0x7e, 0x58, 0xb2, 0xe3, 0xd9, 0x65, 0x42, - 0x73, 0x43, 0x4f, 0xf8, 0xd0, 0xe1, 0x17, 0xd2, 0x72, 0x27, 0xf1, 0x3d, - 0xf9, 0xa3, 0x1b, 0x79, 0xac, 0xbf, 0xee, 0xc4, 0x8c, 0xb1, 0x90, 0xb2, - 0xff, 0xb3, 0xdd, 0xc6, 0x13, 0xf9, 0x65, 0xfd, 0xbc, 0xf5, 0xf4, 0x6e, - 0xac, 0xb1, 0x0c, 0xfa, 0xb0, 0xde, 0xfc, 0xc8, 0x0e, 0xc3, 0x59, 0x7d, - 0x28, 0x63, 0xac, 0xbf, 0x6b, 0xf6, 0x1f, 0x16, 0x5d, 0xee, 0x61, 0xf9, - 0xb9, 0x48, 0x84, 0x35, 0x08, 0xd3, 0x04, 0x26, 0x6d, 0xc5, 0x97, 0xf4, - 0x6d, 0x84, 0x62, 0xac, 0xad, 0x1b, 0xee, 0x08, 0xdf, 0xfd, 0x04, 0xfd, - 0x8f, 0xe7, 0xeb, 0x9c, 0x49, 0x7b, 0x03, 0x0b, 0x2b, 0x65, 0x4b, 0x43, - 0x8d, 0xcf, 0x19, 0x58, 0x43, 0xbd, 0x1a, 0xfc, 0xf3, 0x1e, 0x71, 0x65, - 0xf7, 0x23, 0x52, 0x59, 0x73, 0x8e, 0x71, 0xe4, 0xf0, 0x9e, 0xe0, 0x6c, - 0xb2, 0xff, 0x7d, 0x2f, 0xb8, 0x7e, 0x85, 0x97, 0x8f, 0xee, 0x2c, 0xac, - 0x3d, 0x23, 0x35, 0xa3, 0x44, 0x57, 0x5a, 0xae, 0xc0, 0xac, 0xbd, 0xac, - 0xe2, 0xcf, 0x16, 0xd7, 0xff, 0xc3, 0x9c, 0xe7, 0x9c, 0x8d, 0xb0, 0x8c, - 0x55, 0x97, 0xfb, 0x4c, 0x8f, 0xbc, 0xe1, 0x59, 0x7f, 0xff, 0x16, 0x7b, - 0xb9, 0x2c, 0x0c, 0x07, 0xc4, 0xec, 0x59, 0x58, 0x8d, 0xc3, 0x50, 0xe1, - 0xa5, 0xf1, 0xb2, 0x26, 0x59, 0x7f, 0xf7, 0x0f, 0xe2, 0xc9, 0xb5, 0x1e, - 0xe2, 0xcb, 0xec, 0xd8, 0x12, 0x59, 0x53, 0x22, 0x2b, 0xf2, 0x26, 0x91, - 0x6f, 0xf7, 0x22, 0x4f, 0xb3, 0xb1, 0x65, 0xfd, 0xfe, 0xcf, 0x28, 0xdd, - 0x59, 0x78, 0x63, 0x85, 0x95, 0xf1, 0xe7, 0x00, 0xca, 0xa1, 0x1a, 0xe6, - 0x66, 0xf0, 0x81, 0xbb, 0x1a, 0x59, 0x49, 0xc4, 0x30, 0xbf, 0xb8, 0x24, - 0x6a, 0x18, 0x9c, 0x43, 0x0a, 0x4e, 0x21, 0x85, 0x27, 0x10, 0xc2, 0x93, - 0x88, 0x61, 0x49, 0xc4, 0x30, 0xa9, 0x22, 0xe4, 0xc6, 0x7f, 0x3c, 0x00, - 0xce, 0xe0, 0xcb, 0x78, 0xcd, 0xdd, 0xc4, 0xe2, 0x18, 0x5f, 0xce, 0xfe, - 0x9a, 0x18, 0x9c, 0x43, 0x09, 0xc6, 0x92, 0xcd, 0xb4, 0xe2, 0x18, 0x52, - 0x71, 0x0c, 0x29, 0x38, 0x86, 0x15, 0x23, 0x64, 0x63, 0x34, 0x9c, 0x43, - 0x0a, 0x4e, 0x21, 0x85, 0x27, 0x10, 0xc2, 0x93, 0x88, 0x61, 0x49, 0xc4, - 0x30, 0xa4, 0xe2, 0x18, 0x56, 0xc8, 0x96, 0x18, 0xc9, 0x8c, 0xfe, 0x33, - 0xc1, 0x9d, 0xe3, 0x34, 0x9c, 0x43, 0x0a, 0x4e, 0x21, 0x85, 0x48, 0xd9, - 0x70, 0x66, 0x93, 0x88, 0x61, 0x49, 0xc4, 0x30, 0xa4, 0xe2, 0x18, 0x52, - 0x71, 0x0c, 0x2a, 0x47, 0xc9, 0xf8, 0xcf, 0x86, 0x5b, 0xc6, 0x69, 0x38, - 0x86, 0x14, 0x9c, 0x43, 0x0a, 0x4e, 0x21, 0x85, 0x27, 0x10, 0xc2, 0xb6, - 0x3e, 0x41, 0x46, 0x74, 0x33, 0xd1, 0x9b, 0x0a, 0x9c, 0x43, 0x0a, 0x4e, - 0x21, 0x85, 0x27, 0x10, 0xc2, 0x93, 0x88, 0x61, 0x49, 0xc4, 0x30, 0xa1, - 0x9f, 0x27, 0xc3, 0x3f, 0x8c, 0x80, 0x66, 0x93, 0x88, 0x61, 0x49, 0xc4, - 0x30, 0xa4, 0xe2, 0x18, 0x5f, 0xbb, 0x1f, 0xf3, 0x13, 0x88, 0x61, 0x49, - 0xc4, 0x30, 0xa9, 0x22, 0x68, 0x23, 0x3d, 0x19, 0x71, 0x9f, 0xcd, 0xac, - 0x14, 0xe2, 0x18, 0x52, 0x71, 0x0c, 0x29, 0x38, 0x86, 0x14, 0x9c, 0x43, - 0x0a, 0x4e, 0x21, 0x85, 0x48, 0xf9, 0x3e, 0x19, 0x31, 0x9d, 0xe3, 0x34, - 0x9c, 0x43, 0x0a, 0x4e, 0x21, 0x85, 0x27, 0x10, 0xc2, 0x93, 0x88, 0x61, - 0x52, 0x3e, 0x41, 0x8c, 0xf4, 0x64, 0x86, 0x6d, 0xd4, 0xe2, 0x18, 0x52, - 0x71, 0x0c, 0x29, 0x38, 0x86, 0x16, 0x92, 0x71, 0x0c, 0x29, 0x38, 0x86, - 0x1f, 0x17, 0xf4, 0x9c, 0x43, 0x0a, 0x4e, 0x21, 0x85, 0x27, 0x10, 0xc2, - 0x93, 0x88, 0x61, 0x5b, 0x23, 0x7a, 0x43, 0x22, 0x9c, 0x04, 0xa6, 0x61, - 0x9f, 0xc6, 0x7c, 0x33, 0x6c, 0x4e, 0x21, 0x85, 0x27, 0x10, 0xc2, 0x93, - 0x88, 0x61, 0x69, 0x27, 0x10, 0xc2, 0x93, 0x88, 0x61, 0xf1, 0x7f, 0x49, - 0xc4, 0x30, 0xa4, 0xe2, 0x18, 0x54, 0x22, 0xb2, 0x43, 0x26, 0x71, 0xa2, - 0x96, 0x0c, 0xd2, 0x71, 0x0c, 0x29, 0x38, 0x86, 0x14, 0x9c, 0x43, 0x0a, - 0x4e, 0x21, 0x85, 0x27, 0x10, 0xc2, 0xa0, 0xff, 0x7e, 0x19, 0xd0, 0xcb, - 0x06, 0x48, 0x66, 0x93, 0x88, 0x61, 0x49, 0xc4, 0x30, 0xa4, 0xe2, 0x18, - 0x56, 0x8f, 0x2f, 0x83, 0x3e, 0x19, 0xa4, 0xe2, 0x18, 0x52, 0x71, 0x0c, - 0x29, 0x38, 0x86, 0x14, 0xc3, 0xcb, 0x21, 0x9f, 0x0c, 0xd9, 0x89, 0xc4, - 0x30, 0xa4, 0xe2, 0x18, 0x52, 0x71, 0x0c, 0x2b, 0xf3, 0x64, 0x01, 0x9a, - 0x4e, 0x21, 0x85, 0x27, 0x10, 0xc2, 0x93, 0x88, 0x61, 0x49, 0xc4, 0x30, - 0xa8, 0x3e, 0x49, 0x86, 0x7a, 0x32, 0x01, 0x9a, 0x86, 0x60, 0xa6, 0xd0, - 0x81, 0x92, 0x68, 0xd5, 0x72, 0x16, 0xc1, 0x84, 0x67, 0xd0, 0x85, 0x38, - 0x52, 0x6e, 0x9f, 0x4d, 0x08, 0x4d, 0x43, 0x61, 0x89, 0x5d, 0x84, 0x1b, - 0xc2, 0x8b, 0xf3, 0xb2, 0x87, 0xef, 0x1a, 0x3d, 0x0c, 0xa0, 0x43, 0x17, - 0x7c, 0x24, 0xda, 0x7a, 0xdc, 0x2e, 0x11, 0x45, 0xbe, 0x10, 0xd7, 0xe9, - 0x14, 0x67, 0x13, 0x88, 0x61, 0x3d, 0x39, 0x7b, 0xc7, 0x0c, 0x4e, 0x21, - 0x85, 0xf1, 0x85, 0xf4, 0xbc, 0x43, 0x17, 0x8c, 0x78, 0xbc, 0x43, 0x16, - 0x9f, 0xf2, 0x32, 0x34, 0x93, 0xd2, 0x9f, 0x17, 0x5a, 0x37, 0xb3, 0xe2, - 0x44, 0xa7, 0xa1, 0xde, 0x32, 0xd9, 0x65, 0xfc, 0x6d, 0x0f, 0x51, 0xb2, - 0xca, 0x91, 0xe5, 0xf4, 0x72, 0xe7, 0xf9, 0x65, 0xf4, 0x6e, 0x47, 0x96, - 0x5e, 0x3d, 0xed, 0xb5, 0x95, 0xf2, 0x60, 0x53, 0x42, 0x0f, 0xa4, 0x44, - 0x2f, 0xe2, 0x4b, 0xf6, 0x64, 0xce, 0x22, 0xcb, 0xfc, 0xe4, 0x24, 0xd2, - 0x32, 0x59, 0x77, 0xf0, 0xb2, 0xfe, 0xd3, 0x90, 0x91, 0xfa, 0xcb, 0x9f, - 0x4b, 0x2c, 0x6b, 0x02, 0x5b, 0x58, 0x2b, 0x2c, 0xc5, 0x96, 0x9e, 0x68, - 0x9c, 0xd0, 0xbf, 0x51, 0x1c, 0x7c, 0x41, 0x1a, 0x62, 0x64, 0x1b, 0x90, - 0xcf, 0xbf, 0xee, 0xc3, 0x32, 0x68, 0x2d, 0x96, 0x5f, 0xfd, 0x39, 0xc2, - 0x3e, 0xc7, 0xf8, 0x5f, 0xac, 0xbb, 0xf8, 0x59, 0x58, 0x7b, 0xdf, 0xa3, - 0xd6, 0x23, 0x97, 0xf2, 0xc0, 0x42, 0x5e, 0xff, 0xe2, 0x28, 0xd8, 0xb0, - 0xf7, 0xc6, 0xe2, 0xcb, 0xd1, 0xf7, 0x16, 0x53, 0x9f, 0x1f, 0x11, 0xaf, - 0x3e, 0xa1, 0x65, 0xf8, 0xf7, 0x1c, 0xbf, 0x59, 0x7e, 0x3f, 0xb8, 0xff, - 0x2c, 0xa9, 0x1f, 0x73, 0x06, 0xf8, 0x55, 0x7d, 0xbd, 0x90, 0x6b, 0x2f, - 0xf8, 0x47, 0x1f, 0x31, 0x91, 0xba, 0xb2, 0xf6, 0x7c, 0xd2, 0xcb, 0xbf, - 0xcd, 0x1e, 0xd1, 0x1e, 0x5f, 0xfe, 0x3d, 0xd0, 0x0a, 0x7f, 0x73, 0x26, - 0x8f, 0x2c, 0xaf, 0x8f, 0xf1, 0x85, 0xb7, 0xdb, 0xf3, 0x52, 0x59, 0x78, - 0x6e, 0x4b, 0x28, 0xcd, 0xfb, 0x92, 0x5f, 0xa0, 0x2e, 0x42, 0xac, 0xbf, - 0xf9, 0xf5, 0xa7, 0xfe, 0x27, 0xb4, 0xd3, 0x4b, 0x2f, 0xfc, 0x2e, 0x7d, - 0xe3, 0xf6, 0x80, 0xc5, 0x96, 0x89, 0xc8, 0x8b, 0xf2, 0x55, 0x42, 0xa8, - 0x5c, 0x2f, 0x78, 0x7c, 0xf1, 0x8b, 0xc3, 0xe0, 0x85, 0x95, 0xff, 0xc0, - 0x12, 0x69, 0xd0, 0x23, 0x86, 0x3a, 0xb2, 0x9b, 0x0e, 0x9b, 0x1a, 0x23, - 0x22, 0xda, 0x1b, 0xf2, 0x8d, 0x5c, 0x71, 0xb3, 0x64, 0x6c, 0x62, 0xa5, - 0x86, 0x3b, 0x9f, 0x9a, 0x0e, 0x54, 0x2e, 0xec, 0x27, 0x66, 0x85, 0xce, - 0x8e, 0x19, 0x18, 0x3f, 0x63, 0x8f, 0x7a, 0xc2, 0xf7, 0xf5, 0x12, 0x94, - 0x5b, 0xc8, 0x4c, 0x7a, 0x58, 0xa0, 0x8c, 0x17, 0x99, 0xc0, 0xac, 0xbc, - 0x41, 0x85, 0x95, 0x38, 0xdc, 0x18, 0xed, 0xf4, 0xb3, 0x50, 0xb2, 0xfe, - 0x69, 0xf5, 0xa7, 0xf9, 0x65, 0xff, 0xfb, 0x9a, 0xd1, 0xcd, 0xcd, 0x47, - 0x8c, 0x26, 0x35, 0x94, 0xc4, 0x64, 0x7e, 0x44, 0x44, 0x2d, 0x17, 0xdf, - 0x33, 0xd1, 0xc5, 0x97, 0xb6, 0x31, 0xac, 0xb0, 0x16, 0x5b, 0xf3, 0x35, - 0xc4, 0x3b, 0x7d, 0xa3, 0x21, 0x56, 0x5f, 0xef, 0x40, 0x03, 0xd3, 0xd2, - 0xcb, 0xfb, 0x03, 0xd8, 0xfa, 0x4b, 0x2f, 0xe6, 0x70, 0xc5, 0xf3, 0x4b, - 0x2f, 0xd1, 0xf7, 0x62, 0x4b, 0x2b, 0x48, 0xdb, 0x22, 0x2f, 0x19, 0x88, - 0x5c, 0xde, 0x61, 0x7f, 0xd9, 0xf1, 0x67, 0xbd, 0x9b, 0x2c, 0xbb, 0xef, - 0x2c, 0xbf, 0x61, 0x6c, 0x7a, 0x59, 0x7e, 0xf3, 0x90, 0x31, 0x65, 0xfe, - 0xe6, 0x30, 0xfd, 0xd7, 0x59, 0x68, 0xc4, 0x4b, 0xe8, 0x60, 0x89, 0xfc, - 0x4d, 0x7a, 0x73, 0x0d, 0x65, 0xc4, 0xc5, 0x95, 0x23, 0x69, 0xc1, 0xeb, - 0xcd, 0xfa, 0x85, 0x97, 0xfd, 0xd3, 0xd7, 0x5d, 0xb0, 0xd3, 0x4b, 0x2f, - 0xf6, 0x8e, 0x62, 0xcd, 0xee, 0xb2, 0xdc, 0x9c, 0x8b, 0x38, 0x21, 0xc1, - 0xfd, 0x1f, 0xdf, 0x39, 0x03, 0x16, 0x57, 0xc7, 0xc7, 0xfa, 0x1d, 0xff, - 0x14, 0x3e, 0xdd, 0x8d, 0x7e, 0xb2, 0xff, 0x1e, 0x8b, 0xde, 0xcd, 0x96, - 0x5c, 0xfb, 0xd6, 0x5f, 0xd2, 0x23, 0x97, 0x71, 0x65, 0xfb, 0x63, 0xd4, - 0x49, 0x65, 0x0a, 0x89, 0xf9, 0x8c, 0xf4, 0x30, 0x45, 0x97, 0xe0, 0x7b, - 0x73, 0x3c, 0xb2, 0xf0, 0xcc, 0x55, 0x95, 0x07, 0x91, 0x85, 0x77, 0xf3, - 0xf4, 0x4d, 0x3f, 0xeb, 0x2f, 0x6b, 0xf1, 0x16, 0x5f, 0xfc, 0x7e, 0x8f, - 0x73, 0xae, 0x7d, 0x02, 0xca, 0x83, 0xe2, 0x71, 0xfb, 0xe2, 0x20, 0x49, - 0x65, 0xfe, 0x20, 0x73, 0x19, 0x01, 0x59, 0x7f, 0xee, 0xc6, 0xbf, 0x2c, - 0x69, 0xff, 0x59, 0x7b, 0x32, 0x65, 0x96, 0xc1, 0x51, 0x1d, 0xd3, 0x2f, - 0xd0, 0x2f, 0x47, 0xcd, 0x2c, 0xbf, 0x68, 0x0c, 0x72, 0x59, 0x5e, 0x3c, - 0x50, 0x0f, 0x5f, 0x32, 0x33, 0x65, 0x97, 0xec, 0xde, 0x51, 0xf2, 0xca, - 0x33, 0xcb, 0xe1, 0x15, 0xf4, 0x17, 0x82, 0xb2, 0x86, 0xb8, 0x13, 0x90, - 0xd8, 0xd4, 0x21, 0x98, 0x41, 0xd8, 0x48, 0xb9, 0x01, 0x42, 0xbf, 0x8f, - 0x9e, 0x6d, 0xdc, 0x21, 0xbf, 0x6e, 0x77, 0x3f, 0x75, 0x97, 0xfb, 0xf1, - 0x30, 0x87, 0xd8, 0x59, 0x50, 0x98, 0x0b, 0x21, 0x44, 0xe5, 0x77, 0xf7, - 0x31, 0x87, 0xd8, 0x59, 0x7b, 0xe9, 0x71, 0x65, 0x7c, 0x79, 0x5a, 0x2c, - 0xbd, 0xcf, 0xda, 0x59, 0x7d, 0xf7, 0x23, 0xe5, 0x97, 0xf3, 0xcb, 0xdc, - 0x81, 0x56, 0x5a, 0x46, 0x7a, 0x4c, 0x24, 0xa8, 0x45, 0xde, 0x11, 0xbb, - 0x8d, 0xff, 0x8d, 0xa2, 0xcd, 0x73, 0xb8, 0x15, 0x97, 0xc0, 0x7d, 0x49, - 0x65, 0xf4, 0x01, 0xb7, 0xc4, 0x97, 0xe9, 0x4f, 0x69, 0xa6, 0x96, 0x51, - 0x1e, 0xa0, 0x09, 0xaf, 0x9f, 0xcc, 0xf2, 0xcb, 0xf7, 0x35, 0x0e, 0x15, - 0x97, 0xe8, 0x20, 0xc6, 0xf5, 0x95, 0x87, 0x9f, 0xd2, 0x7a, 0x1a, 0x65, - 0x38, 0xed, 0xf9, 0x0f, 0x9c, 0x6f, 0xf7, 0xe5, 0x9b, 0xf4, 0x7c, 0x59, - 0x7f, 0x84, 0x22, 0x76, 0x9f, 0xab, 0x2a, 0x19, 0x9a, 0xf8, 0x7d, 0xf2, - 0x81, 0xc6, 0x03, 0xa4, 0xd6, 0x43, 0x41, 0xe3, 0x8a, 0xfe, 0x74, 0xb8, - 0xa3, 0x39, 0xe1, 0x68, 0x23, 0x67, 0xde, 0x7c, 0xd1, 0xad, 0xe6, 0xed, - 0xb8, 0xb6, 0x16, 0x5e, 0x91, 0x3a, 0xcb, 0x7c, 0xdd, 0x9e, 0x3c, 0x16, - 0x5f, 0x9b, 0xe2, 0x5a, 0x85, 0x97, 0xbc, 0xff, 0xac, 0xbf, 0xa3, 0x5b, - 0x46, 0xb6, 0x59, 0x7f, 0xe8, 0x2f, 0x74, 0x0f, 0x29, 0x42, 0xcb, 0xf0, - 0x3f, 0xc2, 0x0a, 0xcb, 0xda, 0x89, 0x96, 0x5e, 0x27, 0x99, 0x65, 0xfb, - 0x8d, 0x3f, 0xdc, 0x59, 0x46, 0x78, 0xce, 0x39, 0x7f, 0xe2, 0x81, 0x7a, - 0xfe, 0x13, 0x3f, 0x59, 0x7b, 0x9a, 0xc5, 0x97, 0x8b, 0x24, 0xb2, 0xfd, - 0xaf, 0xc8, 0x1f, 0xac, 0xa8, 0x3c, 0x5c, 0x1b, 0xa3, 0x44, 0x0f, 0x18, - 0x6d, 0xba, 0xb2, 0xfe, 0xc1, 0x22, 0x63, 0xe2, 0xca, 0x23, 0xc2, 0xf0, - 0xa5, 0x42, 0xaa, 0x4d, 0x8a, 0xa4, 0x3a, 0x32, 0xfd, 0x1e, 0xb0, 0xa3, - 0xac, 0x64, 0x41, 0xe8, 0x60, 0xef, 0x64, 0xbf, 0xe8, 0x3e, 0xc3, 0x36, - 0xc6, 0x96, 0x5f, 0xfb, 0x90, 0x63, 0x28, 0x91, 0xfe, 0xb2, 0xfd, 0xd3, - 0xd9, 0xc9, 0x65, 0xf8, 0x02, 0xb9, 0x7e, 0xb2, 0xfe, 0xe6, 0xa3, 0x06, - 0x6b, 0x2a, 0x0f, 0xf3, 0xa4, 0xfb, 0xca, 0x6f, 0xfb, 0x62, 0xc9, 0x77, - 0x3f, 0xe2, 0xcb, 0xff, 0x61, 0x7d, 0x2e, 0x68, 0x11, 0xfa, 0xcb, 0xf6, - 0x7b, 0x98, 0x2a, 0xca, 0x33, 0xe8, 0x62, 0x05, 0xff, 0xb5, 0xd6, 0x9c, - 0x7b, 0xfd, 0x81, 0x59, 0x7e, 0xf4, 0xee, 0xe3, 0x7a, 0xca, 0x73, 0xef, - 0x24, 0x2b, 0xc3, 0x8d, 0xeb, 0x2f, 0xff, 0x11, 0x43, 0x43, 0x28, 0xfa, - 0x46, 0x4b, 0x2f, 0xcc, 0xce, 0xbb, 0x7a, 0xca, 0xc3, 0xf2, 0x34, 0x8b, - 0xff, 0xcf, 0x3a, 0x69, 0x46, 0xb6, 0x9c, 0xd6, 0x75, 0x65, 0x42, 0x64, - 0x23, 0x20, 0xec, 0x24, 0x08, 0x82, 0xff, 0x99, 0xdc, 0xf6, 0x03, 0x5b, - 0x2c, 0xbf, 0xfb, 0xdc, 0x32, 0x9a, 0x03, 0xac, 0xf9, 0x65, 0xf8, 0x62, - 0x8a, 0x0f, 0x96, 0x58, 0x57, 0x3f, 0x10, 0x22, 0xdf, 0xf4, 0x7b, 0x34, - 0x17, 0x70, 0xaa, 0x2f, 0x85, 0xfb, 0x35, 0x1f, 0x49, 0x65, 0xd0, 0xc0, - 0x9f, 0x67, 0x91, 0x2f, 0xf9, 0xc5, 0xe1, 0xf0, 0xfe, 0xf2, 0xca, 0xe9, - 0xf3, 0x91, 0x6d, 0xff, 0xf8, 0x83, 0x3b, 0xb0, 0x7a, 0x36, 0x1e, 0xe4, - 0x31, 0x65, 0xe7, 0xd6, 0xca, 0x8b, 0xfd, 0x50, 0x8a, 0x3c, 0x21, 0x0a, - 0xc5, 0xf7, 0xbc, 0x6d, 0x2c, 0xbf, 0xda, 0xd6, 0x4c, 0xc8, 0xe2, 0xcb, - 0xfe, 0x7f, 0x70, 0xcb, 0xe9, 0x31, 0x65, 0xff, 0x46, 0x6a, 0x74, 0x8f, - 0xe9, 0x2c, 0xa9, 0x23, 0x2f, 0x08, 0xff, 0x34, 0xf1, 0xcd, 0xff, 0xfe, - 0xeb, 0xf0, 0xe3, 0x93, 0xbd, 0xdc, 0x66, 0x05, 0xf4, 0xb2, 0xe8, 0x6f, - 0x59, 0x7d, 0xce, 0x3b, 0x16, 0x57, 0x51, 0x39, 0xfb, 0x0f, 0x86, 0x6f, - 0xf7, 0xde, 0x13, 0xbd, 0xcd, 0xd5, 0x97, 0xec, 0x3d, 0xa0, 0x55, 0x96, - 0xdb, 0x0f, 0x87, 0xa7, 0x37, 0xdf, 0x4b, 0xce, 0xb2, 0xff, 0xf8, 0x61, - 0xe9, 0x96, 0x6f, 0x79, 0x70, 0xc6, 0xb2, 0xfe, 0xe7, 0x8a, 0x33, 0xe5, - 0x95, 0x88, 0xa0, 0x72, 0x30, 0x28, 0x5f, 0xbf, 0xe7, 0xb3, 0xab, 0x2f, - 0xe6, 0xbd, 0x9d, 0x96, 0x2c, 0xa8, 0x3d, 0x77, 0x29, 0xa8, 0x4d, 0xb6, - 0x50, 0xc8, 0x28, 0x42, 0xdf, 0xd3, 0x87, 0x99, 0xff, 0x16, 0x5f, 0xff, - 0xbd, 0x9a, 0xd8, 0xf8, 0x7b, 0xfa, 0x79, 0xf7, 0x96, 0x5a, 0x18, 0x88, - 0x82, 0x30, 0xbe, 0x36, 0x6b, 0x65, 0x97, 0xfe, 0xf4, 0x73, 0x90, 0x7b, - 0x3f, 0x96, 0x5f, 0xf1, 0xe1, 0x0c, 0x53, 0xcd, 0x2c, 0xa3, 0x45, 0xfe, - 0x89, 0xfc, 0x46, 0xde, 0x7d, 0x7b, 0xd9, 0xf2, 0xcb, 0xf9, 0xf5, 0xf4, - 0xb3, 0xcb, 0x2f, 0xfd, 0xee, 0x1e, 0xbc, 0x40, 0x79, 0x2c, 0xbf, 0xff, - 0x1f, 0x30, 0x7d, 0xcf, 0x1e, 0x73, 0x6c, 0x69, 0x65, 0xff, 0xe6, 0x46, - 0xe6, 0x00, 0xb3, 0x37, 0xc7, 0xcb, 0x2f, 0xfd, 0x19, 0xac, 0xd7, 0xec, - 0x3e, 0x2c, 0xbc, 0xff, 0x37, 0xac, 0xbf, 0x9f, 0xdc, 0x8c, 0xd9, 0x65, - 0x42, 0x73, 0x38, 0x5c, 0x13, 0xe3, 0x55, 0x24, 0xdd, 0xe7, 0xcd, 0x10, - 0x5f, 0xd1, 0xfb, 0xfd, 0x2c, 0x59, 0x7f, 0xc0, 0x86, 0x73, 0x19, 0x1b, - 0xab, 0x2f, 0xfd, 0xad, 0xb0, 0x79, 0xde, 0xe6, 0xea, 0xcb, 0x0a, 0xb2, - 0xff, 0x7b, 0x82, 0x6f, 0x8c, 0xf9, 0x65, 0xb2, 0x0f, 0x24, 0x84, 0xab, - 0x11, 0x61, 0xc8, 0x45, 0xdf, 0xdc, 0x79, 0x14, 0x31, 0x65, 0xe2, 0x8d, - 0xd5, 0x97, 0xff, 0xd2, 0x8d, 0x6d, 0xe3, 0x17, 0x9c, 0x72, 0x92, 0xcb, - 0xfb, 0x6e, 0x63, 0x23, 0x75, 0x65, 0x4c, 0x88, 0x21, 0x14, 0x6b, 0x48, - 0xf1, 0xe1, 0x63, 0x50, 0xa0, 0xbc, 0x7d, 0x35, 0x97, 0x0e, 0x4b, 0x2f, - 0x16, 0x49, 0x65, 0xa5, 0xa3, 0x65, 0xe1, 0x7b, 0xe6, 0x78, 0xf6, 0x59, - 0x58, 0x79, 0x46, 0x4f, 0x7f, 0xf6, 0xff, 0x0b, 0x05, 0x2c, 0xe9, 0xb1, - 0x65, 0xdb, 0x79, 0x65, 0xfe, 0xdf, 0xd7, 0x94, 0x61, 0x2c, 0xa8, 0x3c, - 0xbc, 0x18, 0xbf, 0xff, 0x4b, 0xb1, 0xa7, 0xf0, 0x3c, 0x7e, 0xe7, 0x4d, - 0x65, 0xfd, 0x8d, 0x09, 0xd7, 0xf2, 0xcb, 0xfa, 0x4c, 0xf1, 0x02, 0x65, - 0x97, 0xff, 0xc2, 0x4a, 0x37, 0x99, 0x7f, 0xa3, 0x86, 0x62, 0x4a, 0xd2, - 0x20, 0x3c, 0x5f, 0x7d, 0xd1, 0x3e, 0xf2, 0xcb, 0xf6, 0x33, 0x0f, 0x7a, - 0xcb, 0xdb, 0x4d, 0xba, 0xb2, 0xcd, 0x2c, 0xa8, 0x4e, 0xa3, 0x65, 0x5c, - 0x85, 0x78, 0x48, 0xcc, 0x94, 0x05, 0x1b, 0x84, 0x57, 0x7b, 0x16, 0x5f, - 0xb4, 0x7b, 0x3b, 0x15, 0x30, 0x9a, 0xfb, 0xc0, 0x87, 0x54, 0xc2, 0x6b, - 0xbf, 0x85, 0x50, 0x26, 0xbf, 0xc4, 0xe2, 0xfa, 0x35, 0xfa, 0xa8, 0x13, - 0x5f, 0xee, 0x67, 0x4f, 0x80, 0xd9, 0x53, 0x09, 0xae, 0xc1, 0xaa, 0x61, - 0x35, 0xcd, 0x34, 0xb9, 0x84, 0xd5, 0x89, 0xa9, 0x7c, 0x6a, 0x65, 0xcc, - 0x24, 0xe2, 0x0e, 0xf4, 0x16, 0x88, 0xed, 0xe4, 0xcc, 0x26, 0x4f, 0x3e, - 0x7a, 0xf9, 0x50, 0x0b, 0x51, 0xe7, 0xdf, 0x60, 0xc0, 0x4b, 0x28, 0xcf, - 0x39, 0xcb, 0x6a, 0x17, 0x88, 0x0c, 0xdb, 0xb0, 0x97, 0x72, 0x02, 0x84, - 0x8f, 0x23, 0xc8, 0xf4, 0xab, 0xab, 0xe7, 0xdf, 0x8d, 0x2c, 0xbf, 0xff, - 0x75, 0xe5, 0xd8, 0x83, 0xf7, 0x0c, 0xbe, 0x92, 0xcb, 0xc5, 0xfb, 0x16, - 0x5f, 0xf4, 0x03, 0xc4, 0x7b, 0xc4, 0x62, 0xcb, 0xb3, 0x98, 0x7b, 0x1a, - 0x1d, 0xad, 0x23, 0xf1, 0xc9, 0x0a, 0x15, 0x97, 0xd8, 0x7a, 0x15, 0x65, - 0xdb, 0x69, 0x65, 0xdf, 0xcc, 0xb2, 0xff, 0xe6, 0x4d, 0x27, 0x2d, 0x87, - 0x05, 0xb2, 0xca, 0x83, 0xf7, 0x18, 0xc6, 0x0c, 0xdf, 0x1f, 0x5d, 0x8b, - 0x2f, 0xb5, 0x1c, 0xd9, 0x65, 0x78, 0xf1, 0x04, 0x21, 0xa8, 0x6d, 0xeb, - 0xb6, 0x85, 0x10, 0xe3, 0xb1, 0xc4, 0x11, 0x61, 0x56, 0x18, 0xe7, 0xbe, - 0x87, 0xc9, 0xc3, 0x66, 0x68, 0xff, 0xf5, 0x1c, 0x03, 0x0f, 0xfb, 0x1d, - 0xb7, 0xec, 0x84, 0x5d, 0xc8, 0x75, 0xfa, 0x7c, 0xe3, 0x7c, 0x6e, 0xdb, - 0x86, 0x62, 0x42, 0x65, 0xbd, 0xc6, 0xfb, 0x66, 0x7b, 0x8b, 0x2f, 0xa5, - 0x18, 0x4b, 0x2f, 0xec, 0x91, 0x01, 0xf8, 0xb2, 0xfb, 0xee, 0x1c, 0x2c, - 0xbf, 0xd8, 0x4d, 0xfe, 0x32, 0x15, 0x65, 0x69, 0x10, 0x7d, 0x2c, 0xfc, - 0x8a, 0xfb, 0x34, 0x62, 0xac, 0xbc, 0xd6, 0xcc, 0x59, 0x50, 0x7e, 0x43, - 0x31, 0xc2, 0x2b, 0xfb, 0xb0, 0x21, 0x7d, 0xfa, 0xcb, 0xcd, 0xce, 0x37, - 0xac, 0xbd, 0x98, 0xd2, 0xcb, 0x8c, 0x55, 0x95, 0xb1, 0xb3, 0x31, 0xcb, - 0xf7, 0xb2, 0x63, 0x62, 0xcb, 0xf4, 0x7d, 0xff, 0xf0, 0xb2, 0xa0, 0xf4, - 0x88, 0xa2, 0xfd, 0x1b, 0xe0, 0xbc, 0xb2, 0xfc, 0x7b, 0xfc, 0x7b, 0x2c, - 0xbf, 0xf3, 0x08, 0xc5, 0x8f, 0x70, 0xf4, 0xb2, 0xfa, 0x5e, 0xc0, 0xac, - 0xac, 0x3e, 0x07, 0x3e, 0xbf, 0xee, 0xbc, 0xa2, 0x62, 0x86, 0x2c, 0xbf, - 0x16, 0x09, 0x93, 0x2c, 0xbf, 0xfe, 0x20, 0x9b, 0x06, 0x07, 0xd4, 0xb3, - 0xef, 0x2c, 0xbf, 0xf3, 0x97, 0xff, 0x7b, 0x51, 0x8d, 0x2c, 0xbf, 0xf7, - 0x3a, 0x73, 0xbe, 0x94, 0x66, 0xcb, 0x2d, 0x9b, 0xa8, 0x82, 0xfd, 0x02, - 0xff, 0xba, 0xec, 0xe9, 0xc7, 0xd2, 0x59, 0x7e, 0x2e, 0xbb, 0xb1, 0x65, - 0xf8, 0xa5, 0xb8, 0xfb, 0x2c, 0xa8, 0x3d, 0x11, 0x09, 0xaa, 0x13, 0xaa, - 0x94, 0x34, 0x8c, 0xb3, 0xf8, 0x45, 0x56, 0xca, 0xd0, 0xc6, 0x40, 0x12, - 0x8d, 0x42, 0x2b, 0xa4, 0x04, 0x71, 0xe8, 0xf4, 0xaf, 0xf7, 0x7e, 0x97, - 0x3b, 0x9b, 0x2c, 0xbf, 0xe7, 0xec, 0xc6, 0x5d, 0xcf, 0x96, 0x54, 0x1f, - 0x7e, 0x1b, 0x5f, 0xdf, 0xcd, 0x28, 0xf7, 0x16, 0x5f, 0xff, 0xff, 0x77, - 0x0b, 0xfc, 0x2f, 0x77, 0x3b, 0x19, 0x31, 0xea, 0x6e, 0x9f, 0xde, 0x59, - 0x7f, 0x99, 0xa3, 0x0f, 0x72, 0x65, 0x95, 0x88, 0xb2, 0x77, 0xeb, 0xe2, - 0x8c, 0x69, 0x65, 0xf4, 0x7d, 0xc7, 0x59, 0x50, 0xe8, 0xac, 0xb6, 0x84, - 0x9c, 0x8e, 0x47, 0x0b, 0x9c, 0xad, 0xf7, 0x83, 0x1b, 0x37, 0xc4, 0x87, - 0x18, 0xae, 0xe9, 0x6c, 0xc6, 0x1a, 0x57, 0x79, 0x76, 0xc5, 0x0e, 0x0f, - 0x10, 0x02, 0x1c, 0x5b, 0xc8, 0x44, 0x21, 0xbf, 0xfe, 0x32, 0xc6, 0x40, - 0x84, 0x09, 0x16, 0x31, 0x65, 0xff, 0x0c, 0xf0, 0x81, 0x2c, 0xe2, 0xcb, - 0xfe, 0xd6, 0xa0, 0x3d, 0xf9, 0xf7, 0x56, 0x5e, 0x28, 0xe2, 0xcb, 0xec, - 0x2c, 0x62, 0xca, 0x59, 0x50, 0x78, 0xd2, 0x1b, 0x01, 0x05, 0xfc, 0x10, - 0x38, 0xd9, 0x0b, 0x2f, 0xfb, 0xa7, 0x2e, 0xbc, 0x8d, 0x8b, 0x2f, 0xfd, - 0xc3, 0x2f, 0xa5, 0xe3, 0xe1, 0xac, 0xac, 0x3f, 0x6f, 0x1c, 0x5f, 0xcf, - 0xee, 0xc0, 0x1b, 0x6b, 0x2f, 0xfc, 0x6c, 0xc1, 0xf4, 0xf8, 0x58, 0xb2, - 0xf9, 0x90, 0x38, 0x59, 0x44, 0x7b, 0xbc, 0x3c, 0xa9, 0x2a, 0xa8, 0xc4, - 0xd3, 0x37, 0x9a, 0x10, 0x7a, 0x2e, 0x64, 0x28, 0xc8, 0x87, 0xd0, 0x8e, - 0xbe, 0xee, 0x7e, 0xeb, 0x2f, 0x8a, 0x35, 0x25, 0x97, 0xfd, 0xd8, 0x91, - 0x91, 0x03, 0xe5, 0x97, 0xfd, 0x12, 0x3f, 0x4a, 0x0b, 0xf5, 0x97, 0xfd, - 0x19, 0xe1, 0x3f, 0xfe, 0x3e, 0x59, 0x7b, 0x08, 0x55, 0x96, 0xd4, 0x23, - 0xa7, 0x08, 0x74, 0x70, 0xc3, 0x86, 0xd9, 0xe5, 0xfc, 0x50, 0x1d, 0x44, - 0x96, 0x5f, 0xfe, 0x73, 0xf4, 0x80, 0x5e, 0xe7, 0x5e, 0x4b, 0x04, 0x35, - 0x97, 0x47, 0x56, 0x57, 0x4f, 0xc3, 0x7a, 0xd5, 0xff, 0xb8, 0x27, 0x8c, - 0x81, 0x2c, 0xe2, 0xcb, 0x87, 0xc5, 0x95, 0xba, 0x7f, 0x5d, 0x24, 0x23, - 0xfb, 0xff, 0xfb, 0x3e, 0xce, 0x39, 0x74, 0xe3, 0xdd, 0x03, 0xb1, 0x65, - 0x4e, 0x55, 0xfb, 0x11, 0x85, 0xbc, 0x6d, 0x04, 0x63, 0x7e, 0x03, 0x0f, - 0xb0, 0xb2, 0xfd, 0x9a, 0x0c, 0x62, 0xca, 0x23, 0xcd, 0x10, 0x9e, 0xff, - 0xb1, 0x99, 0xa3, 0xd9, 0xd8, 0xb2, 0xff, 0xe7, 0x61, 0x47, 0xdb, 0x82, - 0xfb, 0x3a, 0xb2, 0xff, 0xfc, 0xe5, 0xe7, 0x7e, 0x94, 0x7b, 0x8d, 0x67, - 0x56, 0x5f, 0xe1, 0x35, 0x9b, 0xe0, 0xa4, 0xb2, 0xff, 0xe6, 0x71, 0xe5, - 0xa8, 0xe4, 0x16, 0xcb, 0x2f, 0xfa, 0x3d, 0xdc, 0x66, 0x6b, 0x16, 0x5f, - 0xbd, 0xd3, 0x8e, 0x2c, 0xbd, 0xb3, 0x96, 0x8f, 0x7b, 0x86, 0xf7, 0xfd, - 0x1f, 0xf0, 0x60, 0x7d, 0x49, 0x65, 0xed, 0x73, 0x8b, 0x88, 0x0d, 0x7c, - 0x17, 0x70, 0xaa, 0x20, 0x34, 0xf3, 0x55, 0x6c, 0x92, 0x29, 0x34, 0xc9, - 0x7f, 0xd1, 0xd0, 0x9f, 0x1c, 0xf6, 0x59, 0x77, 0x62, 0x71, 0xf0, 0x68, - 0xa2, 0xe7, 0xfd, 0x65, 0xb5, 0x07, 0x8d, 0xe2, 0xfa, 0xc5, 0x48, 0xcf, - 0x0a, 0x21, 0x23, 0x7d, 0xa1, 0xab, 0x8a, 0xe9, 0xc7, 0xe9, 0x04, 0xa7, - 0xe9, 0x4f, 0x77, 0xc3, 0xec, 0x6e, 0x2c, 0xbf, 0xff, 0x8c, 0x65, 0x9c, - 0x8d, 0x4e, 0xe7, 0x5c, 0x70, 0x35, 0x97, 0xb7, 0xc7, 0x56, 0x56, 0x2e, - 0x4e, 0x9c, 0xba, 0xc7, 0x53, 0xe1, 0x28, 0x8b, 0x77, 0x3f, 0xcb, 0x2f, - 0x75, 0xf7, 0x56, 0x5f, 0x47, 0xfb, 0x98, 0xb2, 0xf9, 0x8c, 0x7f, 0x2c, - 0xa6, 0x1f, 0xef, 0xe2, 0xfe, 0x1f, 0x10, 0x96, 0xfe, 0xc6, 0xf7, 0x7e, - 0xf1, 0x65, 0xf1, 0x7b, 0xf0, 0x2c, 0xbf, 0x31, 0xbb, 0x6e, 0xdb, 0xb6, - 0xe9, 0x65, 0xff, 0xfd, 0x2c, 0xe1, 0xeb, 0x46, 0xc1, 0x3d, 0xdc, 0x6b, - 0xcb, 0x2b, 0x11, 0x7a, 0x64, 0x6e, 0x7b, 0x7e, 0xdb, 0xaf, 0xd8, 0x59, - 0x7f, 0xf6, 0x17, 0xb0, 0xa5, 0x9c, 0x11, 0x8b, 0x29, 0xcf, 0xad, 0xa2, - 0x8b, 0xff, 0xd2, 0xcf, 0xa4, 0x24, 0x7f, 0x3d, 0xa6, 0x9a, 0x49, 0x7e, - 0x63, 0x58, 0x7b, 0xd6, 0x5e, 0x96, 0x14, 0xc7, 0xfa, 0x22, 0x9d, 0x42, - 0x34, 0xde, 0x13, 0xf7, 0xff, 0xe7, 0xd4, 0x87, 0xd8, 0xe1, 0x63, 0x4f, - 0xa1, 0x56, 0x54, 0x2b, 0x11, 0x19, 0xf7, 0x61, 0xd8, 0x51, 0xb5, 0x80, - 0x9a, 0xff, 0x8c, 0xa5, 0xc6, 0xd6, 0xdd, 0x37, 0x6d, 0xd2, 0xcb, 0xe9, - 0xb9, 0x93, 0x2c, 0xbf, 0x7f, 0x1e, 0xcd, 0xd5, 0x97, 0xfa, 0x33, 0x41, - 0x77, 0x0a, 0xa2, 0x09, 0x5f, 0xf4, 0x7b, 0x34, 0x17, 0x70, 0xaa, 0x2f, - 0x95, 0xf9, 0xc7, 0xd8, 0x15, 0x65, 0xff, 0xff, 0x61, 0xeb, 0x07, 0xd8, - 0xfa, 0x5a, 0x8f, 0x70, 0x42, 0x92, 0xcb, 0xc5, 0x9c, 0x1a, 0x62, 0x21, - 0x3e, 0x62, 0x21, 0x14, 0x51, 0x27, 0x13, 0xbe, 0x33, 0xcb, 0xff, 0xa3, - 0xa6, 0x2e, 0x6b, 0x66, 0x03, 0xe5, 0x97, 0xfc, 0x3d, 0x63, 0x32, 0x4e, - 0x35, 0x95, 0x8a, 0x95, 0xce, 0x3a, 0xde, 0x95, 0xba, 0x3d, 0xfa, 0x59, - 0xf8, 0x9e, 0x59, 0x7f, 0x77, 0x73, 0xa6, 0x1e, 0xac, 0xa7, 0x3d, 0xb0, - 0x15, 0x5f, 0xfb, 0xd0, 0xce, 0x41, 0xec, 0xfe, 0x59, 0x7f, 0xed, 0x9f, - 0xed, 0xcc, 0xf1, 0x3e, 0xf5, 0x97, 0xff, 0xd9, 0xe8, 0x2f, 0x73, 0x30, - 0x51, 0x5e, 0x4b, 0x2f, 0xe1, 0x73, 0xde, 0xc1, 0xac, 0xbf, 0xf6, 0x0e, - 0x25, 0x1d, 0xcf, 0xdd, 0x65, 0xfc, 0xf2, 0x04, 0x9c, 0x6b, 0x2f, 0xee, - 0x9e, 0xdc, 0xe3, 0xac, 0xbc, 0xd3, 0x4d, 0x24, 0xbf, 0x77, 0x02, 0xfa, - 0x49, 0x3c, 0xd0, 0x5f, 0xff, 0xe9, 0xb5, 0x1b, 0xe7, 0x0a, 0xf3, 0x84, - 0x9b, 0x93, 0xb3, 0xef, 0x2c, 0xa8, 0x47, 0xb7, 0x93, 0x84, 0x39, 0xbf, - 0xfc, 0x7a, 0x3f, 0x03, 0x3c, 0xec, 0xc2, 0x59, 0x5b, 0x2a, 0x98, 0x0a, - 0x26, 0x93, 0xd8, 0x5d, 0xf9, 0xe9, 0x46, 0x47, 0xe3, 0x0a, 0x59, 0x4b, - 0x2e, 0x97, 0x1a, 0x2d, 0x9b, 0xc2, 0xef, 0xfc, 0xc8, 0xfb, 0x85, 0x9b, - 0x09, 0x25, 0x97, 0xff, 0xf8, 0xfa, 0xe5, 0xf4, 0x84, 0x94, 0x14, 0x9d, - 0x98, 0x35, 0x97, 0xff, 0xb3, 0x3a, 0x3e, 0xc7, 0x33, 0xa7, 0xfa, 0xcb, - 0xf4, 0xd2, 0x8d, 0x71, 0x65, 0xfe, 0xc2, 0x04, 0xb9, 0xb3, 0xac, 0xb0, - 0xb3, 0x8f, 0x70, 0x65, 0x35, 0x09, 0xd0, 0xec, 0x61, 0x24, 0x11, 0xb0, - 0x1c, 0x29, 0x6f, 0xa7, 0x1f, 0x40, 0xb2, 0xfd, 0x92, 0xec, 0x69, 0x65, - 0x04, 0xf2, 0xf7, 0x49, 0x2f, 0xf7, 0xa0, 0xfa, 0x2c, 0x7c, 0xb2, 0xff, - 0xef, 0x71, 0xe5, 0xcc, 0x0c, 0x30, 0xd6, 0x5f, 0xfe, 0xf8, 0xa7, 0x07, - 0xa7, 0xff, 0xf1, 0xa9, 0x2c, 0xa8, 0x47, 0x59, 0x92, 0x80, 0xd0, 0x44, - 0x3b, 0xff, 0x6d, 0xf4, 0x1b, 0x30, 0xb3, 0x75, 0x65, 0xfc, 0x7c, 0xc1, - 0x89, 0x8b, 0x2f, 0xcd, 0xe6, 0x59, 0xbd, 0x65, 0xfd, 0x83, 0x30, 0x07, - 0xa1, 0x3d, 0x87, 0x2d, 0xbf, 0xb9, 0x23, 0x63, 0xc9, 0x65, 0x68, 0xfc, - 0x3f, 0x43, 0xbf, 0xdc, 0x2c, 0xdf, 0xd7, 0x92, 0xcb, 0xdc, 0x96, 0xf5, - 0x94, 0x67, 0xa7, 0xba, 0x69, 0x7f, 0xfa, 0x36, 0x13, 0xb1, 0xf7, 0xb3, - 0x62, 0x1a, 0xca, 0xc4, 0xfc, 0x0e, 0x30, 0x97, 0x76, 0x22, 0x4b, 0xff, - 0xdd, 0x79, 0x60, 0xc8, 0xdf, 0xb0, 0xc5, 0x97, 0xfa, 0x30, 0xbc, 0xd8, - 0x68, 0x2b, 0x2f, 0xf7, 0x73, 0x7c, 0xee, 0x48, 0x2b, 0x2b, 0x87, 0xdf, - 0xe3, 0x7a, 0xf2, 0x36, 0x01, 0x0b, 0x6b, 0xf8, 0xa7, 0x09, 0xae, 0xba, - 0xcb, 0xff, 0x01, 0xe5, 0x3a, 0x0c, 0x78, 0xc5, 0x94, 0xe7, 0xde, 0x46, - 0x17, 0xfe, 0xd1, 0xff, 0xb7, 0x63, 0x80, 0xe2, 0xcb, 0xf6, 0x69, 0xfe, - 0x69, 0x65, 0xa4, 0xb2, 0xff, 0xfc, 0xd1, 0x60, 0xf4, 0x60, 0xd8, 0x7d, - 0x82, 0xd9, 0x65, 0xb6, 0x83, 0xe8, 0xc1, 0x1a, 0xd9, 0x17, 0x1c, 0x84, - 0x8d, 0xfe, 0x98, 0x9d, 0xaf, 0x67, 0x56, 0x5e, 0xee, 0x05, 0x65, 0xe6, - 0x9a, 0x69, 0x25, 0xfd, 0xfc, 0x16, 0x7d, 0xe4, 0x93, 0xcd, 0x05, 0x4e, - 0x45, 0x86, 0xe1, 0xa0, 0x87, 0x97, 0xff, 0xf3, 0x6e, 0x70, 0x7a, 0x63, - 0x1e, 0x35, 0x3b, 0xdc, 0xcd, 0x96, 0x57, 0x51, 0x38, 0x03, 0x6a, 0x85, - 0x52, 0x27, 0x0f, 0x97, 0x8d, 0xd6, 0xff, 0x84, 0x8e, 0x63, 0x42, 0x17, - 0x96, 0x56, 0xcd, 0x87, 0x1c, 0xa5, 0x52, 0x8e, 0x13, 0xbf, 0x10, 0x9c, - 0xad, 0x6d, 0x4a, 0x24, 0x64, 0x70, 0xbd, 0x94, 0x58, 0x51, 0x8c, 0x72, - 0x12, 0xfe, 0x95, 0x62, 0x21, 0xd5, 0xff, 0xb0, 0xcb, 0x67, 0x2f, 0x63, - 0x16, 0x5f, 0xfc, 0x28, 0x9e, 0x3e, 0x16, 0x6f, 0x31, 0xac, 0xbf, 0x8b, - 0x07, 0xd7, 0x69, 0x65, 0x68, 0xfd, 0x18, 0x8f, 0x78, 0x9d, 0x8b, 0x2f, - 0xe1, 0xf7, 0x3d, 0xb9, 0x8b, 0x2c, 0x7d, 0x3c, 0xb6, 0x86, 0xea, 0x11, - 0x2b, 0xd6, 0xdb, 0xe2, 0x7f, 0xbc, 0xb2, 0xf6, 0x17, 0xeb, 0x2f, 0xb3, - 0xd3, 0x49, 0x65, 0xff, 0xcd, 0xe5, 0x0d, 0xfc, 0x72, 0x13, 0xfe, 0x2c, - 0xae, 0x9f, 0x73, 0x91, 0xdf, 0xfb, 0x3d, 0x1a, 0xe7, 0x60, 0xbc, 0xb8, - 0x82, 0x17, 0xf6, 0x68, 0x2e, 0xe1, 0x54, 0x41, 0x09, 0xe7, 0x95, 0x7a, - 0x06, 0x6b, 0x2a, 0x0f, 0x9f, 0x89, 0x97, 0x6f, 0x1a, 0xcb, 0xdb, 0xe1, - 0x8b, 0x2f, 0xdb, 0x66, 0xa2, 0x4b, 0x2f, 0xb5, 0xa3, 0x69, 0x65, 0x9d, - 0x87, 0x97, 0xd2, 0x8b, 0xfb, 0x74, 0x6d, 0x39, 0x49, 0x65, 0x6c, 0x8d, - 0xac, 0x19, 0x26, 0x90, 0x13, 0xdf, 0xfe, 0x9a, 0x46, 0x5e, 0x8f, 0xe6, - 0x23, 0x99, 0x65, 0xc5, 0x32, 0xcb, 0x40, 0xcf, 0x8f, 0x13, 0x2b, 0x65, - 0x67, 0xc2, 0x91, 0x76, 0x11, 0x5f, 0xc3, 0x48, 0xa1, 0xf7, 0xbe, 0x13, - 0xf7, 0xf7, 0x73, 0xde, 0x36, 0x2c, 0xbf, 0xbc, 0x26, 0x75, 0xfe, 0x59, - 0x5f, 0x1e, 0xe1, 0x16, 0xdf, 0xf1, 0x6d, 0x9a, 0xfc, 0x81, 0xfa, 0xcb, - 0xfb, 0x3e, 0xf6, 0xb5, 0x0b, 0x2f, 0xfe, 0xe1, 0x3f, 0x9d, 0x82, 0x46, - 0xd8, 0xb2, 0x86, 0x7e, 0x5c, 0x2e, 0xa8, 0x47, 0x89, 0x91, 0x02, 0x15, - 0xb7, 0xf6, 0x04, 0x4d, 0xfd, 0xc5, 0x96, 0x62, 0xcb, 0xfd, 0x1e, 0x1f, - 0x40, 0xfc, 0x58, 0x21, 0x63, 0x7f, 0xff, 0x19, 0x0f, 0x58, 0x1e, 0xc7, - 0x73, 0x5a, 0x81, 0x56, 0x5d, 0x02, 0xac, 0xbf, 0xd9, 0xa3, 0xfd, 0x8f, - 0x25, 0x97, 0x19, 0x2c, 0xb3, 0x4b, 0x28, 0x66, 0x9c, 0x41, 0x5b, 0xc4, - 0x0d, 0x96, 0x5e, 0xd8, 0xa1, 0x65, 0xfb, 0xaf, 0x2c, 0x25, 0x97, 0xf1, - 0xf8, 0xb3, 0xa6, 0xb2, 0xec, 0xec, 0xe3, 0xd1, 0x82, 0x6b, 0x9d, 0xa9, - 0xc9, 0xa5, 0x8c, 0x5f, 0x16, 0xba, 0x44, 0xe3, 0xbe, 0x6d, 0xbf, 0xa3, - 0x6f, 0x73, 0x3c, 0xb2, 0xa4, 0xab, 0xbb, 0x0c, 0xf4, 0x83, 0xd4, 0x32, - 0x8e, 0x95, 0xa6, 0x4b, 0xfb, 0x86, 0x31, 0xe1, 0x2c, 0xbf, 0xff, 0xbd, - 0xdc, 0xe7, 0x33, 0x01, 0xad, 0xb0, 0x05, 0xe5, 0x97, 0xfd, 0xd8, 0xd7, - 0x8a, 0x33, 0xe5, 0x97, 0xff, 0xfc, 0x7b, 0x44, 0xb9, 0xad, 0x1f, 0xd3, - 0x49, 0xf4, 0xcc, 0xf9, 0x65, 0xfe, 0x87, 0xd9, 0xf4, 0xe2, 0x2c, 0xbd, - 0xdc, 0x21, 0xa3, 0x57, 0xa7, 0x1e, 0x6a, 0xac, 0x4e, 0x70, 0xcb, 0x3d, - 0x19, 0x85, 0xfa, 0x35, 0x37, 0x36, 0x59, 0x7f, 0xdd, 0x8c, 0xd4, 0xb8, - 0x06, 0x2c, 0xad, 0x8f, 0x8c, 0x25, 0x57, 0x1f, 0x16, 0x5f, 0xf6, 0x6c, - 0xfe, 0xfc, 0x42, 0x92, 0xcb, 0xf9, 0xfd, 0x3a, 0x24, 0x2a, 0xcb, 0xf8, - 0x46, 0x71, 0xa7, 0xf9, 0x65, 0x42, 0x6d, 0xb9, 0x09, 0x81, 0x48, 0xf4, - 0x2c, 0xe7, 0x7e, 0x30, 0xbd, 0xac, 0xea, 0xcb, 0xdc, 0x36, 0x2c, 0xad, - 0x1b, 0x8f, 0x0e, 0x5c, 0x7b, 0x2c, 0xa8, 0x37, 0x0d, 0xe4, 0x37, 0xff, - 0x74, 0xe0, 0xa7, 0x39, 0x48, 0xd8, 0xb2, 0xf8, 0xe6, 0x36, 0x96, 0x5f, - 0xfc, 0xc7, 0xf8, 0x4f, 0x1e, 0xa0, 0x0d, 0xb5, 0x97, 0xff, 0xe0, 0x6c, - 0x51, 0x9d, 0x9f, 0x1e, 0xce, 0x83, 0x4b, 0x2f, 0xbd, 0xc1, 0x39, 0x39, - 0x30, 0x71, 0xa1, 0xe1, 0x18, 0x89, 0x57, 0x13, 0x4b, 0x2f, 0xdc, 0x66, - 0x7b, 0x8b, 0x2f, 0xfe, 0x31, 0x73, 0xc7, 0xdc, 0xf4, 0x69, 0x65, 0xf9, - 0xe4, 0x47, 0x0b, 0x2f, 0xce, 0x5e, 0xc2, 0x59, 0x7f, 0xe1, 0x49, 0xfd, - 0xcc, 0xdf, 0xd3, 0x59, 0x50, 0x7c, 0xae, 0x4b, 0x7e, 0x27, 0x14, 0x26, - 0xb2, 0xa4, 0xab, 0x5b, 0x23, 0x2a, 0x0a, 0xc9, 0x8b, 0xe8, 0xa1, 0x88, - 0x65, 0x08, 0xa0, 0x10, 0x5f, 0x7c, 0x13, 0x1a, 0xcb, 0xf7, 0x4f, 0x70, - 0xc5, 0x59, 0x7d, 0x9f, 0x9e, 0xf5, 0x97, 0xdf, 0xfe, 0x0f, 0xd6, 0x50, - 0x4f, 0xd4, 0x8a, 0xc4, 0x24, 0xbe, 0x06, 0xbc, 0x6b, 0x2f, 0xfe, 0xfe, - 0x38, 0xc8, 0x3d, 0x68, 0xda, 0x59, 0x79, 0xde, 0x4b, 0x28, 0x68, 0x82, - 0x32, 0x2f, 0xd1, 0x6f, 0xcc, 0x3f, 0x7a, 0x16, 0x5e, 0x3c, 0x69, 0x65, - 0xf1, 0xf3, 0x06, 0x67, 0x86, 0x44, 0xf7, 0xf1, 0x73, 0x19, 0x1b, 0xab, - 0x2f, 0xb7, 0x7b, 0x9b, 0x2c, 0xbf, 0xd0, 0x3c, 0xf1, 0xf4, 0x0b, 0x2a, - 0x0f, 0x60, 0x64, 0xd5, 0x08, 0xa8, 0x64, 0x21, 0xef, 0xfd, 0xe1, 0x3f, - 0x81, 0x23, 0xf8, 0xfd, 0x65, 0xff, 0xff, 0x98, 0xe5, 0xfc, 0x8f, 0x80, - 0x67, 0x4e, 0x3d, 0xd0, 0x3b, 0x16, 0x5f, 0xff, 0x10, 0x3d, 0x23, 0xff, - 0xae, 0x7e, 0x76, 0x2c, 0xba, 0x76, 0xea, 0xcb, 0xff, 0xf3, 0x9f, 0x8c, - 0x78, 0x3c, 0xf1, 0xb0, 0xf4, 0xb2, 0xff, 0xf4, 0x04, 0x78, 0x27, 0x8f, - 0x50, 0x06, 0xda, 0xcb, 0xc0, 0xc1, 0xac, 0xbd, 0xa7, 0xe6, 0x26, 0x4f, - 0xa4, 0xfe, 0x8e, 0x12, 0x96, 0xe2, 0x75, 0xbc, 0xe9, 0xf8, 0x02, 0x39, - 0x3a, 0xf9, 0x53, 0x11, 0xca, 0x33, 0xba, 0x50, 0xb2, 0xff, 0xf6, 0xc3, - 0xec, 0x77, 0x3e, 0xff, 0x3d, 0xc5, 0x94, 0xe7, 0xc6, 0x01, 0x6a, 0x85, - 0xdd, 0x31, 0xc2, 0x63, 0x21, 0x62, 0x17, 0x33, 0x86, 0xf3, 0xca, 0x89, - 0x28, 0x47, 0xdf, 0xda, 0x8d, 0x8c, 0xbc, 0xb2, 0xf0, 0xc4, 0x62, 0xcb, - 0xf1, 0x40, 0xf2, 0x65, 0x97, 0xdc, 0x06, 0x85, 0x59, 0x7e, 0x8e, 0xfa, - 0x24, 0xb2, 0xf8, 0x60, 0xf7, 0x20, 0xfc, 0xbe, 0x27, 0xfc, 0x92, 0xff, - 0x41, 0x3f, 0x40, 0x5b, 0x2c, 0xbf, 0xff, 0xf8, 0xf9, 0x12, 0xce, 0x9e, - 0xba, 0xf0, 0x42, 0xbc, 0xce, 0xfb, 0x2c, 0xbd, 0xb0, 0xe1, 0x65, 0xfb, - 0xfc, 0x64, 0x75, 0x65, 0xff, 0xff, 0xec, 0xdb, 0x90, 0x2b, 0xf3, 0xd2, - 0xc1, 0x45, 0xcf, 0xbd, 0xa8, 0xcf, 0x96, 0x5f, 0xa2, 0x76, 0x8a, 0x4b, - 0x2b, 0x88, 0xa5, 0x03, 0xe5, 0xe6, 0xdf, 0x71, 0x65, 0x0d, 0x56, 0xa6, - 0x16, 0x9c, 0x24, 0x18, 0x91, 0xd3, 0x27, 0x70, 0x21, 0xdf, 0x43, 0x34, - 0x04, 0x77, 0xb4, 0x27, 0x16, 0x5f, 0xb1, 0xaf, 0x08, 0xc5, 0x97, 0xde, - 0x1f, 0x36, 0x59, 0x7f, 0xdd, 0x8f, 0xbd, 0x1d, 0x7d, 0xd5, 0x94, 0xb2, - 0xa7, 0x1e, 0x3b, 0x6a, 0x3c, 0xb7, 0xcb, 0x2e, 0xc6, 0x96, 0x5d, 0xef, - 0x19, 0xa9, 0xf0, 0x95, 0x41, 0xff, 0x9a, 0x9d, 0xff, 0x9c, 0x83, 0x9a, - 0x0b, 0xb8, 0x55, 0x10, 0x8a, 0xe9, 0x6c, 0xb2, 0xa1, 0x3b, 0x3c, 0x1e, - 0x32, 0xaf, 0xe1, 0xd4, 0x02, 0x0d, 0xe9, 0x37, 0xec, 0xdb, 0x9f, 0xba, - 0xcb, 0xff, 0xff, 0xdd, 0xc0, 0x68, 0x5e, 0x9f, 0xd1, 0xe0, 0x74, 0xb3, - 0xef, 0x01, 0xf8, 0xb2, 0xff, 0xec, 0xf8, 0x4f, 0x19, 0x02, 0x59, 0xc5, - 0x97, 0xff, 0xff, 0xff, 0xff, 0xff, 0xec, 0x2d, 0x89, 0xc7, 0x05, 0xb4, - 0x68, 0x78, 0x59, 0xee, 0x18, 0x70, 0x84, 0xdb, 0x35, 0x1c, 0x27, 0x17, - 0x98, 0x7f, 0xfe, 0x0f, 0xc9, 0xc7, 0x05, 0xb4, 0x69, 0x65, 0xfd, 0x22, - 0xcc, 0x03, 0x6d, 0x65, 0x42, 0x6f, 0xf8, 0x8a, 0xf1, 0x85, 0x5f, 0xfd, - 0xe7, 0x2d, 0xbe, 0x91, 0x46, 0x71, 0x65, 0xff, 0xfa, 0x3f, 0x9a, 0x51, - 0xb1, 0x38, 0xbc, 0x28, 0x92, 0xcb, 0xff, 0x09, 0x9d, 0x76, 0x4f, 0x69, - 0xa6, 0x96, 0x5f, 0xff, 0xb0, 0x3d, 0x82, 0x19, 0x1e, 0xd8, 0x46, 0x2a, - 0xcb, 0x3e, 0xc8, 0x98, 0x92, 0x2d, 0x49, 0x31, 0x87, 0x87, 0x7d, 0xff, - 0xfd, 0x31, 0x47, 0xfc, 0x0f, 0x4f, 0x53, 0x14, 0x7f, 0xc5, 0x97, 0xff, - 0xf7, 0xb9, 0x02, 0xc8, 0xfa, 0xe5, 0xe9, 0x66, 0xb1, 0x65, 0xff, 0x8f, - 0x98, 0x39, 0xcf, 0xfe, 0xe6, 0x2c, 0xbf, 0xd0, 0xcf, 0xbd, 0x19, 0xf2, - 0xcb, 0xff, 0x74, 0xf7, 0xf5, 0xe5, 0xa8, 0x15, 0x65, 0x62, 0x62, 0x41, - 0x5a, 0xea, 0x1f, 0x8d, 0x2f, 0xe0, 0x78, 0xc0, 0x42, 0xac, 0xbf, 0xb1, - 0xac, 0x20, 0x7e, 0xb2, 0xfd, 0x2c, 0xf4, 0x7e, 0xb2, 0xe8, 0x66, 0xc7, - 0xad, 0xf1, 0x75, 0xff, 0xff, 0xdf, 0xb1, 0xe5, 0xd7, 0x3f, 0x18, 0xf0, - 0x79, 0xe3, 0x61, 0xe9, 0x65, 0x71, 0x13, 0xe0, 0x2f, 0xbf, 0xff, 0x16, - 0x73, 0x3a, 0xed, 0xe1, 0xe9, 0xb2, 0x02, 0xb2, 0xfd, 0xb3, 0x20, 0x70, - 0xb2, 0xa4, 0xbe, 0x44, 0x38, 0xfe, 0x7e, 0x34, 0x9a, 0x35, 0xcd, 0x14, - 0x76, 0x37, 0x0e, 0x1e, 0xfa, 0x32, 0x3d, 0xe4, 0x62, 0x2b, 0x5f, 0xfa, - 0x05, 0x16, 0x0b, 0x3d, 0xd3, 0x59, 0x7f, 0xa3, 0x9c, 0x8d, 0xb1, 0xa5, - 0x97, 0xfb, 0xb8, 0xcc, 0xe8, 0x09, 0x65, 0x0c, 0xf9, 0xbc, 0x69, 0x7d, - 0x9a, 0x14, 0xd6, 0x54, 0x32, 0x37, 0xb2, 0x7d, 0x2c, 0xe1, 0x56, 0xf0, - 0xa4, 0x01, 0x15, 0xe6, 0x9a, 0x69, 0x25, 0xff, 0x67, 0xef, 0xac, 0xdf, - 0x83, 0x49, 0x3c, 0xd0, 0x5c, 0xd3, 0x49, 0x2f, 0x34, 0xd3, 0x49, 0x2f, - 0xe7, 0xd8, 0x7d, 0x8e, 0x24, 0x9e, 0x68, 0x28, 0x91, 0x8a, 0xd2, 0x66, - 0xe1, 0xcd, 0xf8, 0x26, 0x31, 0x18, 0x92, 0x79, 0xb3, 0xbc, 0xd3, 0x4d, - 0x24, 0xbd, 0xc8, 0xd2, 0x49, 0xe6, 0x82, 0xf9, 0xcb, 0xef, 0x2c, 0xb7, - 0xe6, 0x8a, 0xbf, 0x2d, 0xb4, 0x5d, 0x7f, 0x0c, 0xa2, 0x4e, 0x15, 0x97, - 0xee, 0x03, 0x6d, 0xc2, 0x59, 0x7e, 0x19, 0xef, 0x81, 0xac, 0xbe, 0xc2, - 0xcd, 0xd5, 0x95, 0xa3, 0xcc, 0x61, 0x4d, 0x1a, 0x26, 0x84, 0x78, 0xbf, - 0xfb, 0xaf, 0x22, 0x71, 0x66, 0x23, 0x99, 0x65, 0xff, 0x6d, 0x1f, 0x70, - 0xcb, 0x3f, 0x59, 0x7c, 0xf2, 0x3f, 0xd6, 0x56, 0x8f, 0x73, 0xa7, 0x57, - 0xfd, 0x81, 0x8d, 0x87, 0xd8, 0xe2, 0xca, 0xc3, 0xdb, 0xdc, 0x22, 0xbf, - 0xbb, 0x9b, 0xf3, 0xdc, 0x59, 0x41, 0x4d, 0x3f, 0xf8, 0x7e, 0x78, 0x92, - 0xb4, 0xa9, 0xbf, 0xb0, 0xc6, 0x28, 0xdc, 0xae, 0xdb, 0xcb, 0x2a, 0x15, - 0x7d, 0x64, 0xaa, 0x62, 0x3c, 0xbf, 0x6d, 0xb9, 0xdc, 0x0a, 0xcb, 0x9b, - 0x5b, 0x74, 0xb2, 0xf7, 0x23, 0xcb, 0x2e, 0xfd, 0xa5, 0x96, 0xe4, 0xc6, - 0xd5, 0xc7, 0x2b, 0x11, 0x55, 0xf1, 0x67, 0x95, 0xef, 0xc1, 0x8e, 0xc3, - 0x16, 0x5c, 0xfe, 0x59, 0x7e, 0xcd, 0xd7, 0x2f, 0xf0, 0xde, 0x91, 0x3d, - 0xff, 0x41, 0x48, 0x87, 0xd8, 0xd9, 0x65, 0xfc, 0x3c, 0xd6, 0xe3, 0x06, - 0xb2, 0xf7, 0x4e, 0x64, 0x95, 0xa3, 0xce, 0xe1, 0x8d, 0xff, 0x3f, 0xde, - 0xc9, 0x81, 0xa1, 0x56, 0x58, 0x26, 0x7b, 0xc0, 0x22, 0xbf, 0xc5, 0x9f, - 0x4b, 0x86, 0x2a, 0xcb, 0xe7, 0x7d, 0x0a, 0xb2, 0xc2, 0xac, 0xbf, 0xfb, - 0x03, 0xd8, 0xee, 0x6b, 0x50, 0x2a, 0xcb, 0xc7, 0xff, 0x20, 0xf5, 0xb4, - 0x25, 0x53, 0x91, 0xbf, 0xb1, 0xa1, 0x3c, 0x5f, 0xf6, 0x60, 0x7f, 0x8c, - 0xfa, 0x4b, 0x2f, 0xfe, 0xf6, 0x81, 0xce, 0xbc, 0xbf, 0x31, 0xac, 0xbe, - 0x87, 0x66, 0xf4, 0x97, 0xff, 0x74, 0xdf, 0xff, 0xe3, 0xf8, 0xef, 0x16, - 0x5f, 0xdd, 0xc6, 0x31, 0xe4, 0xb2, 0xf3, 0x4d, 0x34, 0x92, 0xff, 0x17, - 0xba, 0x70, 0x5b, 0x24, 0x9e, 0x68, 0x2f, 0x47, 0xf9, 0x24, 0x48, 0xe2, - 0x6d, 0x79, 0x30, 0xa1, 0x21, 0xaf, 0x41, 0x4d, 0x5d, 0x91, 0x96, 0xdf, - 0xf3, 0xfe, 0x59, 0x34, 0xa3, 0xe5, 0x95, 0x0a, 0x80, 0x72, 0x39, 0xd3, - 0x2a, 0xbf, 0xce, 0x42, 0x68, 0x81, 0x25, 0x97, 0xf7, 0xf1, 0xfc, 0x77, - 0x8b, 0x2f, 0xe1, 0x35, 0xa3, 0xf7, 0x16, 0x5f, 0xfb, 0xfd, 0xcc, 0x89, - 0x1f, 0x8a, 0x16, 0x54, 0x1f, 0x7b, 0x97, 0xdf, 0xa2, 0x47, 0x2e, 0x2c, - 0xa8, 0x5e, 0x4e, 0x93, 0x68, 0xa7, 0xdf, 0x43, 0x90, 0xe3, 0x06, 0x98, - 0xcb, 0xb2, 0x8e, 0x9c, 0xd7, 0xf3, 0x32, 0x84, 0xf7, 0x08, 0x2f, 0xdf, - 0xe1, 0xf4, 0x55, 0x97, 0xff, 0xd8, 0x18, 0x27, 0xf7, 0x06, 0x07, 0xd4, - 0x96, 0x57, 0xc7, 0xee, 0xc2, 0x9b, 0xfa, 0x08, 0x2d, 0xdb, 0x71, 0x6e, - 0x56, 0x5f, 0xa1, 0x9a, 0x8d, 0xeb, 0x2f, 0xfe, 0x80, 0xf8, 0xa1, 0xac, - 0xf7, 0x38, 0xb2, 0xff, 0xee, 0xbf, 0x75, 0x1e, 0x30, 0x98, 0xd6, 0x56, - 0x91, 0x0f, 0xfa, 0x25, 0xff, 0xff, 0xc4, 0xec, 0x8d, 0x04, 0x7d, 0x8e, - 0x01, 0xce, 0x5c, 0xeb, 0xc9, 0x65, 0xe0, 0x7b, 0x8b, 0x2f, 0xcd, 0x3f, - 0x61, 0x8b, 0x2f, 0x06, 0x38, 0xb2, 0xff, 0xe1, 0x25, 0x9d, 0x7e, 0x9e, - 0xb5, 0x0b, 0x2a, 0x11, 0x11, 0x85, 0x1f, 0x8e, 0x5f, 0x7b, 0x9b, 0xf1, - 0x65, 0xfd, 0x9b, 0x73, 0x74, 0xc2, 0xb2, 0xa0, 0xf5, 0x48, 0x92, 0xfc, - 0x0d, 0x0b, 0xd3, 0x59, 0x50, 0xac, 0x58, 0x64, 0x61, 0x3d, 0xd4, 0x2c, - 0x1c, 0x93, 0xf7, 0x02, 0x85, 0x2f, 0xa1, 0x09, 0xb8, 0x41, 0x7f, 0x89, - 0xda, 0xc2, 0x71, 0x56, 0x5f, 0xfd, 0x9e, 0xe0, 0x9c, 0x61, 0x46, 0xa1, - 0x65, 0xed, 0xf8, 0x43, 0x3f, 0x66, 0x19, 0x5f, 0xfc, 0xd4, 0x68, 0x9f, - 0x68, 0xd4, 0x49, 0x65, 0x19, 0xfc, 0x74, 0xd2, 0xff, 0xff, 0x74, 0xda, - 0xc6, 0xf3, 0x63, 0xfb, 0x80, 0x96, 0x7d, 0xe5, 0x97, 0xff, 0x68, 0xff, - 0x13, 0xb0, 0xc7, 0x7f, 0x2c, 0xa1, 0xa2, 0xab, 0x4c, 0xb5, 0x88, 0xee, - 0x78, 0x65, 0xdf, 0xf4, 0xc1, 0xe9, 0xb2, 0x34, 0x2a, 0xcb, 0xf6, 0xd3, - 0x81, 0x13, 0x2c, 0xb4, 0x96, 0x5e, 0x10, 0xa6, 0x59, 0x52, 0x35, 0xff, - 0x88, 0xd6, 0x22, 0xe1, 0xce, 0xf8, 0xb7, 0x50, 0xfb, 0x02, 0xfb, 0x4b, - 0x7d, 0x94, 0xe9, 0xa0, 0xe5, 0xf0, 0x65, 0x62, 0x70, 0x2c, 0x39, 0x03, - 0x1a, 0x29, 0xcb, 0x60, 0x9a, 0x72, 0xb3, 0x52, 0xd9, 0xd9, 0x2e, 0x87, - 0xb3, 0xc9, 0xcf, 0x2d, 0x47, 0xf9, 0x47, 0x25, 0x49, 0x3b, 0xe4, 0xe8, - 0xcf, 0xa7, 0xcb, 0x81, 0x38, 0x7e, 0xd4, 0xa6, 0xc1, 0x21, 0xbd, 0x7b, - 0x7c, 0x12, 0xcb, 0xff, 0xec, 0x29, 0xfe, 0x14, 0xfe, 0xe7, 0x73, 0xf7, - 0x59, 0x52, 0x3f, 0x01, 0x8e, 0xde, 0x77, 0x69, 0x65, 0xdf, 0xc2, 0xcb, - 0xf0, 0x73, 0xdd, 0x35, 0x96, 0x71, 0x9e, 0xd1, 0x8e, 0x10, 0xbd, 0xff, - 0xff, 0x67, 0x5c, 0x4e, 0x60, 0xae, 0x5f, 0xc1, 0x44, 0xdd, 0x85, 0x96, - 0x85, 0x97, 0xff, 0xe8, 0xd7, 0x61, 0x8d, 0xe0, 0x82, 0x89, 0xbb, 0x0b, - 0x2f, 0xc7, 0xa9, 0xa3, 0xba, 0x46, 0x6f, 0xec, 0xc4, 0x21, 0x5f, 0x27, - 0x90, 0xc7, 0xc1, 0x21, 0xff, 0x66, 0xd4, 0xb2, 0xff, 0xde, 0xeb, 0xcb, - 0xd3, 0x14, 0x31, 0x65, 0xff, 0x9c, 0xbf, 0x9c, 0x30, 0x3e, 0xa4, 0xb2, - 0xf8, 0xcb, 0x68, 0x59, 0x7b, 0xda, 0x85, 0x97, 0xfc, 0x50, 0xc3, 0x2c, - 0x64, 0x2c, 0xbd, 0xd3, 0x92, 0xcb, 0x8c, 0x78, 0x7d, 0xb3, 0x0e, 0x78, - 0xd6, 0xb7, 0x53, 0x09, 0xd2, 0x09, 0x42, 0x3a, 0xff, 0xe2, 0xf7, 0x3a, - 0xf2, 0x9d, 0x9f, 0x79, 0x65, 0x37, 0x14, 0xf7, 0xa0, 0x5f, 0x23, 0x48, - 0x01, 0xc5, 0xff, 0x3e, 0xec, 0xdc, 0x8e, 0xbe, 0xea, 0xcb, 0xfe, 0x12, - 0x26, 0x12, 0x34, 0xf3, 0x2c, 0xbd, 0x05, 0xb2, 0xcb, 0xe3, 0xe9, 0xb1, - 0x65, 0xba, 0x66, 0xf6, 0x61, 0xcb, 0xdc, 0xf1, 0xac, 0xba, 0x60, 0x2c, - 0xba, 0x03, 0x06, 0xd0, 0x87, 0x2f, 0xfa, 0x3d, 0xd7, 0xfd, 0xfe, 0xe2, - 0xca, 0x19, 0xf2, 0x11, 0x55, 0xff, 0xfe, 0x20, 0x38, 0x78, 0x07, 0x39, - 0x41, 0x07, 0x3e, 0xf2, 0xcb, 0xfe, 0xfe, 0x77, 0x4c, 0x20, 0xd7, 0xeb, - 0x2f, 0x37, 0xc6, 0xea, 0xca, 0xd1, 0xf0, 0x37, 0x9f, 0x5e, 0x98, 0x1a, - 0x59, 0x7f, 0xe7, 0x3d, 0x67, 0xd3, 0xda, 0x69, 0xa5, 0x95, 0x08, 0x87, - 0x72, 0x5e, 0x0f, 0x5f, 0xff, 0x14, 0x4a, 0x70, 0x9e, 0x32, 0x04, 0xb3, - 0x8b, 0x2f, 0xff, 0xdd, 0x07, 0x19, 0x1f, 0x07, 0xa6, 0xc2, 0x3d, 0x96, - 0x50, 0xd5, 0xba, 0xe3, 0xc8, 0x61, 0x7e, 0xc2, 0x1e, 0xc6, 0x8d, 0xf9, - 0x77, 0x14, 0x6e, 0xe0, 0x16, 0x5e, 0xfd, 0xd8, 0xb2, 0xec, 0xfd, 0x65, - 0x41, 0xb4, 0xc1, 0xdb, 0xcf, 0x8c, 0x59, 0x71, 0x4b, 0x64, 0x42, 0x92, - 0x5b, 0x78, 0xfd, 0xf4, 0x74, 0x1a, 0x59, 0x7f, 0x70, 0xb0, 0x64, 0xeb, - 0x28, 0x8f, 0x35, 0xa2, 0x2b, 0x82, 0x6b, 0x2f, 0xc5, 0x1b, 0x47, 0xcb, - 0x2d, 0xc0, 0x9b, 0xe3, 0x16, 0xa8, 0x4c, 0x44, 0xe1, 0x16, 0xec, 0x17, - 0xed, 0x70, 0xa3, 0x65, 0x97, 0xff, 0xcd, 0x60, 0x79, 0x9e, 0x9b, 0x05, - 0x2c, 0xfd, 0x65, 0x61, 0xfd, 0x19, 0x45, 0xff, 0x63, 0x59, 0xa0, 0xbb, - 0x85, 0x51, 0x87, 0x2f, 0xfe, 0x07, 0x07, 0xd7, 0x67, 0xd2, 0x32, 0x59, - 0x7e, 0xf7, 0x5c, 0xbf, 0x59, 0x5b, 0x22, 0xcb, 0xa8, 0xae, 0x8b, 0x7f, - 0xe7, 0xf6, 0x4c, 0xf0, 0x51, 0x32, 0xcb, 0xff, 0x74, 0xf0, 0x4c, 0x99, - 0xa8, 0xf9, 0x65, 0x8f, 0x48, 0xae, 0xe9, 0x87, 0x0f, 0x6e, 0x08, 0x55, - 0x18, 0x22, 0xa4, 0x9e, 0xc8, 0x63, 0x80, 0xfc, 0xd6, 0xff, 0x37, 0x5c, - 0x19, 0x67, 0x5b, 0x0b, 0x2e, 0xc2, 0x59, 0x7f, 0xfb, 0xd0, 0x41, 0xcf, - 0x74, 0xf5, 0xf8, 0x56, 0x5f, 0x86, 0x7c, 0xe9, 0xac, 0xbf, 0x8c, 0xb3, - 0xdd, 0x35, 0x96, 0x8c, 0x3d, 0x2e, 0x13, 0xd0, 0xd1, 0xaf, 0x82, 0xa0, - 0x84, 0xe5, 0xfe, 0x86, 0x73, 0x8e, 0x5b, 0x2c, 0xbf, 0xef, 0xf9, 0x23, - 0xeb, 0x9e, 0xcb, 0x2f, 0xb9, 0x85, 0xe5, 0x97, 0x9b, 0xe3, 0x4b, 0x28, - 0xcf, 0xe9, 0xce, 0x80, 0x43, 0x7b, 0xcf, 0xba, 0xb2, 0xff, 0x7b, 0xa7, - 0x3f, 0xf7, 0x35, 0x97, 0xf8, 0x5e, 0xc4, 0x80, 0xfa, 0x59, 0x62, 0x59, - 0x46, 0x78, 0x80, 0x34, 0xb8, 0x4c, 0x59, 0x5b, 0x2a, 0xf1, 0x1c, 0x62, - 0x7d, 0x34, 0x28, 0x56, 0xf8, 0xb4, 0x03, 0xfb, 0x8f, 0x22, 0x10, 0xdf, - 0x85, 0xfc, 0xe6, 0xe2, 0xcb, 0xee, 0x9b, 0xc9, 0x65, 0xe1, 0xbc, 0x96, - 0x54, 0x1b, 0xdc, 0x21, 0xb0, 0x21, 0x10, 0xff, 0xb4, 0x5f, 0xfe, 0x9c, - 0x4f, 0xe8, 0xd0, 0x25, 0xa8, 0x92, 0xcb, 0xbd, 0xc5, 0x97, 0xe7, 0x15, - 0xa8, 0xd2, 0xca, 0x34, 0x45, 0xba, 0x59, 0x0b, 0xdf, 0xfc, 0x61, 0x2c, - 0x64, 0x4c, 0x38, 0xd9, 0x65, 0xff, 0xd2, 0x2c, 0x63, 0x96, 0x75, 0xd8, - 0xb2, 0xff, 0x83, 0x9e, 0x8d, 0xe6, 0x5f, 0xac, 0xbf, 0xff, 0x81, 0x1e, - 0xe6, 0x14, 0xed, 0x41, 0x8c, 0x9e, 0x4b, 0x2f, 0xc1, 0xef, 0xcf, 0xba, - 0xb2, 0xff, 0x72, 0x24, 0x28, 0xb9, 0xba, 0xb2, 0xff, 0xc3, 0x20, 0x7b, - 0x90, 0x51, 0xc5, 0x95, 0x07, 0xea, 0x67, 0x14, 0x14, 0xf6, 0xbe, 0x44, - 0x34, 0x12, 0x3a, 0x02, 0xd6, 0xf8, 0x50, 0xdf, 0xf9, 0xf5, 0x9b, 0xf0, - 0x7a, 0x26, 0x96, 0x5f, 0xff, 0x80, 0x52, 0xc2, 0xf1, 0xee, 0x67, 0x89, - 0xe4, 0xb2, 0xff, 0x47, 0xf1, 0xdc, 0xfa, 0x4b, 0x28, 0xd1, 0x12, 0x4a, - 0xb5, 0xfa, 0x3a, 0xbd, 0x0c, 0x9b, 0xfe, 0xeb, 0x96, 0x4d, 0x28, 0xf9, - 0x65, 0xff, 0xdd, 0x3d, 0x67, 0x0b, 0x37, 0xf4, 0xd6, 0x5f, 0x8b, 0x38, - 0x09, 0xd8, 0x7f, 0xb3, 0x1c, 0xdf, 0xb4, 0x17, 0x70, 0xaa, 0x20, 0x65, - 0xfc, 0xfb, 0x7e, 0xe4, 0x34, 0x56, 0x0f, 0x5e, 0xce, 0x03, 0x0f, 0xc3, - 0x70, 0xd2, 0xf7, 0x5e, 0x53, 0x91, 0xca, 0x50, 0xb0, 0xbf, 0xee, 0x9e, - 0x16, 0x04, 0x78, 0xb2, 0x98, 0x9f, 0xdf, 0xa3, 0x8b, 0xde, 0x75, 0x7b, - 0xc0, 0x85, 0x97, 0xdf, 0xeb, 0x9c, 0x59, 0x7f, 0xbf, 0xf1, 0xec, 0xc8, - 0x0a, 0xca, 0xf8, 0xfd, 0x5c, 0x70, 0x89, 0x2f, 0xc3, 0x6e, 0x5c, 0x6d, - 0xca, 0xcb, 0xff, 0xf3, 0xcb, 0x86, 0x39, 0xd9, 0x9f, 0x7e, 0xe5, 0xe5, - 0x95, 0x0b, 0x95, 0x19, 0x2d, 0x0c, 0xe1, 0x5c, 0xe5, 0xc0, 0x32, 0xb8, - 0xe4, 0xb2, 0xfe, 0xfb, 0xc3, 0xcc, 0x15, 0x65, 0x0c, 0xf1, 0x70, 0x5a, - 0xd0, 0xb2, 0xfa, 0x08, 0xff, 0x59, 0x6c, 0xe9, 0xb1, 0xf0, 0x85, 0xfe, - 0xd1, 0x3b, 0x42, 0x7c, 0xd2, 0xcb, 0xbf, 0xde, 0xb2, 0x86, 0x7a, 0x3d, - 0x37, 0xbc, 0xfa, 0xd9, 0x51, 0x82, 0xaf, 0xfc, 0xfa, 0xc2, 0xff, 0x9e, - 0xe7, 0xcb, 0x2f, 0xff, 0xff, 0xec, 0xf7, 0x5c, 0x85, 0x9d, 0xcd, 0x3b, - 0xfb, 0x7e, 0x0e, 0x76, 0x31, 0xcb, 0xe9, 0x2e, 0x20, 0xb5, 0xff, 0x9d, - 0xc5, 0x0b, 0x8e, 0x70, 0xad, 0x2e, 0x20, 0xb5, 0xff, 0xdd, 0x3e, 0x9c, - 0x17, 0xa7, 0x0a, 0xd2, 0xe2, 0x0b, 0x5f, 0xe8, 0x32, 0xf4, 0xe1, 0x5a, - 0x5c, 0x41, 0x6b, 0xf9, 0x98, 0x39, 0xc2, 0xb4, 0xb8, 0x82, 0xd7, 0xff, - 0xfc, 0xe4, 0x46, 0xc9, 0xdc, 0x0f, 0x4f, 0x46, 0x2e, 0xd8, 0xd2, 0xe2, - 0x0b, 0x5d, 0xf4, 0xe1, 0xa7, 0x38, 0x15, 0x0d, 0x2a, 0x3a, 0x19, 0x1f, - 0xd4, 0x2a, 0xcf, 0xea, 0x01, 0x4a, 0x37, 0xbf, 0xc7, 0x02, 0xf3, 0xdc, - 0xf9, 0x65, 0xf3, 0xeb, 0xf7, 0x59, 0x7f, 0xf7, 0x4f, 0xa7, 0x05, 0xe9, - 0xc2, 0xb4, 0xb8, 0x82, 0xd7, 0xfd, 0x37, 0x02, 0x7b, 0x4e, 0x15, 0xa5, - 0xc4, 0x16, 0xbf, 0x7b, 0x90, 0xc9, 0xc1, 0x45, 0x08, 0x8a, 0x97, 0xff, - 0xa7, 0x07, 0xa6, 0x18, 0xf7, 0x27, 0x0a, 0xd2, 0xe2, 0x0b, 0x5f, 0xff, - 0xfc, 0x44, 0x6c, 0x9c, 0x0c, 0x9d, 0xc0, 0xf4, 0xf4, 0x62, 0xed, 0x8d, - 0x2e, 0x20, 0xb5, 0x62, 0x64, 0xbf, 0x21, 0xba, 0xf5, 0xff, 0x74, 0xf4, - 0x62, 0xed, 0x8d, 0x2e, 0x20, 0xb5, 0xff, 0xf3, 0xbf, 0xd2, 0xe7, 0x4c, - 0x63, 0x8d, 0x42, 0x4b, 0xff, 0x64, 0xa4, 0x0e, 0x68, 0xb6, 0xdc, 0x5c, - 0x41, 0x6a, 0x0a, 0x39, 0xf4, 0x91, 0xc4, 0xfb, 0xff, 0x04, 0xf5, 0xe7, - 0xff, 0x93, 0x9a, 0x5c, 0x41, 0x6b, 0xfb, 0xa7, 0xde, 0x9f, 0xea, 0x80, - 0x2d, 0x7e, 0xcf, 0xe7, 0x0a, 0xd2, 0xe2, 0x0b, 0x5d, 0x9e, 0x09, 0xfa, - 0xf4, 0xee, 0xbe, 0x47, 0x97, 0x21, 0x8b, 0x7f, 0x33, 0x07, 0x38, 0x56, - 0x97, 0x10, 0x5a, 0xff, 0xc1, 0xe9, 0xe8, 0xc5, 0xdb, 0x1a, 0x5c, 0x41, - 0x6b, 0xb2, 0x73, 0xa2, 0x37, 0x87, 0xf7, 0xf8, 0x06, 0xc7, 0x2f, 0xa4, - 0xb8, 0x82, 0xd7, 0xfe, 0xc3, 0xdf, 0x85, 0x83, 0x79, 0x2e, 0x20, 0xb3, - 0x0f, 0x02, 0x86, 0xbc, 0x1b, 0xa3, 0x7f, 0xcd, 0x4a, 0x3e, 0x8e, 0x46, - 0x2f, 0xe8, 0xc8, 0x81, 0x0b, 0x66, 0x9b, 0xee, 0xfe, 0x15, 0x10, 0x5a, - 0x7a, 0x23, 0x2e, 0x70, 0xac, 0xb7, 0x02, 0xc9, 0xe0, 0xfe, 0x93, 0x25, - 0xe3, 0x8b, 0xa4, 0xde, 0xb2, 0xf4, 0x49, 0xbd, 0x65, 0x41, 0xb9, 0x21, - 0xaa, 0xd9, 0x96, 0xce, 0x35, 0x2f, 0x9d, 0xff, 0xa5, 0x01, 0x13, 0xed, - 0xff, 0xd9, 0x22, 0xcf, 0x74, 0xf3, 0xef, 0x2c, 0xbf, 0xd1, 0xd3, 0x6b, - 0xe9, 0x71, 0x65, 0xfa, 0x3d, 0xce, 0x9a, 0xcb, 0xff, 0x6b, 0x05, 0xee, - 0x30, 0x1a, 0xd9, 0x65, 0xff, 0x7c, 0x58, 0x6c, 0xc2, 0xfd, 0x65, 0xfa, - 0x5e, 0xe6, 0x12, 0xcb, 0xff, 0xce, 0x18, 0x21, 0x96, 0x6f, 0xd1, 0xf1, - 0x65, 0xff, 0xb9, 0x34, 0x80, 0x39, 0xa4, 0x01, 0xac, 0xad, 0x93, 0x88, - 0x91, 0xa8, 0xc9, 0xf1, 0x07, 0xe3, 0x8e, 0x93, 0xf9, 0x26, 0xff, 0xe8, - 0xfa, 0x42, 0x33, 0x9e, 0x8f, 0x9a, 0x59, 0x7e, 0x93, 0x7b, 0x78, 0x36, - 0x59, 0x6e, 0x99, 0xfc, 0xba, 0x4d, 0xfb, 0x51, 0xf4, 0xb8, 0xb2, 0xa4, - 0x79, 0xfa, 0x26, 0xbc, 0xc7, 0xf2, 0xcb, 0xff, 0x03, 0x9b, 0x99, 0xaf, - 0xd8, 0x7c, 0x59, 0x7f, 0xf6, 0xfd, 0xf1, 0xc7, 0xef, 0xd2, 0xcf, 0x2c, - 0xaf, 0xd1, 0x18, 0x22, 0x1d, 0xfe, 0xfc, 0x1e, 0x28, 0xf7, 0x16, 0x54, - 0x93, 0x01, 0xfe, 0x15, 0x1c, 0x25, 0xa8, 0x55, 0x11, 0x91, 0x97, 0x3c, - 0x64, 0x77, 0xf3, 0xca, 0x37, 0xbf, 0x56, 0x5f, 0xfd, 0x9f, 0x7b, 0x86, - 0x51, 0xfb, 0xb1, 0x65, 0xfe, 0xe3, 0xf4, 0xf9, 0x12, 0x59, 0x7f, 0xe6, - 0xde, 0x11, 0x60, 0x90, 0x5f, 0xac, 0xbf, 0xd9, 0xd3, 0xe1, 0x82, 0x4b, - 0x2b, 0x64, 0x74, 0xf9, 0x10, 0x06, 0x4d, 0xe8, 0x37, 0xdf, 0x72, 0x3e, - 0x59, 0x7f, 0xe9, 0x67, 0xd2, 0xd4, 0x79, 0xfc, 0xb2, 0xf3, 0x22, 0x4b, - 0x2f, 0xd8, 0x3e, 0x81, 0xa5, 0x95, 0x39, 0x15, 0x13, 0x12, 0x39, 0xf9, - 0x0e, 0x5f, 0xf0, 0x7a, 0x63, 0xec, 0x7b, 0x8b, 0x2f, 0x0d, 0xfc, 0xb2, - 0xff, 0xdc, 0x82, 0x89, 0x7b, 0xb8, 0x4b, 0x2b, 0x48, 0xcf, 0x61, 0xf3, - 0x9c, 0xf0, 0x72, 0xf1, 0xee, 0x62, 0xcb, 0xfb, 0x86, 0x3c, 0x6b, 0x8b, - 0x2e, 0xd7, 0xeb, 0x2e, 0xc6, 0x96, 0x53, 0x9a, 0xff, 0x0c, 0x5b, 0xe8, - 0x44, 0xdf, 0xc3, 0xde, 0x5d, 0xbe, 0x6b, 0x3a, 0xeb, 0x2f, 0x85, 0xd1, - 0xb4, 0xb2, 0xfd, 0xb3, 0xf6, 0x37, 0x56, 0x53, 0x74, 0x79, 0xf8, 0x49, - 0x7f, 0x0b, 0xd8, 0xfb, 0xd8, 0xb2, 0xff, 0x16, 0x0f, 0xb0, 0xd1, 0x2c, - 0xa8, 0x3e, 0x1d, 0x17, 0xd4, 0x2e, 0x7b, 0x64, 0x62, 0xe7, 0x1d, 0xc3, - 0xc3, 0x5f, 0xf3, 0x72, 0x71, 0x04, 0x21, 0xef, 0xd2, 0xcd, 0xbd, 0x0b, - 0x2f, 0xfe, 0x28, 0xd9, 0x9d, 0x3d, 0x69, 0xe4, 0xb2, 0x96, 0x54, 0xc7, - 0xee, 0x45, 0x1b, 0x88, 0x97, 0xfb, 0x6d, 0xa0, 0xbe, 0xcf, 0x2c, 0xbf, - 0x0f, 0x30, 0x82, 0xb2, 0xe8, 0x99, 0x65, 0x6c, 0x6f, 0x7f, 0x26, 0xac, - 0x46, 0x39, 0x99, 0x01, 0xca, 0xff, 0xed, 0x10, 0x3e, 0xf1, 0x66, 0xce, - 0x4b, 0x2f, 0xff, 0xe1, 0xf4, 0x1b, 0x1e, 0x6b, 0x59, 0x1f, 0x48, 0xd8, - 0xb2, 0xf3, 0xeb, 0x65, 0x97, 0x7f, 0x0b, 0x2f, 0x8e, 0x19, 0x8b, 0x29, - 0x65, 0xfc, 0xe2, 0xfa, 0x35, 0xfa, 0xca, 0x19, 0xba, 0x20, 0xbb, 0xff, - 0xfd, 0x06, 0x32, 0x80, 0x07, 0xd8, 0x11, 0xc0, 0x44, 0x62, 0xcb, 0xbf, - 0x85, 0x97, 0x40, 0xab, 0x2f, 0xfb, 0x3d, 0xc8, 0x60, 0x99, 0x32, 0xcb, - 0xfd, 0xcc, 0xe9, 0xf0, 0x1b, 0x2c, 0xb9, 0xa6, 0x92, 0x5f, 0xf1, 0x66, - 0xf7, 0x97, 0x0c, 0x6b, 0x28, 0x29, 0xfe, 0x18, 0xee, 0x85, 0xd8, 0xb5, - 0xd2, 0x0f, 0xd8, 0x1b, 0x62, 0xe4, 0x2f, 0xc3, 0xa6, 0x8d, 0x04, 0x19, - 0xbc, 0xd3, 0x4d, 0x24, 0xb3, 0x12, 0x4f, 0x34, 0x17, 0xd3, 0x3b, 0xe9, - 0x24, 0xf4, 0x70, 0x89, 0x0b, 0xea, 0xd9, 0x5e, 0x30, 0x51, 0x1e, 0x59, - 0xcd, 0xfd, 0xe8, 0xce, 0xe6, 0xcb, 0x2e, 0xc6, 0x2c, 0xaf, 0x8f, 0x0f, - 0x85, 0xb5, 0x0e, 0xc9, 0x72, 0x52, 0x85, 0x86, 0x91, 0x92, 0xed, 0x05, - 0x94, 0x0f, 0xf4, 0xa8, 0x63, 0x96, 0x53, 0xa8, 0xc2, 0x59, 0x0b, 0x4e, - 0xcf, 0x57, 0xbd, 0x30, 0x07, 0xf5, 0x92, 0x9c, 0x53, 0xe4, 0xe9, 0x8f, - 0xa3, 0xb7, 0x04, 0xbf, 0x4d, 0xef, 0x97, 0x09, 0xe5, 0x97, 0xf6, 0x7f, - 0xf9, 0xea, 0x4b, 0x2e, 0x0e, 0x2c, 0xa1, 0x9e, 0x2b, 0x97, 0xdd, 0x8d, - 0x2c, 0xba, 0x3c, 0xb2, 0xb6, 0x35, 0xa1, 0x17, 0xb3, 0x16, 0x56, 0x1b, - 0x3f, 0x11, 0x5f, 0xe9, 0x19, 0x63, 0x01, 0xd5, 0x97, 0xfe, 0xcf, 0x73, - 0xa6, 0xc7, 0xcd, 0x2c, 0xa8, 0x3e, 0xf2, 0x32, 0xbf, 0x64, 0xec, 0xff, - 0xcb, 0x2f, 0xa7, 0x7a, 0x37, 0xac, 0xbe, 0xc6, 0x67, 0x96, 0x5e, 0xf3, - 0x8a, 0xb2, 0xf9, 0xd8, 0xf3, 0x2c, 0xbf, 0x13, 0xfb, 0xee, 0x2c, 0xbf, - 0xff, 0xf3, 0xcc, 0x09, 0x00, 0x33, 0xba, 0x7e, 0xf4, 0x7d, 0x1b, 0x47, - 0x16, 0x5f, 0x89, 0xf7, 0x76, 0x99, 0x65, 0xf4, 0xdc, 0x8f, 0x2c, 0xa0, - 0xa3, 0x02, 0x67, 0x10, 0x16, 0x5f, 0xff, 0xe2, 0x77, 0xdf, 0x12, 0xec, - 0x6b, 0x68, 0xf7, 0x1e, 0x4b, 0x2f, 0xe8, 0x0f, 0xb8, 0xff, 0x2c, 0xad, - 0xd4, 0x47, 0x93, 0x0d, 0xe3, 0xfa, 0x65, 0x97, 0xc0, 0x6d, 0xb0, 0xd6, - 0x5f, 0xb3, 0x36, 0x07, 0x16, 0x5f, 0x68, 0x8f, 0xf5, 0x97, 0xc6, 0x17, - 0xd2, 0xcb, 0xa3, 0xf5, 0x97, 0xc0, 0xd8, 0x13, 0xfa, 0x6e, 0x04, 0x21, - 0xa3, 0x44, 0xbf, 0x56, 0xad, 0xfa, 0xcb, 0xb0, 0x2b, 0x2b, 0x74, 0xd4, - 0x74, 0x4a, 0xfc, 0xf1, 0xf6, 0x05, 0x65, 0xff, 0x75, 0xf9, 0xd3, 0xd9, - 0xc9, 0x65, 0xf3, 0xec, 0x24, 0x96, 0x53, 0x61, 0x77, 0xf9, 0xb2, 0xbb, - 0x10, 0x81, 0x94, 0x23, 0xc6, 0x41, 0x85, 0x5f, 0x13, 0x19, 0x0e, 0xe8, - 0xec, 0xc4, 0x5a, 0x87, 0x43, 0xc3, 0x03, 0xf2, 0x56, 0xd8, 0xf7, 0x09, - 0xbd, 0x0b, 0xf0, 0x25, 0x34, 0x48, 0x21, 0x3b, 0x79, 0xc5, 0xfc, 0x40, - 0x1b, 0x1e, 0x4b, 0x2f, 0x1e, 0xc0, 0x59, 0x7e, 0x8f, 0xcf, 0xec, 0x59, - 0x73, 0x37, 0xac, 0xb0, 0xe0, 0xf0, 0x48, 0xa2, 0xff, 0xf4, 0x8a, 0x27, - 0x30, 0xa0, 0x5f, 0x1e, 0xcb, 0x2f, 0xce, 0xcc, 0xeb, 0x16, 0x57, 0xc7, - 0xe7, 0xe4, 0xcb, 0xde, 0xd4, 0x2c, 0xbf, 0x16, 0x6c, 0x24, 0x96, 0x5f, - 0xde, 0xdf, 0x85, 0x83, 0x59, 0x53, 0x1e, 0xbf, 0x0a, 0x6f, 0xec, 0xe6, - 0x48, 0xf4, 0xb2, 0xf7, 0x63, 0x7a, 0xcb, 0xdc, 0x96, 0xcb, 0x2b, 0x0d, - 0xe0, 0x83, 0xd5, 0x0a, 0x99, 0xa4, 0x5b, 0x8b, 0xc7, 0x09, 0x96, 0x11, - 0xbb, 0x99, 0x11, 0xf9, 0xa2, 0xf3, 0xce, 0x11, 0x65, 0xe9, 0x8f, 0xab, - 0x2f, 0xe8, 0xd3, 0xcc, 0x7d, 0x59, 0x7e, 0xe0, 0xe0, 0xb6, 0x73, 0xca, - 0xe0, 0xed, 0xfd, 0x9b, 0x47, 0x7b, 0x0b, 0x2f, 0xd9, 0x37, 0x70, 0x96, - 0x5f, 0xd1, 0x82, 0x10, 0x3f, 0x59, 0x5a, 0x44, 0x17, 0x4b, 0x48, 0x9e, - 0xf3, 0x21, 0x8b, 0x2b, 0xe4, 0xc2, 0xf5, 0x0c, 0x06, 0x17, 0xdf, 0xff, - 0x14, 0xa7, 0x60, 0xcf, 0x9f, 0x78, 0x0f, 0xc5, 0x97, 0xee, 0x80, 0xa3, - 0x7a, 0xcb, 0xf8, 0x9f, 0xd2, 0x81, 0x56, 0x54, 0x1e, 0xb0, 0x85, 0x37, - 0xd9, 0x9f, 0x49, 0x65, 0xee, 0x1c, 0xcb, 0x2c, 0x29, 0x1b, 0xfe, 0x11, - 0x5f, 0xf6, 0x8e, 0x3d, 0x9b, 0xdc, 0x6b, 0x2f, 0xfd, 0xb1, 0x47, 0xc6, - 0x32, 0x8d, 0x96, 0x5f, 0xf3, 0xb2, 0x3a, 0xfc, 0x8d, 0xd5, 0x94, 0xe7, - 0xf2, 0x47, 0xf5, 0xa4, 0x7c, 0xf4, 0x9c, 0xa1, 0x65, 0x7e, 0x9d, 0xd8, - 0xd4, 0x96, 0x54, 0xe5, 0xc0, 0xb8, 0x8d, 0xd3, 0x0d, 0xc3, 0x0a, 0x87, - 0x8d, 0x69, 0xa3, 0x4b, 0xcc, 0xe4, 0x2c, 0xbf, 0xb6, 0x9a, 0x4d, 0x9d, - 0x6c, 0xb2, 0xf9, 0x98, 0xfd, 0x59, 0x6d, 0x96, 0x5f, 0xbd, 0xd3, 0x66, - 0x96, 0x54, 0x8d, 0xd6, 0x84, 0xaf, 0x74, 0x66, 0xb2, 0xfd, 0xdc, 0x39, - 0x71, 0x65, 0xff, 0xf7, 0x60, 0x49, 0xfe, 0x27, 0xff, 0x9c, 0x8f, 0xd2, - 0x5f, 0xb3, 0xce, 0x06, 0xda, 0xcb, 0xf6, 0x82, 0xee, 0x15, 0xc4, 0x08, - 0xbd, 0xc8, 0xf9, 0x65, 0xf1, 0xf3, 0x52, 0x59, 0x6f, 0xf0, 0xfc, 0xfe, - 0x34, 0x60, 0xed, 0xf1, 0x63, 0x4d, 0xeb, 0x2e, 0x3d, 0x96, 0x51, 0x9b, - 0xcf, 0x12, 0xdf, 0x6c, 0x4e, 0xc5, 0x97, 0x39, 0x2c, 0xa8, 0x36, 0xfb, - 0x11, 0x54, 0x95, 0x01, 0x8c, 0x9f, 0xe5, 0x4d, 0x42, 0x79, 0x8e, 0x5e, - 0x57, 0xbf, 0x9f, 0x59, 0xbf, 0x06, 0xb2, 0xfc, 0x17, 0x17, 0xa6, 0xb2, - 0xbf, 0x3d, 0x62, 0x2e, 0xbc, 0x37, 0x92, 0xcb, 0x49, 0x65, 0x41, 0xad, - 0x6f, 0x1c, 0xbe, 0xf6, 0xce, 0x4b, 0x2f, 0x32, 0x02, 0xb2, 0xe7, 0x15, - 0x65, 0x61, 0xb3, 0x21, 0xcb, 0xfc, 0x2e, 0x6c, 0x0f, 0x6f, 0xf2, 0xcb, - 0xfe, 0x79, 0x6a, 0x36, 0x7d, 0x05, 0x65, 0xe1, 0x4f, 0xcb, 0x2f, 0x71, - 0xfc, 0xb2, 0x85, 0x37, 0x3f, 0x0e, 0xdd, 0x3b, 0xab, 0x2f, 0xe6, 0x78, - 0xc6, 0x08, 0x59, 0x79, 0x9e, 0x0a, 0xcb, 0x7a, 0x0f, 0x2b, 0x0b, 0x6f, - 0xe8, 0x66, 0x0b, 0x1c, 0x59, 0x5b, 0x2a, 0x1a, 0xc2, 0x30, 0xaa, 0xe8, - 0x7d, 0x87, 0x1d, 0x72, 0xfc, 0x8c, 0x98, 0xfc, 0x4d, 0x7f, 0xe0, 0x7f, - 0xdc, 0xfa, 0x5e, 0x39, 0x96, 0x5d, 0xa0, 0x2c, 0xbf, 0xc4, 0xed, 0x73, - 0x91, 0xfa, 0xcb, 0xd0, 0xfa, 0x59, 0x7f, 0xda, 0xd1, 0xfd, 0x2f, 0x3f, - 0xcb, 0x2f, 0x6e, 0x38, 0xab, 0x2f, 0xfa, 0x19, 0x2c, 0xdb, 0x00, 0xdb, - 0x59, 0x7f, 0xd1, 0xf9, 0xcb, 0xa6, 0x5f, 0xac, 0xb6, 0xcb, 0x2e, 0x7f, - 0x68, 0xf2, 0xdb, 0x67, 0x35, 0x88, 0xd9, 0x32, 0x07, 0x84, 0x45, 0xe6, - 0xa0, 0x45, 0x97, 0x9c, 0x86, 0xba, 0xbe, 0x97, 0xd2, 0x04, 0x0a, 0xb2, - 0xdf, 0xac, 0xac, 0x36, 0xae, 0x47, 0x50, 0xa9, 0x18, 0x62, 0xe2, 0x9a, - 0x18, 0xde, 0xa3, 0x14, 0xe9, 0x97, 0xe3, 0xde, 0x5d, 0xbf, 0xde, 0xee, - 0x4b, 0xa7, 0xbd, 0x65, 0xf3, 0x34, 0x0d, 0x96, 0x5f, 0xff, 0x11, 0x8b, - 0x3f, 0x9e, 0xe8, 0x1e, 0x52, 0x85, 0x95, 0x07, 0xed, 0x84, 0x97, 0xee, - 0xe7, 0xb9, 0x0b, 0x2b, 0x64, 0xda, 0xe4, 0xf2, 0x2c, 0x2a, 0xc2, 0x41, - 0x7d, 0x83, 0x79, 0x2c, 0xbf, 0x39, 0x11, 0xb1, 0x65, 0xec, 0xde, 0x22, - 0xcb, 0x8f, 0xab, 0x2f, 0x0d, 0xe4, 0xb2, 0xf9, 0xd9, 0x8c, 0x59, 0x7c, - 0x6c, 0x8d, 0xd5, 0x97, 0x1e, 0xa7, 0x1e, 0x2e, 0x10, 0xd0, 0xd1, 0x4b, - 0x82, 0xdd, 0x61, 0xbf, 0x1b, 0x1c, 0xb1, 0x65, 0x4e, 0x66, 0x10, 0xb7, - 0x63, 0x90, 0x6d, 0x25, 0xb1, 0x90, 0xe4, 0xa1, 0xf1, 0x61, 0x6a, 0x72, - 0x9a, 0x7b, 0x08, 0x07, 0x97, 0xe7, 0xfa, 0x29, 0x10, 0xf0, 0x94, 0x10, - 0xc4, 0xdc, 0x2f, 0xbf, 0x80, 0x38, 0xec, 0x08, 0xb2, 0xfe, 0xce, 0xe0, - 0x41, 0x8b, 0x2f, 0xc7, 0xe8, 0xf7, 0x12, 0x5f, 0x06, 0x3d, 0xc4, 0x97, - 0x34, 0xd2, 0x4a, 0x91, 0xf1, 0x61, 0x3b, 0x44, 0x56, 0x69, 0x24, 0xf3, - 0x5f, 0x79, 0xcb, 0xf5, 0x95, 0x87, 0x80, 0x29, 0x25, 0xf4, 0xc4, 0xed, - 0x2c, 0xbd, 0x37, 0x4d, 0x65, 0xff, 0xf7, 0xa0, 0x39, 0x85, 0xee, 0x9c, - 0x16, 0xcb, 0x29, 0x65, 0x61, 0xec, 0x71, 0x36, 0x86, 0xa8, 0x1a, 0x62, - 0xef, 0xe1, 0xfa, 0x44, 0x5c, 0x23, 0x69, 0xd6, 0xff, 0xf1, 0x47, 0xdf, - 0xe1, 0x44, 0xb5, 0xa8, 0x59, 0x7f, 0xef, 0x73, 0x03, 0xd7, 0x2f, 0x71, - 0x65, 0xe3, 0x2f, 0xd6, 0x4e, 0x37, 0xd4, 0xc4, 0x5a, 0xef, 0x84, 0x3d, - 0xff, 0xe8, 0x15, 0x87, 0x8c, 0xf7, 0x00, 0x5e, 0x59, 0x50, 0x7e, 0x9d, - 0x2a, 0xbf, 0xa3, 0xb1, 0xd8, 0xd9, 0x65, 0xff, 0xec, 0x91, 0xbf, 0xd2, - 0xf7, 0x08, 0xc5, 0x59, 0x5b, 0x1f, 0xbc, 0x8b, 0x6e, 0x7e, 0x2c, 0xb7, - 0x60, 0xdc, 0xb9, 0x1d, 0xfa, 0x5d, 0x04, 0x69, 0x65, 0xff, 0xce, 0xcd, - 0x46, 0xf3, 0xde, 0x40, 0xe2, 0xca, 0xf8, 0xfb, 0xfa, 0x51, 0x7e, 0xc0, - 0x32, 0x38, 0xb2, 0x96, 0x5d, 0x93, 0x68, 0xd9, 0x70, 0x9e, 0xff, 0x8c, - 0x0d, 0xbe, 0xc0, 0x85, 0xb2, 0xcb, 0xfe, 0x8d, 0xa3, 0xef, 0x16, 0x6c, - 0xb2, 0xb1, 0x14, 0xa1, 0x2d, 0x33, 0xeb, 0xff, 0x84, 0xe1, 0xf2, 0x63, - 0x1e, 0x17, 0xeb, 0x2f, 0x98, 0x51, 0xf2, 0xca, 0x19, 0xf4, 0x3a, 0x35, - 0x4c, 0x9d, 0x8e, 0xa1, 0xf5, 0xd8, 0x4b, 0x5f, 0x67, 0x73, 0x65, 0x97, - 0xa4, 0xfa, 0x59, 0x7f, 0x7e, 0xc7, 0x96, 0x0d, 0x65, 0xf6, 0x7b, 0x06, - 0x92, 0xff, 0x9c, 0x85, 0xc2, 0x7f, 0x71, 0x65, 0xf3, 0x8b, 0xfb, 0x4b, - 0x2a, 0x47, 0xfb, 0xd2, 0x12, 0x37, 0xbe, 0x82, 0x28, 0x59, 0x53, 0x26, - 0x29, 0xa1, 0xcf, 0x42, 0xac, 0x42, 0xeb, 0xef, 0xf8, 0xcd, 0x2c, 0xa1, - 0x53, 0x9f, 0x38, 0xcd, 0xbc, 0x8b, 0x7f, 0xc5, 0x9d, 0xc9, 0xdd, 0xcd, - 0x96, 0x5f, 0xff, 0x16, 0x78, 0xf0, 0xbb, 0x9e, 0xe9, 0x85, 0x65, 0xff, - 0x78, 0xd9, 0xce, 0xc0, 0x84, 0xb2, 0xff, 0xdf, 0xc1, 0x05, 0xfc, 0xff, - 0x7f, 0x39, 0x10, 0xbf, 0x26, 0x5f, 0xc0, 0x6d, 0x9e, 0xb5, 0x8b, 0x2f, - 0xf7, 0x70, 0x57, 0x83, 0xdc, 0x59, 0x74, 0x6c, 0xb2, 0xf7, 0x62, 0x65, - 0x97, 0xfa, 0x0c, 0xb3, 0x61, 0x24, 0xb2, 0xdf, 0x0c, 0xf9, 0xf0, 0x5f, - 0xa3, 0xb6, 0xe0, 0x51, 0xa2, 0x08, 0x4e, 0x5f, 0x78, 0x5c, 0xea, 0xcb, - 0xb5, 0x25, 0x97, 0xfe, 0x2c, 0xf7, 0x81, 0xb7, 0xb0, 0x2b, 0x2f, 0xc3, - 0x03, 0xea, 0x4b, 0x2d, 0xc5, 0x97, 0x1f, 0xeb, 0x2e, 0xe9, 0xac, 0xb8, - 0x1c, 0x9c, 0x6b, 0x66, 0x17, 0xa7, 0x3e, 0xef, 0xcf, 0xae, 0xfe, 0x16, - 0x5d, 0xfc, 0x2c, 0xbf, 0x02, 0x58, 0x53, 0xcc, 0xd7, 0x7e, 0x2f, 0x50, - 0x9c, 0xf0, 0xc8, 0xc5, 0x17, 0x33, 0xff, 0xe1, 0x2c, 0x4a, 0x17, 0xff, - 0xd8, 0x4f, 0xf7, 0x05, 0x15, 0xe7, 0x05, 0x9f, 0xac, 0xbf, 0xec, 0x3f, - 0xbd, 0xa8, 0xcf, 0x96, 0x5f, 0xfd, 0xee, 0xe3, 0x04, 0x8f, 0xf3, 0xef, - 0x2c, 0xbf, 0xdf, 0x04, 0xf4, 0x24, 0x0d, 0x65, 0xf7, 0xec, 0x79, 0x4e, - 0x4c, 0x28, 0x95, 0x78, 0x73, 0xe4, 0x7b, 0x81, 0xe5, 0x97, 0xf7, 0xec, - 0x13, 0x82, 0x6c, 0xb2, 0xfe, 0xe1, 0x91, 0x47, 0xcb, 0x2e, 0xcf, 0x96, - 0x57, 0xc7, 0xed, 0xe3, 0x3d, 0xc2, 0xcb, 0xff, 0xc2, 0x43, 0x51, 0x34, - 0x9c, 0xb3, 0xef, 0x2c, 0xbe, 0xff, 0x47, 0xa5, 0x95, 0x09, 0xc3, 0x49, - 0x5d, 0xe1, 0x1b, 0xc3, 0x36, 0x93, 0x2f, 0xfc, 0x1d, 0x43, 0x0e, 0x68, - 0x7d, 0xd5, 0x97, 0x81, 0xf7, 0x96, 0x59, 0xd6, 0x51, 0x1f, 0x7f, 0x10, - 0x7c, 0x3d, 0x76, 0x34, 0xb2, 0xff, 0xa3, 0xec, 0xfe, 0x37, 0xe6, 0xcb, - 0x2f, 0xe2, 0xcf, 0x71, 0xff, 0x59, 0x5a, 0x44, 0x07, 0xe2, 0xfc, 0x3c, - 0xbf, 0xc5, 0xb1, 0xeb, 0xee, 0xec, 0xb2, 0xff, 0xa3, 0x6e, 0x6b, 0x03, - 0x1b, 0x2c, 0xbf, 0xd8, 0x5b, 0x60, 0xdf, 0xab, 0x2a, 0x63, 0xec, 0x68, - 0xea, 0xfe, 0xc6, 0x60, 0xcd, 0xa5, 0x97, 0x32, 0x16, 0x53, 0x0f, 0x0d, - 0xcb, 0x6f, 0xe2, 0xc9, 0xba, 0x7e, 0x59, 0x7d, 0x99, 0xde, 0x2c, 0xa8, - 0x4d, 0xe3, 0x21, 0x44, 0xec, 0xfe, 0x21, 0x6f, 0x2d, 0xbc, 0xd3, 0x4d, - 0x24, 0xbf, 0x60, 0xa4, 0x0e, 0x24, 0x9e, 0x68, 0x2f, 0xa7, 0xb4, 0xd3, - 0x4b, 0x2e, 0xcf, 0xd6, 0x56, 0x1b, 0xff, 0x14, 0x54, 0x22, 0x67, 0xcf, - 0x37, 0xff, 0xc7, 0x27, 0xe3, 0x18, 0xf2, 0x71, 0x7a, 0x6b, 0x2f, 0x8f, - 0x5f, 0xf1, 0x65, 0xff, 0xd0, 0x06, 0xde, 0x6e, 0x16, 0x34, 0xff, 0xac, - 0xbf, 0xee, 0x6a, 0x01, 0xe2, 0x3d, 0xeb, 0x2f, 0xfc, 0x59, 0xc0, 0xf4, - 0xc3, 0x04, 0xb2, 0xff, 0xff, 0x0a, 0xd3, 0xe8, 0x59, 0xfc, 0xc9, 0x10, - 0x1f, 0x98, 0x4b, 0x2a, 0x11, 0xb5, 0x87, 0x46, 0x79, 0x7f, 0x68, 0x01, - 0xe9, 0xf1, 0x65, 0xf3, 0x4e, 0x52, 0x59, 0x7f, 0xde, 0x8f, 0xbf, 0x7e, - 0xf4, 0xd6, 0x5b, 0xab, 0x2b, 0x0f, 0x2c, 0x27, 0x57, 0xdc, 0x36, 0x42, - 0xcb, 0xf1, 0x67, 0xa3, 0x4b, 0x2f, 0x34, 0xd3, 0x49, 0x2f, 0xce, 0x2f, - 0x4f, 0xc9, 0x27, 0x9a, 0x0a, 0x84, 0x40, 0x1a, 0x35, 0xed, 0xf0, 0xc5, - 0x97, 0xbc, 0x6d, 0x2c, 0xbd, 0xc7, 0xd2, 0xca, 0xf8, 0xdc, 0xf8, 0x76, - 0xf7, 0x60, 0x6b, 0x2b, 0x11, 0x2a, 0x6a, 0xee, 0x45, 0x7d, 0xfe, 0x64, - 0xcb, 0x2f, 0xb9, 0x85, 0xe5, 0x95, 0x87, 0x88, 0xe4, 0x76, 0xe4, 0xe5, - 0x41, 0x3f, 0x10, 0xea, 0x14, 0x3d, 0x85, 0xb1, 0x38, 0xda, 0x43, 0x55, - 0xa9, 0x92, 0x9d, 0xa9, 0xb2, 0xac, 0xcc, 0x12, 0xc0, 0xaf, 0xcd, 0xbe, - 0xc6, 0xc0, 0x59, 0x7f, 0xf1, 0xfa, 0x35, 0x85, 0xe7, 0x72, 0x59, 0x53, - 0x2e, 0xa2, 0xe8, 0x8f, 0xb1, 0x92, 0x94, 0xb6, 0x00, 0x18, 0x6f, 0x2d, - 0xbe, 0x0e, 0xa2, 0x4b, 0x2e, 0xdf, 0x0b, 0x2f, 0xfc, 0x7a, 0x0f, 0x4c, - 0x3d, 0x32, 0x59, 0x7f, 0xff, 0xf9, 0xcb, 0xff, 0x77, 0x19, 0xee, 0x66, - 0xfe, 0x98, 0x7a, 0x62, 0x03, 0x65, 0x95, 0xb2, 0x2e, 0x7f, 0x3d, 0xa8, - 0x47, 0xb6, 0x43, 0x46, 0xb1, 0x7c, 0xec, 0xe7, 0x65, 0x1d, 0xa4, 0xa3, - 0x18, 0xbc, 0x51, 0xbd, 0x65, 0xff, 0xda, 0x80, 0xf4, 0x9f, 0xc5, 0x0d, - 0x2c, 0xb9, 0xb6, 0x6b, 0x2e, 0x3e, 0xac, 0xad, 0x8d, 0x86, 0x86, 0xaa, - 0x11, 0x2a, 0xee, 0x77, 0xa6, 0x7d, 0x96, 0x5e, 0xe0, 0x37, 0x56, 0x56, - 0x1b, 0xef, 0x0f, 0x5f, 0xe8, 0x29, 0x11, 0xc7, 0xcb, 0x2a, 0x1b, 0xaa, - 0xc9, 0x47, 0x12, 0x38, 0x68, 0xe4, 0xa4, 0x51, 0x63, 0xdb, 0x09, 0xbf, - 0xd0, 0xbf, 0x35, 0xb9, 0xa3, 0x02, 0xd4, 0x79, 0x9d, 0x95, 0xd8, 0xf0, - 0xbe, 0xfe, 0x15, 0xc5, 0x1d, 0x4f, 0x23, 0x09, 0xf4, 0xfa, 0xee, 0xf4, - 0xad, 0xc8, 0x59, 0x08, 0xbe, 0xde, 0x41, 0x7e, 0x39, 0xa4, 0x64, 0xb2, - 0xe6, 0xe8, 0xd6, 0x5f, 0xf4, 0xde, 0x6f, 0xe4, 0x4c, 0x0d, 0x2c, 0xbf, - 0xc3, 0x82, 0x64, 0x0e, 0x16, 0x54, 0x1f, 0x83, 0x9f, 0xdf, 0xfc, 0x44, - 0xff, 0x7b, 0xb0, 0x1c, 0x99, 0x65, 0xfd, 0xb4, 0x11, 0xb3, 0x16, 0x5f, - 0xfd, 0x87, 0xd8, 0x1f, 0x41, 0x1f, 0x71, 0x65, 0xe1, 0x8b, 0xfa, 0xcb, - 0xf3, 0x35, 0xa7, 0xf2, 0xca, 0x9c, 0x78, 0xf0, 0x3f, 0x7f, 0xf4, 0xce, - 0x1e, 0xc4, 0xbc, 0x58, 0xc5, 0x97, 0xf6, 0xb0, 0x89, 0xf6, 0x59, 0x41, - 0x3f, 0x03, 0x44, 0xbf, 0xfa, 0x1a, 0xfa, 0x5c, 0x9d, 0x9d, 0xc2, 0x59, - 0x7f, 0xfc, 0x6c, 0xfa, 0x5c, 0x9d, 0x84, 0x58, 0x7f, 0xac, 0xbc, 0x7d, - 0x02, 0xca, 0x9c, 0xac, 0xd5, 0xbb, 0x27, 0x94, 0x22, 0xf0, 0x80, 0xd1, - 0x34, 0x59, 0xd8, 0x45, 0xbc, 0x24, 0xc8, 0x87, 0xc8, 0xfb, 0xd4, 0x6d, - 0x3d, 0xbb, 0x94, 0xcf, 0x88, 0xdd, 0x42, 0x65, 0xb1, 0x1c, 0x53, 0x73, - 0x1d, 0xf3, 0x66, 0x18, 0x2d, 0xaa, 0x36, 0xb6, 0xe3, 0x1b, 0x73, 0x6b, - 0x4a, 0x6d, 0x21, 0x41, 0x15, 0xd5, 0x7e, 0xd3, 0xfe, 0xf2, 0xa7, 0x29, - 0x0e, 0xb1, 0x3a, 0xcb, 0xd0, 0xd1, 0x16, 0x72, 0x80, 0x35, 0x9c, 0x47, - 0xd4, 0xff, 0x63, 0xac, 0x3b, 0xb7, 0x65, 0x2a, 0xcd, 0x5a, 0xd2, 0x6a, - 0xb6, 0x09, 0x65, 0x37, 0x23, 0xb6, 0xa2, 0x2d, 0xed, 0x3f, 0xbf, 0xf4, - 0xf5, 0xc6, 0xdc, 0x64, 0x45, 0x69, 0x60, 0xf9, 0x7b, 0x7c, 0x1e, 0xb6, - 0xc6, 0x80, 0x9f, 0x46, 0xdf, 0x2e, 0x89, 0xa9, 0xc7, 0xed, 0xca, 0x64, - 0x60, 0x95, 0xed, 0x6b, 0x7c, 0xe5, 0x15, 0x4f, 0x94, 0xd7, 0x53, 0x2d, - 0x4d, 0x0d, 0xd7, 0x99, 0x9e, 0x59, 0x7f, 0x9d, 0x91, 0xe3, 0xe1, 0xac, - 0xbf, 0x66, 0x84, 0xf7, 0x16, 0x5a, 0x7f, 0xe7, 0xec, 0x43, 0x9c, 0x31, - 0xbf, 0xd3, 0xf3, 0x41, 0x77, 0x0a, 0xa2, 0xe3, 0x5f, 0xe9, 0xf9, 0xa0, - 0xbb, 0x85, 0x51, 0x75, 0xaf, 0xfe, 0x9e, 0xf2, 0x9f, 0x9a, 0x0b, 0xb8, - 0x55, 0x12, 0x8a, 0xa2, 0x53, 0x9f, 0x74, 0xa1, 0x50, 0x32, 0xa1, 0x61, - 0x26, 0x12, 0x93, 0x97, 0xa1, 0xbb, 0x0c, 0xc7, 0xd4, 0xd8, 0x07, 0xfc, - 0x2d, 0x38, 0x6f, 0xe4, 0x16, 0xf4, 0x1b, 0xff, 0xd3, 0xd8, 0xf2, 0x9f, - 0x9a, 0x0b, 0xb8, 0x55, 0x12, 0xd2, 0xff, 0x9b, 0x87, 0x4f, 0x75, 0xe3, - 0xe6, 0xf5, 0x97, 0x9d, 0xc2, 0xa8, 0x8d, 0xd7, 0xef, 0xa6, 0x28, 0x1a, - 0xcb, 0x68, 0x27, 0xa2, 0xe5, 0x17, 0xfb, 0x46, 0xdb, 0x0f, 0x61, 0xa5, - 0x97, 0xda, 0x04, 0x7e, 0xb2, 0x8c, 0xf6, 0xc4, 0x38, 0xbf, 0xff, 0xfe, - 0xde, 0x59, 0xce, 0x0e, 0x33, 0x41, 0x77, 0x0c, 0xf9, 0x1f, 0xa3, 0xdc, - 0x54, 0x61, 0xeb, 0x76, 0x11, 0x5c, 0x64, 0x57, 0xed, 0x43, 0x4c, 0x1a, - 0xcb, 0xff, 0x3c, 0xa7, 0xe6, 0x82, 0xee, 0x15, 0x44, 0xbe, 0xbf, 0x78, - 0x4e, 0xbf, 0x96, 0x5f, 0xc2, 0x1f, 0xcd, 0xfa, 0x69, 0x65, 0x41, 0xee, - 0x99, 0x4d, 0xfd, 0x07, 0xbb, 0x9f, 0x49, 0x65, 0xfb, 0x42, 0xf4, 0x1c, - 0x59, 0x5d, 0x3d, 0xa1, 0x0c, 0x2f, 0x46, 0xa1, 0x65, 0x61, 0xbe, 0x32, - 0x3b, 0xd2, 0x7e, 0xac, 0xbd, 0xfc, 0x34, 0xb2, 0xff, 0x61, 0xea, 0x5d, - 0x36, 0x96, 0x56, 0xe9, 0xe8, 0xf4, 0x7a, 0xf8, 0x1d, 0x3d, 0x2c, 0xbf, - 0xd1, 0xb4, 0x16, 0xd8, 0xde, 0xb2, 0xee, 0x69, 0x65, 0x6c, 0x79, 0xb3, - 0x1b, 0x5a, 0x7b, 0x6b, 0x5c, 0xbb, 0xc8, 0x4b, 0x06, 0x33, 0x0d, 0x13, - 0xb0, 0xa7, 0xb0, 0xa9, 0x28, 0x5c, 0x70, 0x7f, 0xcd, 0xbb, 0x84, 0xa2, - 0x37, 0xdf, 0xff, 0x8a, 0x03, 0x3f, 0xdf, 0x04, 0xf8, 0x59, 0xbd, 0xd6, - 0x5f, 0xfd, 0x2f, 0x1c, 0xd3, 0xc6, 0x7b, 0xe0, 0x6b, 0x2f, 0xf4, 0xff, - 0xdf, 0xef, 0xcf, 0xe5, 0x94, 0x34, 0x6d, 0x7c, 0xb0, 0x49, 0x37, 0xfa, - 0x7e, 0x68, 0x2e, 0xe1, 0x54, 0x55, 0x6b, 0x8d, 0xbd, 0x65, 0xd9, 0xa5, - 0x97, 0xc6, 0xc7, 0xde, 0xb2, 0x85, 0x3d, 0x27, 0x19, 0xf0, 0xb5, 0xe2, - 0x6f, 0x69, 0x65, 0xfd, 0xd8, 0xde, 0x01, 0xe2, 0xcb, 0xf9, 0xfb, 0x31, - 0x40, 0xd6, 0x5f, 0xfd, 0xee, 0xc7, 0x09, 0xc0, 0xdb, 0x3d, 0x2c, 0xbd, - 0x12, 0xc5, 0x97, 0xf1, 0x80, 0x25, 0x13, 0x2c, 0xa9, 0x23, 0xac, 0x65, - 0xff, 0x16, 0xcc, 0x8f, 0xd1, 0xbb, 0xfe, 0x17, 0x0b, 0x3e, 0xf3, 0xb1, - 0x65, 0xe6, 0xf8, 0xf2, 0xcb, 0xfd, 0xa8, 0x60, 0x90, 0x41, 0x59, 0x7b, - 0xe7, 0xf9, 0x65, 0xef, 0x3f, 0xcb, 0x2f, 0xff, 0xd9, 0x2e, 0xbc, 0x85, - 0x7e, 0x60, 0x39, 0xc3, 0x59, 0x4e, 0x7e, 0x44, 0x3b, 0x70, 0xcd, 0x65, - 0xfd, 0x9a, 0x0b, 0xb8, 0x55, 0x12, 0x02, 0xa7, 0x1e, 0x7c, 0xf1, 0x6b, - 0xf7, 0x1c, 0x9f, 0xe5, 0x97, 0x61, 0x2c, 0xb8, 0x10, 0xb2, 0xa4, 0x7f, - 0x1f, 0x13, 0x6e, 0x93, 0xe8, 0x56, 0xfe, 0x8d, 0x6d, 0x1a, 0xd9, 0x65, - 0xf1, 0xb2, 0x38, 0xb2, 0xa4, 0x7a, 0x02, 0x97, 0xdf, 0xed, 0x6c, 0xc8, - 0x29, 0x71, 0x65, 0x41, 0xeb, 0xe1, 0x1d, 0xed, 0x9c, 0x6b, 0x2f, 0xf0, - 0x4f, 0x1a, 0x01, 0x79, 0x65, 0x61, 0xe8, 0x7c, 0x3b, 0x7b, 0x9c, 0x92, - 0xcb, 0x9b, 0x1d, 0x59, 0x7f, 0xfb, 0x26, 0xeb, 0xb3, 0xdd, 0x8f, 0x01, - 0x8b, 0x2f, 0x37, 0xc7, 0x96, 0x56, 0xcb, 0xb4, 0x63, 0x2f, 0xc8, 0xc2, - 0xc5, 0x4c, 0xdd, 0x39, 0x98, 0x7d, 0x86, 0x7d, 0x84, 0x83, 0xc3, 0x9c, - 0xa1, 0xcf, 0xe7, 0x00, 0x11, 0x6e, 0x0e, 0x88, 0x36, 0xde, 0x97, 0x7f, - 0xe9, 0x46, 0x7f, 0xdc, 0xc2, 0x0a, 0xcb, 0xf4, 0x11, 0x67, 0x96, 0x5f, - 0x6b, 0x46, 0x15, 0x97, 0xc5, 0x9b, 0x4f, 0xc4, 0x42, 0x6e, 0x1e, 0x88, - 0x4b, 0x7f, 0xa7, 0xf5, 0xd9, 0x90, 0x35, 0x95, 0x3d, 0x3f, 0x2d, 0x46, - 0xe5, 0xb8, 0x99, 0x7f, 0xa7, 0xe6, 0x82, 0xee, 0x15, 0x45, 0x90, 0xbf, - 0xe3, 0xe1, 0xef, 0x9f, 0xc8, 0xf9, 0x65, 0xfe, 0x9f, 0x9a, 0x0b, 0xb8, - 0x55, 0x16, 0xba, 0xff, 0xf6, 0x09, 0x1b, 0x4f, 0xc9, 0xbc, 0x38, 0x25, - 0x97, 0xfa, 0x7e, 0x68, 0x2e, 0xe1, 0x54, 0x5c, 0x8b, 0xf6, 0x82, 0xee, - 0x15, 0x45, 0xd8, 0xbf, 0xf3, 0xca, 0x7e, 0x68, 0x2e, 0xe1, 0x54, 0x51, - 0xcb, 0x4f, 0xc4, 0x40, 0x30, 0xd2, 0xf8, 0xa2, 0x4c, 0x59, 0x7f, 0xe6, - 0xcb, 0x61, 0x91, 0xa9, 0x61, 0xef, 0x59, 0x69, 0x2c, 0xbf, 0x68, 0x2e, - 0xe1, 0x54, 0x52, 0xab, 0xfe, 0x0f, 0x4e, 0x6e, 0xc6, 0xd8, 0xb2, 0xff, - 0xf7, 0x63, 0x68, 0xe9, 0xef, 0x71, 0xf4, 0xd6, 0x4f, 0x37, 0x57, 0x4a, - 0x7e, 0x23, 0x2e, 0x66, 0xea, 0xf9, 0x30, 0xd7, 0x86, 0xe5, 0xff, 0x9c, - 0xfd, 0x20, 0x0d, 0xcb, 0xf5, 0x97, 0x74, 0x0b, 0x2d, 0x3c, 0x69, 0xfa, - 0x7c, 0x42, 0xc8, 0xd5, 0x7a, 0x53, 0xc3, 0xea, 0xd9, 0xb3, 0x88, 0x94, - 0xe8, 0xae, 0x47, 0x35, 0xf1, 0x81, 0xd2, 0x0a, 0x18, 0x78, 0xe8, 0x3f, - 0x9e, 0x92, 0x0f, 0x13, 0x7d, 0x0c, 0x1d, 0xf2, 0x87, 0xaf, 0xfa, 0x53, - 0xf3, 0x41, 0x77, 0x0a, 0xa2, 0x38, 0x5f, 0xf1, 0xcf, 0xcd, 0x05, 0xdc, - 0x2a, 0x8a, 0xd5, 0x69, 0xee, 0x88, 0xdf, 0x23, 0xdf, 0xfe, 0x9e, 0xc7, - 0x94, 0xfc, 0xd0, 0x5d, 0xc2, 0xa8, 0x96, 0xd7, 0x81, 0xaf, 0xd6, 0x5d, - 0x9f, 0x2c, 0xbf, 0xc3, 0xc6, 0x32, 0x0f, 0x8b, 0x2f, 0xde, 0x8e, 0x89, - 0xc5, 0x97, 0xb7, 0x82, 0x4b, 0x28, 0x28, 0xaf, 0xf8, 0x78, 0xc5, 0xc8, - 0xcb, 0x79, 0x4d, 0xee, 0x8e, 0x4b, 0x2f, 0xc6, 0xde, 0x38, 0xf9, 0x65, - 0xff, 0x67, 0xc5, 0x9f, 0xfe, 0xf2, 0x59, 0x73, 0x02, 0xb2, 0xff, 0x61, - 0xfd, 0xc1, 0xe1, 0x2c, 0xbf, 0xfe, 0x82, 0xdb, 0x80, 0x73, 0x97, 0x3a, - 0xf2, 0x59, 0x50, 0x8d, 0x29, 0x1d, 0x68, 0x5f, 0xa6, 0x57, 0xc5, 0x1f, - 0x49, 0x65, 0xfd, 0xb4, 0x05, 0xf5, 0xfa, 0xcb, 0xff, 0xf3, 0xfd, 0xf8, - 0xfa, 0xf2, 0xce, 0x10, 0x1c, 0x45, 0x97, 0xdf, 0xe6, 0xa6, 0x59, 0x7b, - 0xd0, 0xc5, 0x94, 0x14, 0x74, 0x68, 0x8b, 0xa5, 0xff, 0xab, 0xb7, 0x92, - 0x5f, 0xfc, 0x2c, 0x17, 0xb3, 0x47, 0xb3, 0xb1, 0x65, 0xf3, 0xc8, 0x53, - 0x59, 0x61, 0x56, 0x74, 0xd1, 0x5f, 0xc7, 0xa2, 0x3f, 0x71, 0x65, 0xfb, - 0x4e, 0x59, 0x0b, 0x29, 0x51, 0x0d, 0x8c, 0xfc, 0xfa, 0x44, 0xe5, 0x97, - 0x41, 0x2c, 0xbd, 0x86, 0x35, 0x97, 0x87, 0x8c, 0x59, 0x71, 0x90, 0xcd, - 0xb9, 0x8d, 0xd4, 0x1f, 0xb4, 0x93, 0x2f, 0xe0, 0xf4, 0xf5, 0x03, 0x59, - 0x7d, 0x93, 0x4b, 0x16, 0x5f, 0xf9, 0xe5, 0x3f, 0x34, 0x17, 0x70, 0xaa, - 0x26, 0x05, 0xf8, 0x0f, 0xe3, 0xf2, 0xcb, 0xb9, 0x0b, 0x2a, 0x0d, 0xe8, - 0x09, 0xef, 0x34, 0x7f, 0xac, 0xbe, 0xe3, 0x97, 0xeb, 0x2a, 0x63, 0xc0, - 0xfc, 0x7a, 0xff, 0x03, 0xed, 0x1c, 0x33, 0x16, 0x5f, 0xba, 0x70, 0x5b, - 0x2c, 0xbf, 0xe8, 0xdb, 0xc5, 0x00, 0xf7, 0x16, 0x57, 0x51, 0x27, 0xc3, - 0x3d, 0xc2, 0x7b, 0xe2, 0xce, 0x42, 0xca, 0xf1, 0xe9, 0xef, 0x33, 0xbd, - 0x23, 0xfd, 0x65, 0xf7, 0xc1, 0x31, 0x56, 0x5f, 0x9c, 0x5c, 0xeb, 0xac, - 0xac, 0x44, 0x64, 0xc4, 0x9e, 0x1d, 0x01, 0x25, 0xfc, 0x7e, 0xc6, 0x47, - 0x56, 0x5f, 0xf1, 0xff, 0xb7, 0x63, 0x80, 0xe2, 0xcb, 0xfd, 0x27, 0xf7, - 0x0c, 0xa1, 0x65, 0xa3, 0x47, 0xd8, 0x47, 0x75, 0xa4, 0x5f, 0x7a, 0x13, - 0x17, 0xfe, 0xc6, 0x66, 0xb3, 0xe9, 0x67, 0x96, 0x5f, 0xc7, 0xd3, 0x66, - 0x0a, 0xb2, 0xba, 0x7d, 0x7c, 0x3e, 0xbf, 0xfc, 0xfb, 0x74, 0xe0, 0xb2, - 0x63, 0xd1, 0xac, 0xac, 0x47, 0xef, 0xa1, 0x26, 0xd1, 0x15, 0xb7, 0x16, - 0x5c, 0x1c, 0x59, 0x70, 0x3f, 0x49, 0x5b, 0x1e, 0x11, 0x8a, 0x68, 0x5a, - 0xfc, 0x2c, 0x4b, 0x06, 0xb2, 0xff, 0x60, 0xcb, 0x3d, 0xdc, 0x59, 0x73, - 0x64, 0x2b, 0x8c, 0x29, 0x7b, 0x6f, 0x7e, 0xb2, 0xfc, 0x26, 0xe3, 0x97, - 0xeb, 0x2f, 0xec, 0xeb, 0x88, 0x5e, 0x59, 0x5b, 0x1e, 0xc8, 0xcb, 0x2f, - 0xec, 0xf7, 0xa3, 0x5c, 0x59, 0x7f, 0x39, 0x7f, 0xb7, 0xfe, 0x59, 0x50, - 0x88, 0x02, 0x23, 0xdc, 0x2d, 0xb4, 0xf8, 0x65, 0xcf, 0x6c, 0x97, 0x21, - 0xd1, 0xc3, 0xf7, 0x23, 0x24, 0x15, 0x38, 0x30, 0xd9, 0xfa, 0x16, 0xf3, - 0x10, 0xe8, 0xb5, 0x84, 0x5d, 0x84, 0x4b, 0xb0, 0x14, 0x72, 0xdc, 0x8f, - 0xe3, 0xce, 0xe0, 0x2f, 0xde, 0x50, 0xd1, 0x8e, 0xe1, 0x40, 0x90, 0xf8, - 0xbc, 0xc0, 0x69, 0x25, 0xff, 0x9e, 0x53, 0xf3, 0x41, 0x77, 0x0a, 0xa2, - 0x63, 0x5d, 0x0d, 0xeb, 0x2e, 0xd6, 0x2c, 0xb4, 0x68, 0xd7, 0xf4, 0x66, - 0xd3, 0xcd, 0x17, 0xcc, 0x1d, 0xeb, 0xdd, 0xff, 0x0c, 0xf7, 0xcf, 0xfb, - 0xf1, 0x24, 0xb2, 0xf9, 0xb4, 0x6d, 0x52, 0x1a, 0xcb, 0xe8, 0xda, 0x34, - 0xb2, 0xf7, 0xa2, 0x65, 0x97, 0xec, 0x89, 0x8d, 0x8b, 0x2f, 0xb6, 0x00, - 0xf7, 0x56, 0x5f, 0xf3, 0x79, 0xff, 0x3b, 0x26, 0x86, 0x2c, 0xa3, 0x46, - 0x64, 0xc4, 0x5a, 0x1d, 0x10, 0x9d, 0xbc, 0x9e, 0xd2, 0x59, 0x7e, 0x64, - 0x67, 0xb8, 0xb2, 0x9b, 0x93, 0x70, 0x31, 0x1b, 0xfd, 0xd8, 0xd6, 0xc2, - 0x03, 0xf5, 0x97, 0xc0, 0xd9, 0xc9, 0x65, 0xcf, 0xc5, 0x97, 0xd3, 0xbd, - 0x9d, 0x59, 0x68, 0xe9, 0xba, 0xe0, 0xb5, 0xe8, 0x2d, 0x96, 0x5f, 0xff, - 0xff, 0x4b, 0x9d, 0xc0, 0x35, 0xce, 0xe0, 0x73, 0x93, 0xb3, 0xe9, 0x70, - 0xc8, 0xd6, 0x5e, 0x77, 0x0a, 0xa2, 0xb1, 0x5f, 0x38, 0x90, 0x2a, 0xca, - 0x09, 0xe5, 0xe8, 0xa2, 0xfd, 0xd3, 0x64, 0x69, 0x65, 0xff, 0xe0, 0x3e, - 0xda, 0xc6, 0x76, 0x36, 0x20, 0x2c, 0xa3, 0x3f, 0x22, 0x27, 0xbf, 0xf6, - 0xe6, 0x78, 0xb0, 0x10, 0x5e, 0x59, 0x7f, 0x8b, 0x39, 0xfe, 0x60, 0xd6, - 0x50, 0xaa, 0x8c, 0x82, 0x4d, 0xf0, 0xe6, 0xa1, 0x97, 0xd8, 0x4a, 0x78, - 0x83, 0x79, 0xfd, 0xff, 0xc2, 0x83, 0xdc, 0x2c, 0xde, 0x59, 0xc5, 0x97, - 0xff, 0x17, 0x85, 0x04, 0x16, 0x06, 0x34, 0xb2, 0xff, 0x6b, 0x6f, 0x71, - 0xfe, 0x0a, 0xca, 0x83, 0xf9, 0x74, 0x3b, 0xfe, 0x96, 0x7b, 0x0a, 0x1a, - 0xdc, 0x59, 0x7f, 0xee, 0xc6, 0xf7, 0xd0, 0x7a, 0xed, 0xeb, 0x2f, 0xcd, - 0xfe, 0xcf, 0xa6, 0x59, 0x7d, 0xc9, 0x8c, 0x55, 0x97, 0xff, 0xff, 0xf9, - 0xfd, 0xec, 0xef, 0x1e, 0x46, 0x5e, 0x96, 0x6b, 0x39, 0x9d, 0x7d, 0x8a, - 0x24, 0xb2, 0xf7, 0xa2, 0x65, 0x95, 0x08, 0xf9, 0xc2, 0xde, 0x12, 0x09, - 0x08, 0xbb, 0xf8, 0x1b, 0x81, 0xe9, 0xb6, 0xd6, 0x5f, 0x7d, 0x28, 0xea, - 0xcb, 0xfd, 0xc1, 0xf7, 0x02, 0x0d, 0xd5, 0x96, 0xce, 0x1e, 0xd0, 0x08, - 0xee, 0x8d, 0xeb, 0x2b, 0xa6, 0xfc, 0x89, 0xef, 0xf4, 0xcf, 0x87, 0x21, - 0x18, 0xb2, 0x86, 0x7a, 0x86, 0x41, 0x7f, 0xbe, 0x94, 0xd2, 0x7d, 0x6c, - 0xb2, 0xfa, 0x5e, 0x3d, 0x96, 0x54, 0x1e, 0xd3, 0x9b, 0xd4, 0x27, 0x7b, - 0x91, 0x91, 0x1b, 0xdd, 0xe8, 0x97, 0x96, 0x5f, 0xed, 0x18, 0x36, 0xff, - 0x92, 0x59, 0x78, 0xe3, 0x65, 0x94, 0x33, 0xd2, 0x98, 0xda, 0xfc, 0x1e, - 0xc1, 0x0a, 0xb2, 0xb0, 0xf2, 0xdc, 0x8e, 0xf9, 0x8f, 0xf7, 0x96, 0x5f, - 0xfd, 0xb4, 0x7a, 0x70, 0x81, 0x11, 0xbc, 0x4e, 0x2c, 0xbf, 0xf9, 0xf7, - 0x70, 0x9c, 0x6f, 0x9f, 0x79, 0x65, 0xff, 0x6a, 0x38, 0xfa, 0x28, 0x92, - 0xca, 0xd2, 0x32, 0xfa, 0x9f, 0xbd, 0x16, 0xf4, 0x9f, 0x65, 0x97, 0xa7, - 0x6c, 0xc5, 0x97, 0xf1, 0x46, 0xc5, 0x1b, 0x2c, 0xb7, 0x96, 0x5f, 0xf8, - 0x5e, 0x73, 0x3a, 0x7c, 0x06, 0xcb, 0x28, 0x67, 0xa4, 0x01, 0x1a, 0x6c, - 0xa7, 0xfd, 0x90, 0xee, 0xf8, 0xc8, 0xc7, 0x5c, 0x80, 0x9f, 0xef, 0xfc, - 0x4e, 0x3e, 0xc6, 0xfe, 0xb9, 0x2c, 0xbf, 0xff, 0xf0, 0x36, 0xc0, 0xce, - 0x20, 0x37, 0xce, 0xcf, 0xa5, 0x80, 0x2f, 0xf8, 0xb2, 0xff, 0xf6, 0xd9, - 0xf7, 0xb8, 0x65, 0x1f, 0xbb, 0x16, 0x5f, 0xef, 0x8b, 0x07, 0xd7, 0x69, - 0x65, 0x61, 0xff, 0xba, 0x5d, 0x0d, 0x35, 0x32, 0x3e, 0xe4, 0x3d, 0x6f, - 0xbd, 0x28, 0x35, 0x97, 0xfd, 0x83, 0xdb, 0x1a, 0xce, 0xba, 0xcb, 0xfb, - 0x69, 0xa4, 0xd9, 0xd6, 0xcb, 0x2f, 0x88, 0xb3, 0xcb, 0x2f, 0xc7, 0xbb, - 0xad, 0x1a, 0xca, 0x6e, 0xd1, 0x01, 0x06, 0xdd, 0x20, 0xbf, 0xb6, 0x13, - 0x71, 0xcb, 0xf5, 0x97, 0xdb, 0xb1, 0xc2, 0x59, 0x7f, 0xee, 0xbb, 0x3d, - 0xd8, 0xf0, 0x18, 0xb2, 0xb0, 0xf8, 0xe6, 0x24, 0xbf, 0xfb, 0x30, 0x56, - 0x41, 0xeb, 0x46, 0xd2, 0xcb, 0xfe, 0x39, 0x1f, 0x40, 0xc6, 0x1a, 0xcb, - 0xb3, 0xcb, 0x2a, 0x13, 0x4a, 0xc8, 0x4b, 0x68, 0x8b, 0xc8, 0x9b, 0x87, - 0x17, 0x89, 0xdb, 0xd6, 0x5e, 0xe9, 0xcf, 0x6d, 0x4d, 0x87, 0x5c, 0x43, - 0xeb, 0x68, 0x43, 0x48, 0x98, 0x66, 0xf9, 0x2a, 0x38, 0x57, 0x40, 0xc2, - 0xff, 0xe2, 0x03, 0x3b, 0xd4, 0x67, 0x9d, 0x8f, 0xf9, 0xcd, 0x0a, 0x17, - 0x3c, 0x94, 0x3d, 0xe8, 0xec, 0x40, 0x6b, 0xbc, 0x87, 0x72, 0x17, 0x22, - 0x46, 0xfc, 0xde, 0xa3, 0x79, 0xb8, 0x6e, 0x37, 0x6b, 0x2e, 0x91, 0x2c, - 0xbf, 0xb5, 0xa8, 0x1e, 0x31, 0x65, 0xb7, 0x56, 0x5f, 0x6d, 0xa8, 0xd9, - 0x65, 0xc2, 0x7e, 0xb2, 0xef, 0xf8, 0xb2, 0xf7, 0x4d, 0x8b, 0x2d, 0x32, - 0xca, 0x33, 0xc6, 0x71, 0x80, 0x0e, 0x5f, 0x9c, 0xb6, 0x07, 0x16, 0x5f, - 0xb0, 0x7a, 0x70, 0xac, 0xbe, 0x7d, 0xa3, 0x4b, 0x2e, 0x81, 0xf4, 0xf2, - 0x48, 0x9e, 0x8d, 0x38, 0xe9, 0x8b, 0x5c, 0x53, 0xf2, 0x42, 0x5f, 0xe1, - 0x6f, 0x9c, 0x6d, 0xd5, 0x97, 0xb8, 0x27, 0x16, 0x5f, 0x7d, 0xb4, 0x0a, - 0xb2, 0xb6, 0x3d, 0x41, 0x88, 0x80, 0x7a, 0xef, 0x42, 0xcb, 0xfd, 0xf6, - 0xa0, 0xe4, 0xfc, 0x59, 0x7d, 0x85, 0x12, 0x59, 0x58, 0x7a, 0x6c, 0x33, - 0xb6, 0xe2, 0xcb, 0xfd, 0x9f, 0xf3, 0x3c, 0x7a, 0x59, 0x7c, 0x0f, 0x67, - 0x16, 0x5c, 0x5b, 0xab, 0x2f, 0x69, 0xc9, 0x65, 0x2c, 0xbf, 0xcd, 0x16, - 0x6f, 0xd1, 0xf1, 0x65, 0xbe, 0x59, 0x50, 0x7d, 0xb8, 0x36, 0x61, 0x60, - 0x35, 0xbf, 0x66, 0xa5, 0x0c, 0x59, 0x7f, 0x1e, 0xd8, 0x46, 0x2a, 0xcb, - 0xfc, 0xfa, 0x97, 0xe7, 0xf7, 0x16, 0x5f, 0x73, 0x91, 0xfa, 0xca, 0x84, - 0xfd, 0x46, 0x43, 0x82, 0x86, 0x66, 0xc2, 0x2e, 0xc2, 0x19, 0xce, 0x48, - 0x9c, 0x05, 0xad, 0x1a, 0xdf, 0xfb, 0x0b, 0x05, 0x2c, 0xf7, 0x4d, 0x65, - 0xfc, 0xe2, 0xe0, 0xde, 0x4b, 0x2b, 0xa7, 0xd2, 0x47, 0x97, 0xf1, 0x91, - 0x66, 0xf7, 0x59, 0x7a, 0x42, 0x79, 0x65, 0xed, 0x69, 0xd6, 0x5f, 0x4b, - 0xf0, 0x49, 0x65, 0xf6, 0x84, 0x8f, 0xd6, 0x54, 0x1e, 0x41, 0x92, 0x5f, - 0xe3, 0xd9, 0xd9, 0xff, 0xf0, 0xb2, 0xe3, 0x1a, 0xcb, 0x9f, 0xe5, 0x97, - 0xf8, 0x3d, 0xc9, 0x8a, 0x06, 0xb2, 0x86, 0x79, 0x46, 0x2f, 0x7b, 0xc7, - 0xfa, 0xcb, 0xef, 0xe0, 0x82, 0xb2, 0x85, 0x37, 0xff, 0x0e, 0xdf, 0x4b, - 0xd8, 0x22, 0xcb, 0xc1, 0x8f, 0xd6, 0x5e, 0xd4, 0x31, 0x65, 0x19, 0xff, - 0xb9, 0x18, 0x08, 0xda, 0x1d, 0xbe, 0xd8, 0x4c, 0x99, 0x65, 0xe8, 0xd6, - 0xcb, 0x2a, 0x0f, 0x08, 0xc9, 0x69, 0x65, 0xe0, 0xc7, 0xeb, 0x2e, 0x82, - 0x91, 0xa8, 0xc0, 0xbb, 0xef, 0x11, 0xb7, 0xac, 0xbd, 0x00, 0xe2, 0xca, - 0x92, 0xb9, 0x21, 0x90, 0xfc, 0x58, 0x63, 0xd3, 0x32, 0x68, 0x81, 0x86, - 0xbd, 0x60, 0x28, 0x6f, 0xf1, 0xf7, 0xc9, 0x00, 0x2a, 0xde, 0x49, 0x7f, - 0x3c, 0x9b, 0xdb, 0xc1, 0xb2, 0xcb, 0x12, 0xcb, 0xa5, 0xba, 0xb2, 0xba, - 0x7b, 0xfc, 0x35, 0xf0, 0x85, 0xb7, 0x16, 0x5f, 0xd9, 0xb0, 0xfa, 0x7a, - 0x59, 0x5d, 0x3c, 0x22, 0x14, 0xbf, 0xf4, 0x67, 0x27, 0x41, 0x8c, 0x49, - 0x2c, 0xbf, 0x8d, 0xae, 0x6d, 0x8d, 0x2c, 0xa2, 0x3f, 0x0f, 0x20, 0x5c, - 0x50, 0xb2, 0xfd, 0x03, 0xf6, 0x05, 0x65, 0xe8, 0x20, 0xac, 0xbf, 0xff, - 0x9d, 0xa1, 0xbb, 0xeb, 0x6e, 0xbf, 0xba, 0x7a, 0x92, 0xca, 0xe9, 0xfb, - 0x90, 0xdd, 0x49, 0x1e, 0xa1, 0x21, 0xe0, 0xaf, 0xa1, 0x3d, 0x7c, 0xe4, - 0xf3, 0x2c, 0xbf, 0x1f, 0x8b, 0x24, 0xb2, 0xfa, 0x1a, 0x89, 0x96, 0x5f, - 0xfb, 0x9b, 0xdf, 0xb0, 0x2e, 0x7b, 0x8b, 0x2e, 0x11, 0x8b, 0x2f, 0xc5, - 0x9a, 0x06, 0x2c, 0xbf, 0xbc, 0x4f, 0xfe, 0x12, 0xcb, 0xf1, 0x3f, 0xf8, - 0x4b, 0x2c, 0x09, 0xc7, 0xa5, 0xe2, 0xca, 0xd9, 0x36, 0x51, 0x48, 0x4c, - 0x9a, 0x62, 0x3e, 0xa0, 0xfe, 0x30, 0x4f, 0x17, 0xdc, 0xc2, 0x0a, 0xcb, - 0xfa, 0x0b, 0xc1, 0x06, 0xcb, 0x2f, 0xf4, 0x34, 0x30, 0x3e, 0xa4, 0xb2, - 0xf7, 0x22, 0x4b, 0x2f, 0xdd, 0xcd, 0x1f, 0x16, 0x5c, 0x7a, 0xf8, 0xf0, - 0xfc, 0x39, 0x6d, 0xeb, 0x2a, 0x13, 0x07, 0x91, 0x0e, 0x8b, 0xba, 0xee, - 0xde, 0x5d, 0x78, 0x8c, 0x55, 0x97, 0xd8, 0x33, 0xde, 0xb2, 0xe8, 0x66, - 0x1b, 0xf7, 0x1c, 0xbf, 0xec, 0x69, 0xfe, 0xec, 0x08, 0x4b, 0x2d, 0xc5, - 0x97, 0xdc, 0xeb, 0xc9, 0x65, 0x1a, 0x25, 0xf4, 0x54, 0xe7, 0x40, 0x11, - 0xbd, 0x85, 0x32, 0xcb, 0x7c, 0xb2, 0xef, 0xe1, 0x25, 0xcd, 0x34, 0x92, - 0x8c, 0xd8, 0x34, 0x2f, 0x7e, 0x2c, 0xf7, 0x4d, 0x24, 0xf3, 0x43, 0x7c, - 0x29, 0x67, 0x16, 0x54, 0x8f, 0x68, 0x67, 0x17, 0xf9, 0xc5, 0x82, 0x2c, - 0xf2, 0xca, 0x84, 0xcb, 0x06, 0x38, 0xf0, 0xbd, 0x22, 0x2b, 0xdd, 0x86, - 0x96, 0x5e, 0x7f, 0xb8, 0xb2, 0xdc, 0x59, 0x7c, 0x27, 0x5f, 0xcb, 0x2b, - 0x63, 0xee, 0x18, 0xef, 0xc3, 0xbe, 0x11, 0xbd, 0x05, 0x32, 0xcb, 0x8a, - 0x16, 0x52, 0xca, 0x59, 0x53, 0x16, 0xcc, 0x0b, 0xbb, 0xb3, 0x2c, 0xb8, - 0xff, 0x59, 0x50, 0x6b, 0xff, 0x18, 0xa9, 0x91, 0x71, 0xa1, 0xc7, 0x2b, - 0xfd, 0x42, 0xff, 0xe1, 0x4c, 0x83, 0xc8, 0x63, 0xfd, 0xe5, 0x97, 0xbf, - 0xc6, 0xf5, 0x97, 0xff, 0xc5, 0x9f, 0xe3, 0x01, 0x1a, 0xd1, 0x80, 0x2b, - 0x28, 0x54, 0x5a, 0x69, 0x14, 0x88, 0x2f, 0x99, 0xc0, 0x31, 0x65, 0x85, - 0x59, 0x6d, 0xc5, 0x97, 0x68, 0x55, 0x95, 0x07, 0xc2, 0x64, 0x60, 0x12, - 0x10, 0x52, 0xff, 0xfb, 0xb9, 0x2e, 0x47, 0xa5, 0x9b, 0xae, 0x5f, 0xac, - 0xbf, 0xe3, 0xf7, 0x73, 0xef, 0x02, 0x16, 0x5f, 0x09, 0x1a, 0xfd, 0x65, - 0x48, 0xf7, 0x7a, 0x73, 0x76, 0x71, 0x65, 0x41, 0xb8, 0x91, 0x15, 0x71, - 0x30, 0x7f, 0x43, 0x9e, 0xdf, 0xac, 0xbf, 0x1c, 0x32, 0x18, 0xb2, 0xd8, - 0xb2, 0x8c, 0xfc, 0x5c, 0xa7, 0x82, 0x5b, 0x84, 0xd6, 0x15, 0x65, 0x42, - 0xe3, 0xde, 0x43, 0xd8, 0xe1, 0xe5, 0xd8, 0x48, 0xbc, 0x76, 0x6d, 0xe7, - 0xb7, 0xd0, 0xd0, 0x26, 0x59, 0x7b, 0x91, 0x32, 0xcb, 0xfb, 0x07, 0x9b, - 0xcf, 0x4b, 0x29, 0x65, 0x98, 0xb2, 0xbc, 0x5e, 0x6f, 0x0b, 0xbe, 0x1b, - 0xbf, 0xcb, 0x2f, 0xdf, 0x9e, 0x8c, 0x55, 0x97, 0x38, 0xab, 0x2e, 0xcf, - 0x96, 0x50, 0x53, 0x26, 0x98, 0x91, 0x83, 0xbd, 0x4a, 0x72, 0x2f, 0xc8, - 0x88, 0xa7, 0x70, 0x5e, 0xec, 0xea, 0xcb, 0xb3, 0x4b, 0x29, 0x65, 0xa1, - 0x65, 0x36, 0xcb, 0xbf, 0x05, 0xdf, 0xa3, 0xb9, 0xbd, 0xd6, 0x54, 0x22, - 0x4d, 0x82, 0xce, 0x63, 0xf9, 0x25, 0xfc, 0x7e, 0xce, 0xb8, 0xab, 0x2f, - 0xee, 0x81, 0xf6, 0xe9, 0xac, 0xbc, 0xd3, 0x4d, 0x24, 0xbf, 0xd1, 0xb0, - 0x99, 0xd7, 0xf9, 0x24, 0xf3, 0x41, 0x7f, 0x8c, 0x6e, 0x5f, 0x4b, 0x8b, - 0x28, 0x67, 0xf5, 0xd4, 0x7b, 0xb3, 0x65, 0x97, 0xe6, 0x09, 0x1a, 0xfd, - 0x65, 0x2c, 0xa5, 0x96, 0x86, 0x16, 0xdf, 0x85, 0xd4, 0x1f, 0x34, 0x90, - 0x28, 0x69, 0xc4, 0x06, 0x19, 0x06, 0x45, 0x33, 0xed, 0xe8, 0x61, 0xac, - 0xac, 0x3d, 0xe0, 0xa1, 0xdf, 0x1e, 0x9b, 0xc6, 0xb2, 0xfd, 0xd8, 0xf9, - 0xf7, 0x56, 0x5f, 0xff, 0x47, 0xb8, 0x3c, 0xf1, 0xf4, 0x19, 0xf7, 0x96, - 0x57, 0x4f, 0xef, 0xc5, 0x77, 0x8b, 0x3a, 0xb2, 0xda, 0x59, 0x7f, 0xb3, - 0x02, 0x26, 0xfe, 0xe2, 0xcb, 0xfe, 0x82, 0xf1, 0x67, 0xa1, 0xa5, 0x97, - 0xfb, 0x1a, 0xe1, 0x97, 0xd2, 0x59, 0x46, 0x7d, 0x7a, 0x37, 0xbd, 0xed, - 0x01, 0x65, 0xb8, 0xb2, 0x88, 0xd7, 0x00, 0x76, 0xff, 0x3e, 0xfc, 0x1e, - 0xd8, 0xd2, 0xcb, 0xff, 0xf6, 0x0e, 0x33, 0xe1, 0x3c, 0x64, 0x09, 0x67, - 0x16, 0x5c, 0xcf, 0xd6, 0x5c, 0xe4, 0xb2, 0xba, 0x6b, 0x5c, 0x62, 0xfc, - 0xc3, 0xf7, 0xee, 0xb2, 0xb6, 0x55, 0xfb, 0x90, 0xa0, 0x32, 0x2d, 0xd1, - 0xb9, 0x84, 0x75, 0x0a, 0x07, 0x4f, 0xfc, 0x80, 0x8d, 0xbd, 0x08, 0x20, - 0x10, 0x5d, 0xa1, 0x56, 0x5f, 0x43, 0x1f, 0xab, 0x2f, 0x7b, 0xce, 0xb2, - 0xfb, 0x40, 0x8d, 0xeb, 0x2f, 0xd9, 0xba, 0xe5, 0xf8, 0xcf, 0x85, 0xc8, - 0x7c, 0x39, 0x7d, 0xdf, 0x1e, 0xcb, 0x2f, 0xf0, 0x4f, 0x85, 0x9b, 0xdd, - 0x65, 0xf4, 0x6c, 0xf2, 0x59, 0x7d, 0xee, 0x74, 0xd6, 0x5f, 0xc4, 0xfe, - 0xdb, 0x1a, 0x59, 0x4b, 0x28, 0x8d, 0xcf, 0x8b, 0xaa, 0x0f, 0xef, 0x16, - 0xef, 0xd9, 0xb1, 0x67, 0xcb, 0x2f, 0xbc, 0x65, 0xc5, 0x97, 0xe0, 0xce, - 0xcf, 0xbc, 0xb2, 0xb0, 0xf3, 0x0c, 0x86, 0xa1, 0x53, 0x6c, 0x9e, 0x71, - 0x37, 0xe2, 0x3d, 0x19, 0xf6, 0x13, 0xa4, 0x41, 0xc7, 0x4b, 0xc2, 0x00, - 0x45, 0x97, 0x88, 0xf7, 0x56, 0x5f, 0x0f, 0x71, 0xc5, 0x59, 0x50, 0x78, - 0x98, 0x3d, 0x6d, 0xc5, 0x97, 0x40, 0xd6, 0x53, 0x60, 0xd5, 0x74, 0x52, - 0xed, 0x71, 0x65, 0x2c, 0x32, 0xde, 0xff, 0x41, 0x49, 0xd9, 0x83, 0x59, - 0x7d, 0xe6, 0x33, 0x4b, 0x2f, 0xfe, 0xfe, 0x08, 0x2f, 0xef, 0xc4, 0x29, - 0x2c, 0xbd, 0x23, 0xea, 0xcb, 0xef, 0x16, 0x49, 0x65, 0xf0, 0x1b, 0x7c, - 0x75, 0x97, 0xed, 0x86, 0xee, 0xd2, 0xca, 0xc3, 0xcf, 0x01, 0x35, 0xff, - 0xe3, 0xe7, 0x70, 0x65, 0x9b, 0xcb, 0x38, 0xb2, 0xa4, 0x9c, 0x80, 0xa6, - 0x3f, 0x11, 0xcc, 0x8d, 0xa1, 0xc2, 0x70, 0xf1, 0x0d, 0x37, 0x6e, 0x98, - 0x19, 0xb2, 0x57, 0x11, 0xd2, 0x6d, 0x0b, 0x89, 0x18, 0x0e, 0x52, 0xf6, - 0x4e, 0x44, 0x0b, 0x18, 0xd0, 0x5c, 0x7e, 0x8e, 0x18, 0xe3, 0xa7, 0x9a, - 0x36, 0xed, 0x46, 0x46, 0xc8, 0xd9, 0xfb, 0x3a, 0x52, 0xf1, 0xca, 0x7f, - 0x18, 0x43, 0x6c, 0xf0, 0xa5, 0x09, 0xf2, 0x58, 0xf7, 0xa5, 0x8c, 0x01, - 0xdb, 0x7b, 0x1b, 0x49, 0x5b, 0x87, 0x82, 0x47, 0x53, 0x7f, 0xd3, 0xfc, - 0x78, 0xdf, 0xc0, 0x42, 0xcb, 0xff, 0xfe, 0x04, 0x4f, 0xf7, 0x0f, 0xae, - 0x7e, 0xcd, 0x7e, 0xc7, 0x92, 0xca, 0x9e, 0xaa, 0x1f, 0x68, 0xf8, 0x86, - 0x7b, 0x7e, 0xd0, 0x5d, 0xc2, 0xa8, 0xad, 0xd7, 0xfe, 0x79, 0x4f, 0xcd, - 0x05, 0xdc, 0x2a, 0x89, 0xc1, 0x69, 0xf8, 0x88, 0x06, 0x1a, 0x5c, 0xd9, - 0x1a, 0xcb, 0x75, 0x65, 0xb8, 0xb2, 0x80, 0x68, 0xb7, 0x04, 0x6f, 0xd8, - 0xd7, 0x0d, 0xa5, 0x97, 0xa5, 0xce, 0x2c, 0xbe, 0x0b, 0xb8, 0x55, 0x16, - 0x8a, 0xff, 0xf6, 0x0f, 0xae, 0x2c, 0xd3, 0x1f, 0x00, 0xc5, 0x95, 0xa3, - 0xfb, 0xe9, 0x75, 0xf0, 0x5c, 0xbf, 0x59, 0x7d, 0xfc, 0x10, 0x56, 0x5f, - 0xf4, 0xd9, 0xbb, 0xcd, 0x69, 0xfc, 0xb2, 0xfe, 0x87, 0x20, 0x0f, 0x16, - 0x5f, 0xfd, 0x01, 0xe6, 0x04, 0xa3, 0xfe, 0x42, 0xcb, 0xfe, 0xdf, 0xcc, - 0xee, 0x10, 0x83, 0x59, 0x62, 0x83, 0xfe, 0xc4, 0x3b, 0xfd, 0x9a, 0xff, - 0x26, 0x13, 0x8b, 0x2c, 0x2a, 0xcb, 0xfe, 0xc8, 0xdb, 0x26, 0xd1, 0xf1, - 0x65, 0x19, 0xe5, 0xcc, 0x25, 0x7f, 0xfe, 0xda, 0x3d, 0x03, 0xd4, 0x75, - 0xf8, 0x59, 0xfa, 0xcb, 0xff, 0x47, 0xcf, 0xbb, 0xd2, 0x7d, 0xdd, 0x96, - 0x5f, 0xfa, 0x35, 0xfe, 0x1e, 0x6b, 0xc0, 0x59, 0x50, 0x8d, 0x8e, 0xaa, - 0xf1, 0x16, 0xd8, 0x34, 0xf3, 0xcc, 0x96, 0x68, 0x40, 0xf2, 0x1f, 0x54, - 0xb2, 0xf6, 0xa0, 0x55, 0x97, 0xe3, 0xf1, 0x43, 0x16, 0x53, 0x76, 0x79, - 0xd3, 0x05, 0xf4, 0x76, 0xff, 0x43, 0x35, 0xa3, 0xff, 0x8b, 0x2f, 0x07, - 0x1a, 0x59, 0x6c, 0x98, 0xf4, 0x7a, 0x69, 0x66, 0x96, 0x5f, 0xed, 0x47, - 0xbe, 0x96, 0x79, 0x65, 0xfd, 0x1f, 0xea, 0x30, 0x6b, 0x28, 0xcf, 0xce, - 0x61, 0x2e, 0x1a, 0x5c, 0x72, 0x59, 0x7f, 0x66, 0xff, 0x02, 0x02, 0xb2, - 0xff, 0x77, 0xa0, 0x15, 0x91, 0xc5, 0x97, 0xff, 0xe3, 0xe1, 0x66, 0xf7, - 0xf1, 0x67, 0x3a, 0xf3, 0x2c, 0xbf, 0x47, 0xb8, 0x27, 0x56, 0x54, 0x23, - 0xe0, 0x62, 0xd8, 0x5f, 0x31, 0xa9, 0x2a, 0xdf, 0x11, 0xfd, 0x25, 0x97, - 0xd9, 0xfb, 0xf5, 0x65, 0xfd, 0xa8, 0x1c, 0x14, 0xcb, 0x2d, 0xc5, 0x95, - 0xb1, 0xbe, 0xe9, 0x6d, 0xa7, 0xb6, 0x19, 0x01, 0x8d, 0xc9, 0xee, 0xc4, - 0x83, 0x29, 0xc8, 0x4c, 0x04, 0x8b, 0xe2, 0x29, 0x88, 0x98, 0x7b, 0xd9, - 0x4f, 0x1f, 0xc2, 0x6c, 0xa1, 0x0d, 0xc8, 0x4d, 0xfa, 0x32, 0x70, 0x24, - 0x6e, 0x11, 0x08, 0xc1, 0x7b, 0x8c, 0xe2, 0xcb, 0xff, 0xe3, 0xf1, 0xe9, - 0xff, 0x8e, 0x98, 0x63, 0xf5, 0x97, 0x4a, 0x4b, 0x2f, 0xff, 0xf1, 0xfa, - 0x3a, 0x59, 0xed, 0x47, 0x4b, 0x37, 0x80, 0x2b, 0x2f, 0xff, 0xa3, 0x3d, - 0xd7, 0x96, 0x80, 0x38, 0x28, 0x59, 0x52, 0x4c, 0x4f, 0x75, 0x3f, 0x78, - 0xbb, 0x7b, 0x05, 0xff, 0xa0, 0xa2, 0x59, 0xcc, 0x38, 0x59, 0x7f, 0xff, - 0xd1, 0xfb, 0x1e, 0x53, 0xbd, 0xdc, 0x66, 0x06, 0x3b, 0x0c, 0x59, 0x7f, - 0xfc, 0x65, 0xe0, 0x74, 0xf9, 0xb8, 0xfe, 0xc1, 0xac, 0xae, 0xa2, 0xe7, - 0xcd, 0x17, 0xf1, 0xed, 0x39, 0xcb, 0xf5, 0x97, 0xc1, 0x77, 0x0a, 0xa2, - 0xda, 0x5f, 0xff, 0xd0, 0xfe, 0x8e, 0xc7, 0x0c, 0xe4, 0x7a, 0xc1, 0xac, - 0xbf, 0xbb, 0x0c, 0x83, 0x1a, 0xca, 0x34, 0xc1, 0x26, 0x23, 0xd1, 0x87, - 0x0b, 0xbc, 0xaf, 0x7f, 0xee, 0x98, 0xde, 0x43, 0xe9, 0xb1, 0x65, 0xff, - 0x66, 0x07, 0x70, 0x1d, 0x3d, 0x2c, 0xbe, 0x8d, 0xf8, 0x6b, 0x2c, 0xdd, - 0x2c, 0xbf, 0xfb, 0x3d, 0x0c, 0x27, 0x14, 0xb3, 0xf5, 0x96, 0xfd, 0x65, - 0x4c, 0x7d, 0x64, 0x2d, 0xe4, 0x3b, 0xff, 0x19, 0x0e, 0x21, 0x8d, 0xef, - 0x25, 0x97, 0xfd, 0x1f, 0xf6, 0x36, 0x2c, 0xe2, 0xca, 0x83, 0xf8, 0x01, - 0xfd, 0xff, 0x44, 0xa3, 0x5b, 0x46, 0xb6, 0x59, 0x7f, 0xff, 0xa0, 0xc9, - 0xfc, 0x0f, 0x60, 0xe1, 0x83, 0xec, 0x7c, 0xb2, 0xff, 0x1b, 0x07, 0x1c, - 0x13, 0x8b, 0x2f, 0xff, 0x88, 0xf7, 0x9f, 0xbb, 0x1e, 0xe4, 0x6f, 0x85, - 0x95, 0xa4, 0x72, 0x75, 0x7c, 0x06, 0x97, 0x38, 0xd6, 0x5f, 0xfd, 0xe7, - 0x3c, 0x8d, 0x3c, 0x8f, 0xab, 0x2f, 0xce, 0x3c, 0x2f, 0xd6, 0x54, 0x8f, - 0xa0, 0xd0, 0x6f, 0xfa, 0x35, 0x3b, 0x91, 0xd7, 0x35, 0x97, 0xfb, 0xa6, - 0xf2, 0xf1, 0xec, 0xb2, 0xfc, 0x38, 0xc2, 0x35, 0x94, 0xdd, 0x32, 0x01, - 0x22, 0x33, 0x01, 0xa3, 0x64, 0x7e, 0xe1, 0x4b, 0x98, 0xfb, 0x47, 0x6c, - 0x84, 0x6f, 0x61, 0x4e, 0x44, 0x3c, 0x8c, 0x7b, 0xc6, 0x00, 0x7e, 0x68, - 0x87, 0x70, 0xe4, 0x43, 0x3b, 0xfa, 0x27, 0xeb, 0x30, 0x55, 0x97, 0xf0, - 0xaf, 0xa1, 0x80, 0x96, 0x5f, 0xf4, 0x78, 0xc2, 0x63, 0xf8, 0x96, 0x5f, - 0xf8, 0xfd, 0x1e, 0x3d, 0xf0, 0x41, 0x59, 0x77, 0xd2, 0x59, 0x4e, 0x7a, - 0xc0, 0x3e, 0xbf, 0x8b, 0x70, 0xf5, 0x82, 0xac, 0xbb, 0xdd, 0x59, 0x7f, - 0xd9, 0xee, 0x09, 0xcf, 0x67, 0x56, 0x56, 0xc7, 0xa2, 0xc1, 0x7b, 0xf1, - 0xec, 0xc8, 0x0a, 0xcb, 0xf3, 0xfd, 0x21, 0x38, 0xb2, 0xff, 0xc7, 0x37, - 0x37, 0xb9, 0x6c, 0x01, 0xac, 0xb4, 0xf1, 0x55, 0x0a, 0xe8, 0xbb, 0xb0, - 0x8e, 0x22, 0x1e, 0x42, 0x07, 0xc4, 0x7b, 0xca, 0x04, 0x2a, 0xa9, 0xea, - 0xf3, 0x72, 0x30, 0x1f, 0xe5, 0x22, 0x5c, 0xce, 0xac, 0xbf, 0x68, 0x2e, - 0xe1, 0x54, 0x5c, 0xab, 0xf9, 0xc7, 0xd8, 0x2d, 0x96, 0x5a, 0x78, 0xcf, - 0xe3, 0x05, 0xfa, 0x69, 0x7e, 0xd0, 0x5d, 0xc2, 0xa8, 0xbb, 0x57, 0xb6, - 0xc6, 0x96, 0x5f, 0xf1, 0xca, 0x46, 0x5f, 0xc4, 0x96, 0x5f, 0x1e, 0x9f, - 0xf5, 0x96, 0x9f, 0x88, 0xac, 0x61, 0xa3, 0x8f, 0x70, 0xe2, 0xa1, 0xf8, - 0x85, 0xf6, 0x2a, 0x95, 0x32, 0x9c, 0x72, 0x85, 0xb0, 0xdc, 0x5a, 0xc4, - 0xb0, 0xed, 0x50, 0x5e, 0xec, 0x2e, 0xfb, 0x48, 0x36, 0x2a, 0x67, 0x9f, - 0x21, 0x73, 0xe8, 0x71, 0x5f, 0xe9, 0xf9, 0xa0, 0xbb, 0x85, 0x51, 0x53, - 0xaf, 0xc5, 0x3f, 0x5c, 0xe2, 0xcb, 0xb6, 0xc5, 0x97, 0xf0, 0x3e, 0x63, - 0xb9, 0x2c, 0xb7, 0x96, 0x5f, 0xf4, 0x3e, 0xd3, 0xbe, 0xe4, 0x0d, 0x65, - 0x19, 0xe6, 0x90, 0x8d, 0xf0, 0x5d, 0xc2, 0xa8, 0xae, 0x57, 0xfa, 0x7e, - 0x68, 0x2e, 0xe1, 0x54, 0x59, 0xcb, 0x9e, 0x4b, 0x2f, 0xe9, 0x7b, 0xe0, - 0x9f, 0x16, 0x53, 0x9e, 0x28, 0x05, 0xaf, 0xe3, 0xe6, 0x13, 0xb4, 0xb2, - 0xb4, 0x98, 0x0f, 0x4b, 0x8a, 0x10, 0xde, 0x21, 0xbf, 0xfd, 0xe8, 0xe4, - 0xe0, 0x73, 0xd1, 0x34, 0xc6, 0xb2, 0xfe, 0x36, 0x6c, 0x0d, 0x49, 0x65, - 0xf9, 0x99, 0x33, 0xfe, 0xb2, 0xfb, 0x6e, 0xbf, 0x96, 0x53, 0x9e, 0x60, - 0x0a, 0x6f, 0xf4, 0x76, 0x73, 0x1b, 0x96, 0xc7, 0x96, 0x56, 0x26, 0x53, - 0xd4, 0xe2, 0x7b, 0xde, 0x43, 0x7f, 0xc5, 0x0c, 0xe0, 0x24, 0xe2, 0xac, - 0xbf, 0x6b, 0x3c, 0x6c, 0x59, 0x7c, 0xe5, 0x03, 0x59, 0x7e, 0x9a, 0x19, - 0x02, 0x2c, 0xba, 0x4c, 0x59, 0x58, 0x78, 0x04, 0x53, 0x7f, 0xfb, 0xa7, - 0x3b, 0xae, 0x7e, 0x8c, 0x19, 0xac, 0xbf, 0x68, 0x2e, 0xe1, 0x54, 0x48, - 0x4b, 0xff, 0xfb, 0x87, 0xa0, 0xf7, 0x27, 0x6b, 0x58, 0xd6, 0xe4, 0x31, - 0x65, 0xff, 0xb1, 0x98, 0xfa, 0xda, 0x77, 0xcc, 0x59, 0x7f, 0xbe, 0xe7, - 0x8a, 0x19, 0xc5, 0x97, 0xff, 0x9c, 0x83, 0x38, 0x64, 0xf2, 0xeb, 0xc9, - 0x65, 0x19, 0xff, 0x00, 0xd2, 0xfe, 0xc2, 0x3f, 0xf9, 0x0b, 0x2d, 0x3e, - 0x49, 0xf5, 0xe2, 0x4f, 0xc6, 0x9d, 0x61, 0xfe, 0x18, 0x1c, 0x21, 0xb8, - 0xfa, 0xb2, 0xff, 0xce, 0x24, 0xc4, 0x7e, 0x28, 0xfd, 0x65, 0x49, 0x17, - 0x7f, 0x33, 0x78, 0x5a, 0xff, 0xee, 0x9b, 0x33, 0x93, 0xbe, 0x96, 0x79, - 0x65, 0xf4, 0xba, 0x27, 0x16, 0x5f, 0xd3, 0xfb, 0x06, 0x0e, 0x2c, 0xa8, - 0x44, 0xd6, 0x23, 0xb9, 0x25, 0xf3, 0x73, 0xd8, 0x62, 0xcb, 0xfb, 0xbc, - 0xe6, 0x6b, 0x65, 0x97, 0x43, 0x4b, 0x2f, 0xfb, 0xfc, 0x19, 0x3f, 0xf1, - 0xbd, 0x65, 0x62, 0x20, 0x4c, 0xbd, 0xc5, 0xef, 0x33, 0x7c, 0x96, 0x5f, - 0xfe, 0xec, 0x7e, 0xc7, 0x97, 0x3d, 0x98, 0xc5, 0x96, 0x9e, 0xda, 0xd9, - 0x22, 0xfb, 0x0b, 0x8d, 0xeb, 0x23, 0x21, 0x38, 0xda, 0xe6, 0x3e, 0xd1, - 0xcb, 0x09, 0xfa, 0xc0, 0xf2, 0xb1, 0x8a, 0x19, 0x7c, 0x2d, 0xf4, 0x2a, - 0x00, 0x5a, 0x20, 0xfd, 0xff, 0xec, 0xfa, 0x78, 0xc0, 0xfa, 0x97, 0x5a, - 0x75, 0x97, 0xff, 0x4f, 0xeb, 0xf0, 0xb3, 0xde, 0x8f, 0xd6, 0x5f, 0xfe, - 0x9e, 0xc7, 0x94, 0xfc, 0xd0, 0x5d, 0xc2, 0xa8, 0x9f, 0x17, 0xfd, 0xe9, - 0xe0, 0x15, 0xfd, 0x8d, 0x2c, 0xa0, 0xb2, 0xe9, 0xcd, 0x07, 0x76, 0x92, - 0x83, 0xa8, 0x7d, 0x31, 0x3b, 0xa8, 0xce, 0xb5, 0x7f, 0xff, 0x00, 0x9c, - 0x59, 0xde, 0x16, 0x0a, 0x59, 0xd3, 0x62, 0xcb, 0x8f, 0xe5, 0x97, 0xff, - 0xd2, 0xd9, 0xb4, 0x86, 0xe7, 0x60, 0xea, 0x74, 0xee, 0xee, 0x2c, 0xa9, - 0x1f, 0xe7, 0xe2, 0xf7, 0xff, 0x8b, 0x6e, 0xc1, 0xfb, 0x86, 0x5f, 0x49, - 0x65, 0xff, 0xbc, 0x2c, 0x14, 0xb3, 0xa6, 0xc5, 0x97, 0xfc, 0x2c, 0x14, - 0xb3, 0xa6, 0xc5, 0x97, 0xc0, 0x27, 0x16, 0x71, 0xfb, 0x78, 0xfa, 0xfd, - 0xaf, 0xcf, 0xb0, 0xb2, 0x98, 0x7c, 0x60, 0x3b, 0xbf, 0x66, 0xb3, 0x26, - 0x59, 0x69, 0xec, 0x54, 0xd1, 0xd8, 0x6c, 0xb9, 0x1f, 0x23, 0x23, 0x10, - 0x8a, 0xfd, 0xa0, 0xbb, 0x85, 0x51, 0x59, 0x2f, 0xfc, 0xf2, 0x9f, 0x9a, - 0x0b, 0xb8, 0x55, 0x13, 0x72, 0xd3, 0xf1, 0x10, 0x0c, 0x34, 0xa0, 0xa6, - 0x12, 0x70, 0xdf, 0xbe, 0x0b, 0xb8, 0x55, 0x12, 0xb2, 0xff, 0xfb, 0x5b, - 0x14, 0x69, 0xc6, 0x4f, 0xa8, 0xde, 0xb2, 0xb4, 0x7f, 0xc0, 0x2e, 0xbf, - 0x14, 0x0d, 0xfa, 0xb2, 0xff, 0x41, 0x94, 0x4a, 0x1b, 0xd6, 0x5f, 0x31, - 0xe5, 0x3f, 0x0f, 0xec, 0xc8, 0xb8, 0x4d, 0x7e, 0x9e, 0xf3, 0x73, 0x16, - 0x54, 0xf3, 0xf0, 0xd9, 0x1a, 0xff, 0xde, 0xc9, 0xf9, 0xa3, 0xd9, 0xd8, - 0xb2, 0xff, 0xf3, 0x74, 0xdd, 0xb6, 0x39, 0x8f, 0x23, 0xcd, 0x62, 0xcb, - 0xff, 0x1f, 0x00, 0xc2, 0x3d, 0xe0, 0x75, 0x97, 0xf4, 0x13, 0x85, 0xf7, - 0x56, 0x54, 0x8f, 0xb5, 0x87, 0xf7, 0x0f, 0x4b, 0x2f, 0xda, 0x0b, 0xb8, - 0x55, 0x12, 0xe2, 0xff, 0x8d, 0xe5, 0xe2, 0x86, 0x71, 0x65, 0xfa, 0x5b, - 0x87, 0xd7, 0x59, 0x7a, 0x37, 0x21, 0x65, 0xff, 0xfd, 0x80, 0x0f, 0x60, - 0xa2, 0x4e, 0x38, 0xfb, 0x46, 0xb2, 0xf1, 0x94, 0x2c, 0xa9, 0x22, 0xec, - 0x65, 0x5b, 0xa3, 0xdb, 0xd6, 0x6f, 0xfe, 0x04, 0x88, 0xe5, 0x1e, 0x20, - 0x49, 0x65, 0xfa, 0x39, 0xfb, 0x3c, 0xb2, 0xde, 0x33, 0xec, 0xea, 0x1d, - 0x82, 0xb2, 0x9c, 0xdc, 0x7e, 0x4f, 0x7f, 0x4b, 0xb8, 0x58, 0x15, 0x97, - 0xa5, 0xdf, 0x2c, 0xbb, 0xb0, 0x67, 0x93, 0xd2, 0xcb, 0xff, 0x88, 0xff, - 0xe6, 0xa0, 0xe4, 0xfc, 0x59, 0x58, 0x7d, 0xe6, 0x59, 0x7f, 0x68, 0xd8, - 0x4f, 0x25, 0x97, 0xfe, 0xfa, 0x59, 0xec, 0xd0, 0x63, 0x16, 0x5e, 0x79, - 0x4f, 0x6e, 0x2b, 0x8d, 0x71, 0x0c, 0x39, 0x11, 0x60, 0xbf, 0x4d, 0x1e, - 0x1e, 0x5c, 0x87, 0x37, 0xa1, 0xb2, 0x02, 0x06, 0xf2, 0xcb, 0xff, 0x01, - 0x93, 0xf9, 0x05, 0xec, 0xd2, 0xcb, 0xfe, 0x1e, 0x4f, 0x8d, 0x1f, 0x40, - 0xb2, 0xff, 0xe1, 0xc4, 0xf6, 0xfc, 0xfa, 0x5d, 0x8e, 0x2c, 0xb4, 0xf3, - 0x5e, 0x2a, 0x64, 0xe5, 0x5f, 0x21, 0x76, 0x04, 0x0d, 0xe7, 0x57, 0xff, - 0x4f, 0x79, 0x4f, 0xcd, 0x05, 0xdc, 0x2a, 0x88, 0xed, 0x7f, 0xfc, 0x08, - 0xfa, 0x46, 0xc6, 0xb0, 0x87, 0xd8, 0x59, 0x7e, 0x67, 0xde, 0x36, 0x96, - 0x5d, 0xb4, 0xf1, 0x9f, 0xd0, 0x8a, 0x17, 0xfb, 0xb9, 0x29, 0xee, 0x5c, - 0x59, 0x58, 0x7c, 0xde, 0x32, 0xbf, 0x9b, 0x25, 0x01, 0xc2, 0x59, 0x70, - 0x3a, 0xb2, 0xfe, 0x6c, 0x16, 0x75, 0xfc, 0xb2, 0xfb, 0x19, 0xa8, 0x59, - 0x7e, 0xc2, 0x3f, 0xc4, 0x59, 0x44, 0x79, 0x3c, 0x21, 0xbf, 0xff, 0x48, - 0xc7, 0xd3, 0xdf, 0x3b, 0x07, 0xa3, 0x00, 0x56, 0x51, 0x9f, 0xd7, 0x88, - 0x6f, 0xf6, 0x35, 0xc8, 0x2f, 0x71, 0x65, 0xfd, 0xf9, 0x67, 0xde, 0xc5, - 0x97, 0x6d, 0xba, 0xb2, 0xfc, 0xe2, 0xf7, 0x3f, 0x59, 0x7f, 0x17, 0xef, - 0xa7, 0x11, 0x65, 0x42, 0x28, 0x36, 0x2e, 0xd0, 0xdb, 0x94, 0xdf, 0xff, - 0xff, 0xbb, 0x1d, 0xeb, 0x8c, 0x9e, 0x77, 0x3b, 0x1c, 0x9c, 0x07, 0x9d, - 0x2c, 0xdf, 0x0b, 0x2f, 0xda, 0xd4, 0x6f, 0xe2, 0xcb, 0xff, 0x1e, 0xa7, - 0x70, 0xb1, 0x90, 0x15, 0x97, 0xf8, 0x1e, 0x37, 0xde, 0xf2, 0x59, 0x7f, - 0x3e, 0xf1, 0xe1, 0x0a, 0xb2, 0xd0, 0x47, 0xc6, 0x21, 0xa5, 0xff, 0xff, - 0xdf, 0xc1, 0x05, 0xfc, 0xff, 0x7f, 0x3b, 0x08, 0xe0, 0x1d, 0xec, 0x2c, - 0xbf, 0xf1, 0x02, 0x53, 0xb0, 0xca, 0x18, 0xb2, 0xfe, 0xe4, 0x8c, 0x2f, - 0xa5, 0x97, 0x9d, 0xc2, 0xa8, 0xa8, 0x55, 0x07, 0xaa, 0x12, 0xdb, 0xf8, - 0x01, 0x31, 0x5c, 0x2b, 0x2f, 0xfb, 0x3b, 0x84, 0xfa, 0xd1, 0xac, 0xa9, - 0x2b, 0x07, 0xc8, 0x44, 0x8a, 0x54, 0x18, 0x51, 0x7c, 0x4e, 0x6e, 0x7a, - 0x84, 0x99, 0x10, 0xf0, 0xba, 0xf6, 0xeb, 0xc2, 0xcb, 0xa5, 0x8b, 0x2f, - 0xfa, 0x5e, 0x3d, 0x38, 0x4c, 0x96, 0x5e, 0xff, 0x98, 0xb2, 0xff, 0x70, - 0x13, 0x38, 0xde, 0x65, 0x95, 0x23, 0xd2, 0xf8, 0x76, 0xfd, 0x22, 0x86, - 0x0a, 0xb2, 0xff, 0xe6, 0x66, 0x8b, 0x0f, 0x79, 0xe9, 0xd6, 0x57, 0xc7, - 0xd6, 0xe5, 0x17, 0xfe, 0x2c, 0x9b, 0xdd, 0xcd, 0x1f, 0x16, 0x5f, 0xfc, - 0xec, 0x9c, 0xc7, 0xf4, 0xee, 0xfb, 0x4b, 0x2b, 0xa8, 0x87, 0x23, 0xeb, - 0xf7, 0xc4, 0x6c, 0x35, 0x97, 0xe8, 0x6c, 0xed, 0x8d, 0x2c, 0xa8, 0x4c, - 0x7f, 0x21, 0x52, 0x64, 0x5a, 0x27, 0xbf, 0xbc, 0xfd, 0x9c, 0x38, 0x59, - 0x7f, 0xde, 0xe0, 0x9c, 0x7f, 0xa5, 0x8b, 0x2f, 0xe3, 0xec, 0x76, 0x36, - 0x59, 0x50, 0x89, 0x7c, 0x2f, 0x01, 0xdd, 0xfd, 0xa9, 0x47, 0xb3, 0x65, - 0x97, 0xbe, 0xf6, 0x2c, 0xbf, 0xb8, 0x64, 0x1e, 0xc2, 0xca, 0xc3, 0xf7, - 0xd1, 0x77, 0x87, 0x6f, 0xfd, 0x9e, 0xe6, 0xb2, 0x6e, 0x98, 0xab, 0x2f, - 0xfc, 0x58, 0x2e, 0x30, 0xf7, 0x21, 0x8b, 0x2f, 0xfa, 0x73, 0x96, 0x37, - 0xce, 0xe8, 0x16, 0x5f, 0x9a, 0x3d, 0x60, 0xab, 0x2a, 0x13, 0x16, 0x32, - 0xe7, 0x40, 0x02, 0x00, 0x87, 0xf7, 0xfa, 0x51, 0xad, 0xa3, 0x5b, 0x2c, - 0xbf, 0xf7, 0x30, 0xbd, 0xcc, 0x91, 0xf5, 0x65, 0xfd, 0xcc, 0xde, 0x51, - 0xf2, 0xcb, 0x81, 0xd5, 0x95, 0xc4, 0x41, 0xf8, 0xf7, 0x70, 0xbe, 0xff, - 0xfa, 0x3f, 0xc2, 0x9c, 0xfe, 0x9d, 0xdc, 0xfd, 0xd6, 0x5c, 0x5b, 0x2c, - 0xa8, 0x4d, 0x57, 0x21, 0x70, 0x66, 0x64, 0xa7, 0x7f, 0xfb, 0xb0, 0xc2, - 0x71, 0x4b, 0x3f, 0xfb, 0xf5, 0x97, 0xf6, 0xf7, 0x67, 0x5a, 0x75, 0x97, - 0xff, 0xf8, 0xe3, 0xcf, 0xd9, 0xfc, 0xee, 0x17, 0xa7, 0x7f, 0x2e, 0x2c, - 0xa9, 0x23, 0x84, 0xd3, 0x08, 0xc2, 0xf7, 0x01, 0xa5, 0x97, 0x8f, 0xa6, - 0xb2, 0xfe, 0xd3, 0x97, 0xff, 0xc2, 0xca, 0xc4, 0x4a, 0x19, 0x73, 0x8e, - 0x88, 0x37, 0x7b, 0xd9, 0xb2, 0xcb, 0xf6, 0x04, 0x0f, 0xb2, 0xca, 0xe9, - 0xe2, 0x90, 0xed, 0xff, 0xf6, 0x88, 0x1f, 0x16, 0x1e, 0x83, 0xd8, 0xe2, - 0xcb, 0xff, 0xf8, 0x2f, 0xdc, 0x94, 0x6a, 0x3f, 0xd4, 0x08, 0xe4, 0xb2, - 0xa1, 0x15, 0x38, 0x9f, 0x7e, 0xcd, 0x9c, 0xb7, 0xac, 0xbf, 0xff, 0xff, - 0xd1, 0x29, 0xde, 0xe9, 0xc7, 0x27, 0x60, 0x03, 0x1b, 0xe7, 0x66, 0xb5, - 0x9b, 0xc0, 0xfd, 0x59, 0x7d, 0xd2, 0x76, 0xf5, 0x95, 0x89, 0xe7, 0xf6, - 0x19, 0x44, 0x43, 0xc2, 0x9f, 0x42, 0x5e, 0xff, 0x3f, 0xdc, 0x36, 0x40, - 0x56, 0x5f, 0xff, 0xf0, 0x1f, 0x74, 0xf6, 0xeb, 0x9f, 0xa3, 0xa7, 0xee, - 0x60, 0xd6, 0x5f, 0xfb, 0x7b, 0xcb, 0x08, 0x65, 0x12, 0x59, 0x76, 0xd0, - 0xb2, 0xc5, 0x87, 0xaa, 0x03, 0xeb, 0x4f, 0x6c, 0x36, 0x40, 0x8d, 0xc9, - 0x7b, 0x64, 0x5e, 0x21, 0xe7, 0xb1, 0x08, 0xe1, 0xa7, 0x92, 0xd0, 0xc5, - 0x84, 0x70, 0x47, 0xbe, 0x16, 0x38, 0x44, 0xea, 0x3a, 0xd6, 0x43, 0x5f, - 0xb1, 0xdd, 0x94, 0x73, 0xdc, 0x8e, 0xd3, 0xd2, 0x93, 0xc0, 0xa7, 0xb8, - 0x66, 0x24, 0x2f, 0x6f, 0x82, 0xee, 0x15, 0x45, 0x50, 0xbf, 0xda, 0x8d, - 0xff, 0x4b, 0x3c, 0xb2, 0xb4, 0x7c, 0x80, 0x2e, 0xbf, 0xf3, 0xca, 0x7e, - 0x68, 0x2e, 0xe1, 0x54, 0x4d, 0x6b, 0xfe, 0xec, 0x33, 0x9c, 0x72, 0x0a, - 0xcb, 0xe8, 0xd4, 0x79, 0x65, 0xcf, 0xe5, 0x94, 0x33, 0x6e, 0xc2, 0x1b, - 0x4f, 0xc4, 0x7f, 0x30, 0x8b, 0xa9, 0x8e, 0xdf, 0x7e, 0xd0, 0x5d, 0xc2, - 0xa8, 0xab, 0x17, 0xfd, 0x12, 0x8d, 0x6d, 0x1a, 0xd9, 0x65, 0xa7, 0xe1, - 0xf7, 0x11, 0xa5, 0xfe, 0x8f, 0xbd, 0x1d, 0x7d, 0xd5, 0x97, 0xf6, 0x81, - 0x37, 0x23, 0xcb, 0x2b, 0xa7, 0xca, 0x03, 0x6b, 0xff, 0xbf, 0xc2, 0x9f, - 0x2f, 0xf9, 0xb3, 0x92, 0xca, 0x9e, 0x7d, 0x50, 0x45, 0x7f, 0x1b, 0x0f, - 0xdd, 0x85, 0x97, 0xd1, 0x34, 0x7c, 0xb2, 0xba, 0x79, 0xfc, 0x2c, 0xbf, - 0xe9, 0x4f, 0xcd, 0x05, 0xdc, 0x2a, 0x89, 0x11, 0x7f, 0x6d, 0x1a, 0xeb, - 0x9a, 0xcb, 0x4f, 0xc4, 0x4b, 0x39, 0x17, 0x11, 0xef, 0xda, 0x0b, 0xb8, - 0x55, 0x16, 0x92, 0xff, 0xcf, 0x29, 0xf9, 0xa0, 0xbb, 0x85, 0x51, 0x3e, - 0xad, 0x3f, 0x11, 0x00, 0xc3, 0x4b, 0xff, 0xd3, 0xd8, 0xf2, 0x9f, 0x9a, - 0x0b, 0xb8, 0x55, 0x14, 0x22, 0xff, 0xec, 0x6a, 0x7f, 0x85, 0x7e, 0x1f, - 0xa1, 0x65, 0xfb, 0xc0, 0x0b, 0xf1, 0x65, 0xf1, 0xed, 0x1a, 0x59, 0x4c, - 0x3c, 0xae, 0x94, 0x5f, 0xb4, 0x17, 0x70, 0xaa, 0x28, 0xf5, 0xff, 0x44, - 0xa3, 0x5b, 0x46, 0xb6, 0x59, 0x7f, 0xff, 0xff, 0x84, 0x3d, 0x4d, 0x1d, - 0xd6, 0x75, 0xc4, 0xe6, 0x0a, 0xe5, 0xfc, 0x14, 0x4d, 0xd8, 0x59, 0x7e, - 0x7e, 0x1f, 0xa1, 0x65, 0xff, 0x44, 0xd0, 0x51, 0x37, 0x61, 0x65, 0x42, - 0x3b, 0x85, 0x84, 0x81, 0x13, 0x5f, 0xff, 0xd8, 0x3e, 0xc0, 0x93, 0xfc, - 0x4f, 0xff, 0x39, 0x1f, 0xa4, 0xbc, 0xf2, 0x9f, 0x0a, 0x84, 0x70, 0x88, - 0x8d, 0x3d, 0x19, 0x46, 0xe1, 0xa5, 0xff, 0xd9, 0xd9, 0xfe, 0x15, 0xf8, - 0x7e, 0x85, 0x96, 0x9f, 0xb2, 0xb4, 0xd6, 0x4a, 0xa2, 0xf3, 0x2d, 0x43, - 0xa4, 0x54, 0xda, 0x79, 0x3e, 0x4c, 0x79, 0x19, 0xa0, 0xb5, 0x91, 0x28, - 0x65, 0x68, 0x7d, 0x0b, 0x13, 0x87, 0xbc, 0xd1, 0x84, 0x76, 0x16, 0xdf, - 0x95, 0x7a, 0x5d, 0x3d, 0xfb, 0x41, 0x77, 0x0a, 0xa2, 0x22, 0x5f, 0xee, - 0x02, 0x26, 0xf1, 0xef, 0x59, 0x69, 0xf8, 0x7d, 0x53, 0x1a, 0x5f, 0xd9, - 0xa0, 0xbb, 0x85, 0x51, 0x15, 0xaf, 0xfb, 0x76, 0x7e, 0x68, 0x2e, 0xe1, - 0x54, 0x57, 0x0a, 0x9e, 0x88, 0x37, 0x39, 0xbe, 0xeb, 0xe8, 0xd6, 0x5f, - 0xbd, 0xf8, 0x85, 0x25, 0x97, 0xef, 0xe0, 0x83, 0x3e, 0x0f, 0x2d, 0xc8, - 0x6f, 0xa7, 0xed, 0x36, 0xea, 0xcb, 0x1f, 0xc7, 0xd3, 0xf9, 0xfd, 0xf6, - 0x75, 0xfc, 0xb2, 0xff, 0x61, 0xeb, 0xff, 0xc1, 0xc5, 0x96, 0x6c, 0x11, - 0xeb, 0x70, 0x86, 0xff, 0xfe, 0xf7, 0x0f, 0xae, 0x72, 0x32, 0xf0, 0x3b, - 0xac, 0x59, 0x7c, 0x17, 0x70, 0xaa, 0x29, 0xe5, 0xff, 0x8a, 0x37, 0x9f, - 0xa5, 0x18, 0x4b, 0x2b, 0x47, 0xd7, 0xe2, 0xeb, 0xfc, 0x3f, 0xe7, 0x46, - 0xec, 0x49, 0x65, 0xfe, 0x61, 0x8c, 0x0f, 0xa9, 0x2c, 0xb9, 0x86, 0xb2, - 0xa0, 0xf2, 0x42, 0x67, 0x7f, 0xff, 0x47, 0xb8, 0x06, 0x04, 0xff, 0x8c, - 0xe9, 0x80, 0x2b, 0x2f, 0xe8, 0x67, 0x20, 0xf6, 0x59, 0x52, 0x44, 0x47, - 0x96, 0xef, 0xff, 0xe7, 0xd3, 0xf7, 0xe9, 0x67, 0xb0, 0x81, 0xe0, 0x0a, - 0xb2, 0xfa, 0x51, 0x9b, 0x2c, 0xbf, 0xff, 0x68, 0x1a, 0xd4, 0x16, 0x0a, - 0x7d, 0xee, 0x08, 0xb2, 0x82, 0x8d, 0x4f, 0x97, 0x34, 0x45, 0x78, 0xcb, - 0xcb, 0x2f, 0xfd, 0x2c, 0x2f, 0xe1, 0x87, 0xa9, 0x2c, 0xbf, 0xfe, 0x66, - 0x1f, 0x81, 0xe8, 0x91, 0x8f, 0x06, 0xb2, 0x8d, 0x11, 0x9f, 0x9f, 0x5f, - 0xe9, 0x46, 0xb6, 0x8d, 0x6c, 0xb2, 0xfa, 0x71, 0x3c, 0x96, 0x5f, 0x9f, - 0x3a, 0x6c, 0x59, 0x5c, 0x3c, 0x9d, 0xe4, 0x75, 0x08, 0xa2, 0xc7, 0xeb, - 0xfe, 0xde, 0xec, 0x9c, 0x3e, 0x9b, 0x16, 0x5f, 0xf1, 0x43, 0x22, 0x45, - 0x8c, 0x59, 0x7f, 0xf9, 0x91, 0xad, 0xa3, 0xec, 0x03, 0x6f, 0x06, 0xb2, - 0xb1, 0x18, 0x46, 0x7a, 0xe6, 0xd7, 0xf8, 0x83, 0x9b, 0xf3, 0xdc, 0x59, - 0x73, 0x8a, 0xb2, 0xa0, 0xf2, 0xf4, 0x69, 0x7e, 0x7d, 0xa3, 0x40, 0x59, - 0x4d, 0x95, 0xe7, 0x48, 0x2b, 0xc8, 0x62, 0x0a, 0x44, 0x18, 0x41, 0x7d, - 0x0a, 0x93, 0x87, 0xbc, 0xc6, 0x2f, 0x0a, 0x72, 0x86, 0x2f, 0x21, 0xc7, - 0xbd, 0xe3, 0x70, 0x86, 0xff, 0xf3, 0xca, 0x78, 0xc9, 0xda, 0xe7, 0x23, - 0xf5, 0x97, 0xff, 0xbf, 0xfc, 0x1c, 0x9e, 0x21, 0x3b, 0x0a, 0x16, 0x5f, - 0xfc, 0x59, 0xfb, 0x97, 0xf3, 0xd8, 0x6c, 0x59, 0x5a, 0x44, 0xa7, 0x93, - 0xaf, 0xcf, 0xde, 0x9c, 0xcb, 0x2f, 0xfe, 0xce, 0x19, 0x7e, 0x59, 0xee, - 0xe2, 0xcb, 0xff, 0x19, 0x7e, 0x59, 0xee, 0xe4, 0xfe, 0x9f, 0x50, 0x85, - 0x15, 0x3d, 0x55, 0x20, 0xe1, 0xbe, 0x70, 0xe1, 0xe4, 0x23, 0x6d, 0x8b, - 0x2f, 0xc5, 0x00, 0x6d, 0xf1, 0x65, 0xfc, 0x2e, 0x9c, 0x6e, 0x4b, 0x28, - 0x67, 0xd1, 0x82, 0x0e, 0x57, 0x7f, 0xf1, 0x8f, 0x4f, 0xf4, 0xfd, 0x6a, - 0x36, 0x59, 0x53, 0xcf, 0xd7, 0xa5, 0xb7, 0x0e, 0x16, 0x5f, 0xff, 0xbb, - 0x1a, 0xc9, 0x1b, 0xfb, 0x06, 0x60, 0x0a, 0x4b, 0xf4, 0x4b, 0xf0, 0x49, - 0x65, 0xf0, 0x5d, 0xc2, 0xa8, 0xac, 0xd5, 0x31, 0xeb, 0xe8, 0xa6, 0xfb, - 0xc6, 0xce, 0x2c, 0xbc, 0x2f, 0x05, 0x59, 0x7d, 0xcd, 0x46, 0xf5, 0x97, - 0xf6, 0xf2, 0x28, 0xdd, 0x99, 0x65, 0xf9, 0x90, 0x52, 0xe2, 0xca, 0x83, - 0xd9, 0xd8, 0xca, 0xfb, 0xdc, 0x13, 0x8b, 0x2f, 0xb9, 0xc8, 0x69, 0x65, - 0x9d, 0x65, 0x61, 0xeb, 0x99, 0x27, 0x08, 0xee, 0xd8, 0xd6, 0x5f, 0xee, - 0x4c, 0x65, 0xdc, 0xf9, 0x65, 0x41, 0xe5, 0xe0, 0xbd, 0xcf, 0xe5, 0x97, - 0xdf, 0x88, 0x52, 0x59, 0x43, 0x37, 0x5e, 0x16, 0xbf, 0xfe, 0x86, 0x7b, - 0x30, 0xbd, 0xce, 0xe7, 0xee, 0xb2, 0xf0, 0x1f, 0x8b, 0x2f, 0xfb, 0x24, - 0x60, 0xdd, 0x6e, 0x7f, 0x62, 0xcb, 0x1a, 0xcb, 0xfb, 0xb8, 0x44, 0xfe, - 0x59, 0xc2, 0xc2, 0xfc, 0x5e, 0xec, 0x6f, 0x59, 0x79, 0xdd, 0x8b, 0x2f, - 0xd9, 0x36, 0xc0, 0xfd, 0x65, 0xfd, 0xe8, 0xd7, 0xf1, 0x32, 0xcb, 0x4f, - 0x85, 0xca, 0x11, 0x8b, 0x64, 0x2a, 0xbe, 0x23, 0x32, 0x29, 0x87, 0xf4, - 0xfa, 0xc7, 0x9e, 0xbc, 0x3a, 0xd7, 0xe4, 0x24, 0x9d, 0xc1, 0xcf, 0x29, - 0x00, 0xeb, 0x79, 0x48, 0x83, 0x6d, 0xe5, 0x77, 0xfe, 0xe9, 0xf9, 0xf5, - 0xb4, 0x18, 0xd6, 0x5f, 0xfb, 0xc0, 0x66, 0x07, 0x5f, 0x3b, 0x4b, 0x2f, - 0xf6, 0xa0, 0x5c, 0x23, 0x15, 0x65, 0xff, 0xe8, 0x68, 0x46, 0x16, 0x7d, - 0xe8, 0xc6, 0x96, 0x5f, 0xbc, 0x65, 0x8c, 0x59, 0x7d, 0x27, 0x29, 0xf8, - 0x99, 0x27, 0xc7, 0xda, 0x41, 0x10, 0xcd, 0xbd, 0x32, 0xff, 0xcf, 0x29, - 0xf9, 0xa0, 0xbb, 0x85, 0x51, 0x22, 0xaf, 0xff, 0xde, 0xee, 0x14, 0xff, - 0x3b, 0xfd, 0xc1, 0x45, 0x75, 0x97, 0xfe, 0x7f, 0x4f, 0x83, 0xd1, 0xf8, - 0x0b, 0x2a, 0x7a, 0x39, 0x21, 0x31, 0xd6, 0x6f, 0xfc, 0x7a, 0xd1, 0xb5, - 0x93, 0x1b, 0x16, 0x5f, 0xb4, 0x17, 0x70, 0xaa, 0x2c, 0x95, 0x41, 0xf9, - 0xe1, 0xfd, 0xfb, 0x63, 0x29, 0x71, 0x65, 0xfe, 0x06, 0xdd, 0x8f, 0x70, - 0xd6, 0x5f, 0xc0, 0x19, 0xe9, 0xf8, 0xb2, 0xfd, 0xee, 0x09, 0xc9, 0xf8, - 0x88, 0x9d, 0x14, 0x70, 0xd2, 0xa7, 0xa3, 0xe7, 0x21, 0x53, 0x7f, 0x9b, - 0xcd, 0x91, 0xd1, 0x06, 0xb2, 0xfe, 0xe9, 0xea, 0x25, 0xc5, 0x97, 0xf3, - 0x3c, 0x7d, 0x76, 0x2c, 0xbf, 0xfc, 0x7e, 0xee, 0x7b, 0x0a, 0x3d, 0x03, - 0x59, 0x50, 0x7e, 0x8e, 0x5b, 0x7f, 0xce, 0x7e, 0x06, 0x9f, 0x93, 0xf1, - 0x1f, 0x01, 0x37, 0xec, 0x28, 0x6f, 0xec, 0xd0, 0x5d, 0xc2, 0xa8, 0xb6, - 0x17, 0xff, 0xee, 0xce, 0x2c, 0xd7, 0xb9, 0xd9, 0xa7, 0x4e, 0xee, 0xe2, - 0xcb, 0xf7, 0x5f, 0x46, 0xc5, 0x94, 0xd8, 0x44, 0x40, 0x58, 0x6f, 0x68, - 0x1d, 0x59, 0x77, 0xa7, 0xc1, 0xe2, 0x68, 0x9e, 0xa7, 0xa6, 0x68, 0x71, - 0x82, 0xde, 0xce, 0x62, 0xcb, 0xe0, 0xbb, 0x85, 0x51, 0x6d, 0xae, 0x7d, - 0x2c, 0xb4, 0x96, 0x5b, 0x9b, 0x1a, 0x70, 0x0b, 0x56, 0x8f, 0xf7, 0xca, - 0xb7, 0xf1, 0xf7, 0xc7, 0xf8, 0x16, 0x5f, 0xf4, 0x4a, 0x35, 0xb4, 0x6b, - 0x65, 0x97, 0xd1, 0x37, 0x0d, 0x65, 0x49, 0x34, 0x4c, 0x84, 0xc4, 0xc4, - 0x44, 0x5c, 0xde, 0x75, 0x7f, 0xe1, 0xe8, 0xc1, 0xb4, 0xfe, 0x6b, 0xcb, - 0x2a, 0x7a, 0x25, 0x71, 0x4a, 0xf7, 0x73, 0x65, 0x97, 0xf3, 0x8f, 0x30, - 0x85, 0x59, 0x7d, 0x85, 0xfc, 0xf9, 0x8f, 0x25, 0x83, 0xb7, 0x9b, 0x3d, - 0x1a, 0xcb, 0xdb, 0x74, 0xd6, 0x5f, 0xf9, 0xb2, 0xd9, 0x6d, 0x5e, 0xee, - 0x14, 0x7e, 0xb2, 0xf3, 0x71, 0x6e, 0x0d, 0xc5, 0x65, 0xfb, 0xd1, 0xd7, - 0x99, 0x65, 0xfd, 0x05, 0x21, 0x81, 0x8b, 0x2f, 0xf7, 0x4c, 0x49, 0xb8, - 0x0f, 0x96, 0x5f, 0xf6, 0x6b, 0x51, 0x27, 0xf9, 0xa5, 0x97, 0xc1, 0x77, - 0x0a, 0xa2, 0xf0, 0x5f, 0xbd, 0xf0, 0x4f, 0x4b, 0x2f, 0xfc, 0xfe, 0x8d, - 0xfa, 0xd6, 0x7d, 0xc5, 0x95, 0xa4, 0x4c, 0x30, 0xb8, 0x8a, 0x6f, 0xda, - 0xf3, 0x6b, 0xc9, 0x96, 0x5c, 0xfc, 0x59, 0x7b, 0x73, 0x3a, 0xb2, 0xbf, - 0x36, 0xbe, 0x16, 0xbf, 0x32, 0x0a, 0x4e, 0xb2, 0xfe, 0x82, 0xf6, 0xf7, - 0x0a, 0xcb, 0xfa, 0x51, 0xbe, 0x35, 0xf2, 0xca, 0x91, 0xef, 0x61, 0x75, - 0xfe, 0x8f, 0x3f, 0x67, 0x0e, 0x16, 0x5f, 0xf8, 0x46, 0x7d, 0x2f, 0x61, - 0x7b, 0x8b, 0x2e, 0xc1, 0x56, 0x5f, 0x9e, 0x5e, 0x3d, 0x96, 0x54, 0x22, - 0x03, 0x10, 0x4c, 0x5e, 0xec, 0x62, 0xcb, 0xf1, 0xf4, 0x67, 0xc5, 0x96, - 0x3d, 0x8d, 0xec, 0x85, 0xaf, 0xd8, 0x5f, 0xb7, 0xc2, 0xcb, 0xf4, 0x08, - 0x07, 0xe2, 0xcb, 0xa6, 0x1a, 0xcb, 0xff, 0x99, 0x01, 0x9d, 0x84, 0x09, - 0x67, 0x16, 0x5f, 0xee, 0x9b, 0x42, 0xe9, 0xda, 0x59, 0x7f, 0xff, 0xe7, - 0x3f, 0x3b, 0x1c, 0xbf, 0x0f, 0x4f, 0x52, 0x12, 0x58, 0x4b, 0x2f, 0xe8, - 0xfb, 0xe9, 0x3f, 0xcb, 0x28, 0x69, 0x97, 0x60, 0xc0, 0x51, 0x7a, 0x6c, - 0x06, 0xbb, 0xfc, 0xe5, 0xff, 0xb7, 0x33, 0xab, 0x2f, 0xfb, 0xaf, 0x26, - 0x1c, 0x6a, 0x4b, 0x2d, 0x9b, 0xa7, 0xdd, 0xd3, 0x6b, 0xe8, 0x29, 0x6e, - 0xac, 0xbe, 0xcf, 0x34, 0x15, 0x97, 0x47, 0xeb, 0x2a, 0x48, 0x88, 0x14, - 0xab, 0x84, 0x9e, 0x23, 0xbf, 0xcf, 0xd7, 0x11, 0x99, 0xc5, 0x94, 0xd8, - 0x5f, 0xe8, 0x6c, 0x90, 0xb7, 0x11, 0xd6, 0xe0, 0x9b, 0x05, 0xfb, 0x14, - 0x48, 0xb4, 0x66, 0xf9, 0x0d, 0x21, 0x4b, 0xfe, 0x64, 0x32, 0x29, 0xa1, - 0x08, 0xc2, 0x1e, 0xc2, 0xd1, 0xda, 0xbf, 0x27, 0x22, 0xae, 0x46, 0xad, - 0xe8, 0xd0, 0x37, 0x9f, 0x5f, 0xef, 0xa7, 0xe7, 0xef, 0xae, 0x2c, 0xbf, - 0xdf, 0xcf, 0x9a, 0x50, 0x5e, 0x59, 0x53, 0xd3, 0xbc, 0x88, 0xd3, 0xb4, - 0x6f, 0x7c, 0x43, 0x13, 0xe5, 0x97, 0x8f, 0x3e, 0x59, 0x7c, 0x17, 0x70, - 0xaa, 0x2f, 0x45, 0xff, 0x8f, 0xdd, 0x27, 0x97, 0xef, 0xfa, 0xca, 0xd1, - 0xf6, 0xb0, 0xba, 0xfd, 0x9e, 0x28, 0xd9, 0x65, 0xff, 0x9c, 0xfc, 0x0d, - 0x3e, 0xfc, 0x1a, 0xcb, 0xcc, 0x3f, 0x2c, 0xbf, 0xe7, 0xf4, 0xa0, 0x5f, - 0x1e, 0xcb, 0x29, 0x87, 0xac, 0x43, 0x97, 0xec, 0x67, 0x5c, 0x6b, 0x2a, - 0x13, 0xd3, 0x19, 0x26, 0x42, 0x27, 0x44, 0x5d, 0x27, 0x12, 0x12, 0xad, - 0xe4, 0x37, 0xff, 0x60, 0xfb, 0x8c, 0x63, 0xcb, 0x09, 0x65, 0xe0, 0x47, - 0xeb, 0x2f, 0xb7, 0xe1, 0x4f, 0x19, 0xef, 0xe9, 0x0a, 0xff, 0x4f, 0xf6, - 0x4d, 0x27, 0x1a, 0xca, 0x33, 0xf2, 0xe9, 0xe5, 0x4f, 0x4d, 0x8f, 0x23, - 0x42, 0xa8, 0x75, 0x18, 0x3b, 0x42, 0xb6, 0x50, 0xd8, 0xca, 0x4c, 0xb8, - 0x63, 0x2c, 0x39, 0xcc, 0x59, 0xa5, 0x15, 0xea, 0x34, 0xb6, 0x47, 0x39, - 0xd8, 0xc8, 0x7f, 0x8e, 0x5c, 0xa5, 0x02, 0x71, 0xb4, 0x14, 0x9e, 0x06, - 0xa5, 0xb7, 0x5c, 0x0e, 0xac, 0xbf, 0xf8, 0x11, 0x31, 0x66, 0xf7, 0x63, - 0x0d, 0x65, 0xf6, 0x75, 0xfc, 0xb2, 0xff, 0x61, 0xeb, 0xff, 0xc1, 0xc5, - 0x96, 0x6c, 0x0a, 0x89, 0xb2, 0x45, 0xe1, 0x0d, 0xff, 0xef, 0x70, 0x11, - 0xcc, 0xf1, 0xb1, 0xe4, 0xb2, 0xf4, 0x7d, 0xb2, 0xca, 0x23, 0xe7, 0xf2, - 0x4d, 0xff, 0x7b, 0x99, 0xf4, 0xba, 0x01, 0x56, 0x5e, 0xe4, 0x4c, 0xb2, - 0x8c, 0xfe, 0x88, 0x87, 0x87, 0x97, 0x89, 0xfa, 0xb2, 0xf6, 0xf8, 0x92, - 0xcb, 0xfe, 0x23, 0x17, 0xdf, 0x04, 0xfa, 0xb2, 0xa0, 0xf6, 0x30, 0x7a, - 0xfe, 0x7d, 0x48, 0x80, 0xeb, 0x2e, 0x36, 0x2c, 0xa0, 0x1e, 0x13, 0x79, - 0x65, 0xe7, 0x70, 0xaa, 0x22, 0x35, 0xf0, 0xa1, 0x7d, 0x2c, 0xa0, 0x9e, - 0x59, 0x94, 0x5f, 0x9b, 0x3e, 0xe3, 0xfe, 0xb2, 0xf0, 0x44, 0x62, 0xcb, - 0xff, 0xfe, 0x89, 0xbd, 0x1c, 0xd4, 0x78, 0xc2, 0x63, 0x9c, 0x29, 0x3a, - 0xca, 0x84, 0x43, 0x10, 0xf5, 0xff, 0xc7, 0xce, 0xe0, 0xa2, 0xbc, 0xe1, - 0xfc, 0xb2, 0xb4, 0x99, 0xf3, 0x08, 0x7d, 0x0b, 0x3d, 0xe4, 0x37, 0xff, - 0xdd, 0x07, 0x39, 0x8c, 0x2c, 0xdf, 0x3a, 0x1b, 0xa5, 0x97, 0xfb, 0x6d, - 0x67, 0xbc, 0x7e, 0x59, 0x4b, 0x2f, 0xfe, 0xee, 0x78, 0xa2, 0x69, 0xc2, - 0x93, 0xac, 0xb8, 0x11, 0x31, 0xe8, 0xf8, 0x2e, 0xa1, 0x16, 0x7c, 0x84, - 0x2d, 0xe2, 0x8f, 0x96, 0x54, 0x8f, 0x0c, 0x64, 0xf7, 0xfd, 0x9a, 0xce, - 0x63, 0x96, 0xcb, 0x2f, 0x60, 0xd8, 0xb2, 0xff, 0xff, 0x75, 0xcf, 0xd1, - 0xd2, 0xcf, 0x74, 0xfb, 0x86, 0xd2, 0xcb, 0xff, 0xff, 0xde, 0xf1, 0xb3, - 0x47, 0x9f, 0x10, 0x3d, 0x1d, 0x9d, 0xbc, 0xfd, 0x34, 0x2c, 0xbf, 0xd8, - 0x64, 0x7a, 0xd6, 0x2c, 0xbf, 0xec, 0x72, 0xff, 0x40, 0x8f, 0xd6, 0x54, - 0x26, 0x87, 0x8b, 0xdf, 0x3e, 0x68, 0xc2, 0xff, 0xfc, 0xcd, 0xd3, 0x77, - 0x9b, 0xdd, 0xc9, 0x74, 0xf7, 0xac, 0xbf, 0xbe, 0x96, 0x81, 0x1f, 0xac, - 0xbf, 0x99, 0x9a, 0x94, 0x31, 0x65, 0x42, 0x2d, 0xf1, 0x69, 0xcc, 0x2e, - 0xd9, 0x89, 0x2e, 0x69, 0xa4, 0x97, 0xfe, 0x9e, 0x1e, 0x9c, 0xdd, 0x8d, - 0xa7, 0xfe, 0x6c, 0x5a, 0x18, 0xbe, 0xdf, 0x1e, 0x85, 0x97, 0xee, 0x67, - 0x4b, 0x16, 0x54, 0x91, 0x4c, 0x6b, 0xbe, 0x23, 0xbf, 0x3b, 0x33, 0xef, - 0x2c, 0xbd, 0xc7, 0xdd, 0x59, 0x58, 0x78, 0xe6, 0x51, 0x7f, 0xc0, 0x8e, - 0xe4, 0xd2, 0x7d, 0x96, 0x5f, 0xd3, 0xf8, 0x7a, 0x7f, 0xd6, 0x56, 0x1f, - 0x53, 0x9d, 0x5b, 0x75, 0x65, 0xf1, 0x7d, 0x34, 0x2c, 0xbf, 0xe8, 0xcf, - 0xa1, 0xe4, 0xf2, 0x59, 0x7f, 0x87, 0x9f, 0xce, 0x2c, 0xfd, 0x65, 0xf3, - 0x3d, 0xfb, 0xac, 0xa6, 0xed, 0x18, 0xf0, 0x28, 0x32, 0x3c, 0x37, 0x73, - 0x6b, 0xf1, 0x67, 0x5f, 0xcb, 0x2f, 0x4e, 0xe0, 0x56, 0x56, 0xe9, 0xe2, - 0xf4, 0x9a, 0xff, 0x1b, 0xff, 0xad, 0x03, 0xab, 0x2f, 0xe8, 0x17, 0x08, - 0xc5, 0x59, 0x7f, 0x67, 0x9b, 0xfd, 0x9d, 0x59, 0x58, 0x8b, 0x6e, 0x92, - 0x91, 0xa7, 0x0b, 0x6f, 0xff, 0xe0, 0xcf, 0xd3, 0x91, 0xfa, 0x7e, 0xa3, - 0xc4, 0xff, 0xac, 0xbf, 0xfb, 0xc5, 0x1f, 0xbf, 0xbf, 0x10, 0xa4, 0xb2, - 0x9b, 0x96, 0x6e, 0x6b, 0x66, 0x16, 0x51, 0x18, 0xde, 0xc5, 0xb2, 0x73, - 0x1b, 0x16, 0x47, 0x5c, 0x14, 0x5f, 0xa3, 0x4e, 0x32, 0x29, 0x8d, 0xf5, - 0x1a, 0xff, 0x61, 0xe8, 0xf1, 0x82, 0x7e, 0xec, 0x50, 0x8a, 0xe4, 0x39, - 0xfd, 0x1a, 0x3e, 0xf3, 0xb1, 0x17, 0xae, 0x6f, 0xea, 0xcb, 0xf6, 0x82, - 0xee, 0x15, 0x44, 0x5c, 0xbf, 0x7b, 0xf1, 0x0a, 0x49, 0x2f, 0xdc, 0xf7, - 0x63, 0xf5, 0x97, 0xe7, 0xda, 0x34, 0x05, 0x96, 0x9f, 0xb2, 0x32, 0x70, - 0x69, 0xcd, 0x00, 0x55, 0xb8, 0x53, 0x53, 0xd5, 0x38, 0xca, 0x50, 0xed, - 0xff, 0xcc, 0x79, 0x4f, 0xcd, 0x05, 0xdc, 0x2a, 0x89, 0x99, 0x7b, 0xa7, - 0xc5, 0x97, 0xcd, 0x8e, 0x47, 0x96, 0x5f, 0xd1, 0xc2, 0x8f, 0x71, 0x65, - 0x36, 0xa3, 0xd2, 0x61, 0x35, 0x37, 0x28, 0x96, 0x6d, 0x1b, 0xaf, 0xb0, - 0x1a, 0xd9, 0x65, 0xdb, 0x8d, 0xda, 0xca, 0x6c, 0x9e, 0x13, 0x6a, 0x23, - 0xbd, 0xf4, 0x71, 0x65, 0xff, 0xe6, 0xc7, 0xa5, 0x9d, 0xeb, 0xc8, 0xcc, - 0x96, 0x5e, 0x09, 0xb1, 0x65, 0xff, 0x37, 0x7f, 0xb0, 0x4d, 0x1e, 0xd0, - 0xb2, 0xf9, 0xb3, 0xe7, 0x25, 0x97, 0x6e, 0x37, 0x6b, 0x2e, 0xc0, 0x2c, - 0xbf, 0xfa, 0x18, 0xfe, 0xcf, 0xbf, 0x60, 0x9d, 0x59, 0x7f, 0xf8, 0x3a, - 0x06, 0xdf, 0x70, 0xf4, 0x1e, 0xe2, 0xcb, 0xe3, 0xde, 0xff, 0xac, 0xa8, - 0x3f, 0x1f, 0x26, 0xd7, 0x51, 0xb2, 0x50, 0xb8, 0xbe, 0x3d, 0x80, 0x4b, - 0x2f, 0xd9, 0xb6, 0x7f, 0x32, 0xca, 0x9c, 0x79, 0x9e, 0x22, 0xbf, 0xd3, - 0xb0, 0x9f, 0x5f, 0xee, 0x2c, 0xbf, 0xff, 0x31, 0xfb, 0x9f, 0x7f, 0xd6, - 0x9f, 0xb3, 0x74, 0x0b, 0x2f, 0xec, 0xe4, 0x08, 0x50, 0xb2, 0x86, 0x8b, - 0xec, 0x38, 0xea, 0xd5, 0xb1, 0x65, 0xce, 0xc5, 0x95, 0xc3, 0x4c, 0xde, - 0x21, 0x73, 0x7f, 0x96, 0x59, 0xb6, 0xb2, 0xdf, 0xc1, 0xaf, 0x00, 0xd5, - 0xff, 0xff, 0x14, 0x04, 0xa1, 0x93, 0xa3, 0x5a, 0x3d, 0xfa, 0x77, 0xfd, - 0x65, 0xfc, 0x6d, 0x1f, 0x30, 0x2b, 0x28, 0xd1, 0x2b, 0xc6, 0x8b, 0xe3, - 0xf4, 0x49, 0x65, 0x37, 0x6b, 0x81, 0x41, 0x1f, 0x38, 0x77, 0xcc, 0xe7, - 0xd8, 0x71, 0x3a, 0xaf, 0xea, 0x7e, 0x85, 0xe6, 0xf2, 0x2b, 0xf9, 0xa8, - 0x22, 0xcf, 0x2c, 0xbe, 0x7e, 0x9c, 0xcb, 0x2e, 0xfb, 0xcb, 0x2f, 0xbb, - 0x34, 0x0d, 0x65, 0x62, 0x22, 0x42, 0x59, 0x31, 0x13, 0x8c, 0x5f, 0xa1, - 0x85, 0x93, 0x2c, 0xbf, 0x8f, 0x08, 0x7d, 0x85, 0x96, 0x62, 0xca, 0x19, - 0xf1, 0x84, 0x9f, 0x74, 0xae, 0x96, 0x5f, 0xda, 0x82, 0x06, 0x75, 0x65, - 0xf6, 0xa3, 0x09, 0x65, 0xf3, 0xfa, 0x5f, 0xac, 0xbf, 0xee, 0x18, 0x5f, - 0x35, 0x9e, 0x59, 0x7f, 0x9f, 0x47, 0x1b, 0xa6, 0xc5, 0x94, 0x14, 0x6d, - 0x30, 0xb3, 0xa4, 0x1e, 0x23, 0xde, 0x6f, 0x7f, 0xfa, 0x77, 0x5c, 0xfd, - 0xf8, 0x08, 0x9e, 0x4b, 0x2f, 0xf8, 0x46, 0x67, 0x1d, 0xfe, 0x92, 0xcb, - 0xcd, 0xc5, 0xbb, 0x6c, 0x2c, 0xac, 0x54, 0x28, 0x13, 0x23, 0x87, 0x2b, - 0x13, 0x3f, 0x4b, 0x23, 0xab, 0xff, 0xff, 0xff, 0xff, 0xcd, 0xc5, 0xb1, - 0x8d, 0xc5, 0xb2, 0xda, 0x9b, 0x50, 0x5b, 0x70, 0xdc, 0x1b, 0x3a, 0xd9, - 0xbf, 0x00, 0x36, 0xd7, 0x1b, 0x9f, 0x09, 0xd6, 0xcc, 0x43, 0x67, 0x75, - 0xb4, 0xf4, 0xe9, 0xdd, 0xdc, 0x59, 0x7f, 0xfe, 0xff, 0xe9, 0x74, 0x11, - 0xa9, 0xfd, 0x30, 0xbe, 0x96, 0x5f, 0xfb, 0xb8, 0x58, 0x2e, 0x16, 0x0d, - 0x65, 0xff, 0xdf, 0x35, 0x1e, 0x19, 0xee, 0xf2, 0x18, 0xb2, 0xfb, 0x99, - 0xf7, 0x96, 0x5f, 0x19, 0x7b, 0x8b, 0x2f, 0xff, 0xf9, 0x87, 0xae, 0x83, - 0x92, 0x8d, 0xfa, 0x82, 0xf7, 0x72, 0x4b, 0x2a, 0x48, 0x89, 0x32, 0x1b, - 0xff, 0x1f, 0x8c, 0x26, 0x3f, 0x60, 0x56, 0x54, 0x93, 0x90, 0xc3, 0xcd, - 0x24, 0xfa, 0x15, 0x8d, 0xe4, 0x57, 0xfc, 0xe1, 0x2c, 0xef, 0x73, 0xf5, - 0x97, 0xde, 0xdc, 0xce, 0xac, 0xbf, 0xff, 0xce, 0x41, 0x2c, 0x1f, 0x41, - 0x3b, 0xb1, 0x2d, 0x46, 0xcb, 0x2b, 0x11, 0x0e, 0x02, 0x5b, 0xf8, 0x42, - 0x8e, 0xc4, 0x96, 0x5f, 0xff, 0xc2, 0x96, 0x7e, 0x0e, 0x4e, 0x91, 0xf6, - 0x02, 0x4e, 0xb2, 0x98, 0x88, 0xa7, 0x2d, 0xbe, 0x6a, 0x19, 0xe5, 0x97, - 0xfb, 0x1a, 0x8f, 0x13, 0xf1, 0x65, 0xe3, 0xe9, 0xac, 0xa8, 0x3f, 0x03, - 0x23, 0xf1, 0x95, 0xff, 0x3e, 0xa5, 0x3b, 0x02, 0x3c, 0x59, 0x4d, 0x95, - 0xdc, 0xb8, 0x8c, 0xaf, 0x23, 0xea, 0xd2, 0x97, 0x61, 0x7e, 0xf0, 0xac, - 0x28, 0x49, 0x00, 0xb6, 0x96, 0x5f, 0xff, 0x70, 0xf7, 0x30, 0x3d, 0x32, - 0x20, 0x6b, 0x65, 0x95, 0xa3, 0xdd, 0xf0, 0x5d, 0xfd, 0xec, 0x67, 0xd8, - 0xc5, 0x95, 0x87, 0xa0, 0x64, 0x57, 0xfd, 0x8c, 0x63, 0xcb, 0x87, 0x25, - 0x95, 0xd3, 0xd8, 0x22, 0x0b, 0xff, 0xec, 0xdf, 0x83, 0xec, 0x6f, 0x64, - 0x13, 0x88, 0xb2, 0xfe, 0x1b, 0xcb, 0x87, 0x25, 0x95, 0xa3, 0xff, 0x02, - 0x95, 0xf8, 0x20, 0x2f, 0x71, 0x65, 0xe9, 0x6e, 0x34, 0xb2, 0xfc, 0xed, - 0x16, 0x0d, 0x65, 0x41, 0xe4, 0x68, 0x86, 0xff, 0xc5, 0x01, 0x15, 0xf3, - 0x47, 0xfa, 0xcb, 0xfb, 0x98, 0x7a, 0xd3, 0xac, 0xad, 0x8f, 0xab, 0xf3, - 0xeb, 0xff, 0xe3, 0x2d, 0xb3, 0x86, 0xfd, 0x9e, 0xd3, 0x4d, 0x24, 0xbf, - 0xe0, 0x3e, 0xb7, 0x01, 0xd3, 0xd2, 0xca, 0x84, 0x5a, 0x0c, 0x93, 0xaa, - 0x97, 0xf7, 0xd9, 0xd0, 0x7d, 0xfa, 0xcb, 0xf7, 0x63, 0x6e, 0x81, 0x65, - 0x61, 0xed, 0x78, 0xc6, 0xff, 0x8b, 0x20, 0x57, 0xf3, 0x8a, 0xb2, 0xfd, - 0x2e, 0x7e, 0x09, 0x96, 0x5e, 0x08, 0x02, 0xb2, 0xbe, 0x3c, 0x80, 0x15, - 0xdf, 0xf6, 0xd9, 0xf8, 0xc0, 0xfa, 0x92, 0xcb, 0xf9, 0xdc, 0x7b, 0xf0, - 0x6b, 0x2f, 0x3b, 0x85, 0x51, 0x67, 0xaf, 0xef, 0xdc, 0xa4, 0x6c, 0x59, - 0x5b, 0x22, 0xf8, 0x67, 0x61, 0x2e, 0xfc, 0xa2, 0xff, 0x77, 0xdc, 0x7f, - 0x84, 0x62, 0xcb, 0xfd, 0x12, 0x3f, 0x47, 0xb8, 0xb2, 0xfb, 0xf1, 0x3b, - 0x0b, 0x2b, 0xa7, 0xac, 0x46, 0x55, 0x08, 0xad, 0x38, 0x46, 0x5f, 0xfe, - 0xd7, 0x5e, 0x76, 0x6f, 0x2c, 0xe6, 0x12, 0xcb, 0xfc, 0x63, 0xc6, 0x35, - 0x9d, 0x59, 0x7e, 0xe0, 0xce, 0x09, 0x65, 0x41, 0xec, 0xf8, 0xce, 0xff, - 0xee, 0x78, 0xe6, 0x69, 0xc7, 0x1f, 0x71, 0x65, 0x1a, 0x61, 0x8f, 0x0a, - 0x40, 0x10, 0xde, 0x69, 0xa6, 0x92, 0x5f, 0xf9, 0xe5, 0xc2, 0xc0, 0x8f, - 0x34, 0x92, 0x79, 0xa0, 0xbf, 0x37, 0x81, 0x98, 0x35, 0x97, 0xfb, 0xdd, - 0xcd, 0xf3, 0xa4, 0xc5, 0x95, 0x87, 0xc6, 0x02, 0xbb, 0xff, 0x7d, 0x22, - 0x07, 0xf3, 0x82, 0xcf, 0xd6, 0x5d, 0x02, 0xac, 0xbf, 0xe1, 0xc1, 0x47, - 0xf2, 0xe9, 0xac, 0xa8, 0x44, 0xa6, 0xc8, 0xa6, 0x2f, 0x7f, 0xba, 0x63, - 0x27, 0x79, 0x96, 0x5f, 0xe1, 0xf4, 0x0f, 0xfe, 0xe6, 0x2c, 0xa8, 0x3e, - 0x93, 0x32, 0xbf, 0xd1, 0x3b, 0xd9, 0xce, 0x42, 0xcb, 0xf8, 0x62, 0x0c, - 0x1e, 0xe2, 0xca, 0xd1, 0xf2, 0x11, 0xa5, 0xfd, 0x9c, 0x97, 0x44, 0xe2, - 0xca, 0x33, 0xd0, 0x22, 0x1b, 0xd0, 0x42, 0xac, 0xa9, 0x32, 0x7f, 0x47, - 0x0a, 0x0c, 0x22, 0x15, 0xc0, 0x31, 0x9f, 0xfd, 0x08, 0x93, 0x21, 0x9a, - 0x10, 0x1a, 0x87, 0x0b, 0x21, 0xd9, 0xd8, 0xcc, 0xbf, 0x54, 0x28, 0x59, - 0x72, 0x16, 0xbe, 0x84, 0xc6, 0xf8, 0x6a, 0x08, 0x41, 0x77, 0xfc, 0x59, - 0x7d, 0xa3, 0x8f, 0x2c, 0xbf, 0xb8, 0x59, 0x34, 0x31, 0x65, 0x81, 0xf9, - 0xe7, 0x78, 0x86, 0xe8, 0xf2, 0xcb, 0xef, 0xdd, 0xaf, 0x2c, 0xbf, 0xce, - 0xd7, 0x4e, 0x35, 0x0b, 0x2f, 0xc7, 0xbe, 0x0b, 0xcb, 0x28, 0x69, 0x91, - 0x8a, 0xcd, 0xf1, 0x49, 0x8b, 0x68, 0x93, 0x86, 0x57, 0xfe, 0xd1, 0xf2, - 0x42, 0x76, 0x0a, 0x16, 0x5f, 0x68, 0xe1, 0x8b, 0x2f, 0xff, 0xde, 0x14, - 0x11, 0x83, 0xee, 0x73, 0xe9, 0x47, 0x56, 0x56, 0x91, 0x6c, 0xc3, 0xe2, - 0x21, 0xb9, 0xe4, 0xb2, 0xff, 0xff, 0xfe, 0x27, 0x6b, 0xd9, 0xd2, 0xcf, - 0x03, 0xf6, 0x3c, 0x9c, 0x70, 0x4f, 0xa7, 0x92, 0xcb, 0xfd, 0x9d, 0xe8, - 0x3c, 0xe4, 0xb2, 0xe3, 0x1a, 0xcb, 0xfb, 0xa1, 0x7d, 0x3c, 0x96, 0x58, - 0x32, 0x3c, 0x3c, 0x16, 0xbc, 0x73, 0x71, 0x65, 0x41, 0xe2, 0x30, 0x9e, - 0xc6, 0x34, 0xdd, 0xa6, 0x16, 0xd4, 0x21, 0x99, 0x0b, 0x9b, 0xf1, 0xf5, - 0xd8, 0x6b, 0x2f, 0x39, 0x7e, 0xb2, 0xa7, 0x1e, 0x10, 0x49, 0xaf, 0x6f, - 0xc1, 0xac, 0xb6, 0xb6, 0x3c, 0x29, 0x89, 0x2f, 0x69, 0xfa, 0xb2, 0xff, - 0x37, 0xeb, 0x1b, 0xc8, 0x0d, 0x2c, 0xb6, 0x6c, 0x7a, 0xcd, 0x0e, 0x54, - 0x2b, 0x20, 0xec, 0x74, 0xaf, 0x0d, 0x22, 0x84, 0x05, 0xff, 0xff, 0xf7, - 0xfc, 0xcc, 0x21, 0x44, 0xd1, 0x46, 0x76, 0x7f, 0x0b, 0x36, 0x66, 0x31, - 0x65, 0xed, 0xb5, 0x8b, 0x2f, 0xa0, 0x84, 0x62, 0xca, 0xc3, 0x7e, 0x20, - 0xed, 0x62, 0x38, 0x3d, 0x0b, 0xfb, 0xbf, 0xe2, 0xcb, 0xe7, 0xec, 0x08, - 0xb2, 0xb0, 0xdd, 0x6f, 0x18, 0xbf, 0xfe, 0x07, 0xd2, 0xe0, 0xfb, 0x1a, - 0x1b, 0xbb, 0x4b, 0x2b, 0x11, 0xaa, 0x6c, 0x24, 0x45, 0x78, 0x98, 0x6b, - 0x2f, 0x78, 0x4c, 0x59, 0x74, 0x6c, 0xb2, 0x9c, 0xda, 0x70, 0x76, 0xf0, - 0xe2, 0x4b, 0x2f, 0xfa, 0x30, 0x3d, 0x3d, 0xef, 0xa5, 0x97, 0x67, 0x56, - 0x53, 0x9f, 0x59, 0x0e, 0x6e, 0x1c, 0xdd, 0x83, 0x59, 0x77, 0x9b, 0x6b, - 0x2a, 0x49, 0xb4, 0x61, 0x6f, 0x13, 0xfd, 0x08, 0xbd, 0xe6, 0x1b, 0x82, - 0xd7, 0xf6, 0x6b, 0xf6, 0x1f, 0x16, 0x5e, 0xe8, 0x1a, 0x59, 0x7e, 0xe7, - 0x8e, 0x3e, 0x59, 0x70, 0x02, 0xb2, 0xa4, 0x6f, 0xff, 0x28, 0xbd, 0xec, - 0x11, 0x65, 0xfc, 0xc0, 0x73, 0xd9, 0xe5, 0x97, 0xe7, 0xef, 0xd2, 0xe2, - 0xca, 0x83, 0xd7, 0x01, 0x75, 0xfd, 0x1f, 0x72, 0x76, 0xa1, 0x65, 0xe1, - 0x80, 0x2b, 0x2f, 0x86, 0x51, 0x25, 0x94, 0x66, 0xf9, 0xc7, 0x6f, 0xff, - 0x09, 0x3b, 0xef, 0x14, 0x64, 0xec, 0xfb, 0xcb, 0x2a, 0x15, 0x0f, 0x8c, - 0xbb, 0xe5, 0xd3, 0x22, 0x99, 0xd1, 0x84, 0x3d, 0x6e, 0x00, 0xfd, 0xfe, - 0x39, 0x9c, 0x8f, 0xee, 0x2c, 0xbb, 0x02, 0xb2, 0xff, 0x17, 0xb8, 0x51, - 0xee, 0x2c, 0xbf, 0xdd, 0x2c, 0x3f, 0xe3, 0xf5, 0x97, 0xe3, 0xdf, 0x85, - 0xc5, 0x95, 0x88, 0x8d, 0x33, 0x2d, 0x19, 0xdf, 0xdf, 0x7b, 0x3a, 0x0d, - 0xd5, 0x97, 0xf6, 0xb3, 0xbd, 0x07, 0x96, 0x5f, 0xba, 0x51, 0x9a, 0x51, - 0x7f, 0x66, 0xb6, 0x03, 0x8d, 0x51, 0x06, 0xa7, 0x9a, 0x6b, 0x6b, 0x64, - 0x50, 0xc9, 0x52, 0xf8, 0xbb, 0x9f, 0x2c, 0xa8, 0x4c, 0x7c, 0xe1, 0xa6, - 0xe5, 0x57, 0xe7, 0x09, 0xb2, 0x16, 0x5f, 0xd2, 0xe9, 0x3f, 0xde, 0x59, - 0x41, 0x3d, 0x42, 0x26, 0xbe, 0x10, 0x9f, 0x65, 0x95, 0x87, 0x89, 0xc2, - 0x1b, 0xf4, 0x7a, 0x73, 0x1a, 0x59, 0x79, 0x90, 0x15, 0x97, 0xc5, 0xf8, - 0x38, 0xb2, 0xc7, 0x86, 0xff, 0x43, 0x97, 0xfc, 0x3e, 0x73, 0x34, 0x3e, - 0xe2, 0xcb, 0xfd, 0x23, 0x64, 0x74, 0x41, 0xac, 0xbf, 0xfd, 0x18, 0x5f, - 0x7b, 0x34, 0x7b, 0x3b, 0x16, 0x5f, 0x35, 0xec, 0xef, 0x0f, 0xf7, 0xc6, - 0x95, 0x08, 0xf0, 0x78, 0x5b, 0x54, 0xe5, 0xcb, 0x46, 0xe4, 0xce, 0x21, - 0x47, 0x28, 0xd3, 0x72, 0x19, 0x7a, 0x21, 0xeb, 0x51, 0x46, 0x2b, 0x7b, - 0x99, 0x25, 0x97, 0x60, 0x8b, 0x2f, 0xbf, 0xec, 0x0d, 0x65, 0xfd, 0xd3, - 0x68, 0xa0, 0x6b, 0x2f, 0xfa, 0x3f, 0x64, 0x61, 0x7b, 0x8b, 0x2f, 0xfb, - 0x98, 0xd7, 0x5d, 0x87, 0xc5, 0x94, 0x68, 0xc1, 0x98, 0x8f, 0xa5, 0xbc, - 0x38, 0xbf, 0x1f, 0xd2, 0x32, 0x59, 0x78, 0xfb, 0x8b, 0x2f, 0xef, 0x3b, - 0x19, 0x0c, 0x59, 0x74, 0x33, 0x0f, 0xbc, 0x24, 0xff, 0x0d, 0xdf, 0x7d, - 0xc0, 0x12, 0xcb, 0xf6, 0x32, 0x34, 0x2a, 0xca, 0xd8, 0xf2, 0xda, 0x23, - 0xbe, 0x1f, 0x3b, 0x0b, 0x2f, 0xc5, 0xa6, 0x9f, 0x65, 0x95, 0x07, 0xdf, - 0x84, 0x8e, 0x45, 0x7e, 0xcf, 0x70, 0xd8, 0xb2, 0xe0, 0x12, 0xca, 0x85, - 0x5f, 0xb2, 0x1c, 0xc8, 0x6c, 0x1c, 0x2b, 0x35, 0x0f, 0x42, 0x2c, 0xe1, - 0x3d, 0xee, 0xe1, 0x2c, 0xbf, 0xd8, 0x59, 0xf7, 0xa4, 0xc5, 0x97, 0x7a, - 0x16, 0x54, 0x1e, 0x4b, 0x99, 0xdf, 0xd1, 0xb3, 0x1e, 0x68, 0x59, 0x6d, - 0x2c, 0xa9, 0x8d, 0xf8, 0x0b, 0xaf, 0xff, 0x9c, 0x5f, 0x46, 0xbf, 0xd4, - 0x78, 0x9f, 0xf5, 0x97, 0xf1, 0x67, 0xf8, 0x52, 0x59, 0x7f, 0xfc, 0x2c, - 0xe1, 0x09, 0xfd, 0xc3, 0xfb, 0xa6, 0xd2, 0xcb, 0x16, 0x22, 0x05, 0xcb, - 0x2b, 0x13, 0xdd, 0xd3, 0x23, 0xaf, 0x91, 0x10, 0x21, 0xa5, 0x77, 0x37, - 0xac, 0xb8, 0xfc, 0xb2, 0xf8, 0xc9, 0xc6, 0xb2, 0xff, 0xcc, 0xcf, 0x70, - 0x4e, 0x3c, 0xb1, 0x65, 0xfb, 0x91, 0xaf, 0x42, 0xc9, 0xe6, 0xfe, 0x86, - 0x89, 0x8e, 0x2f, 0xde, 0xc3, 0x15, 0x65, 0xf4, 0xce, 0xfa, 0x59, 0x44, - 0x6f, 0x84, 0x1c, 0xbe, 0xee, 0x1e, 0xf5, 0x97, 0xf7, 0x0f, 0x58, 0x0d, - 0x2c, 0xbf, 0xff, 0xa6, 0x9c, 0x61, 0x06, 0xb8, 0x09, 0xcc, 0x3f, 0x74, - 0xd6, 0x5d, 0x02, 0xac, 0xa8, 0x3f, 0x83, 0x61, 0xac, 0x54, 0x62, 0x28, - 0xc9, 0xc2, 0xb9, 0x8c, 0x3d, 0x21, 0xf1, 0x1b, 0x7c, 0x29, 0x6e, 0x63, - 0x61, 0x51, 0x7e, 0x2f, 0xd8, 0x47, 0xf4, 0x96, 0x5e, 0xd6, 0x62, 0xca, - 0x33, 0xc2, 0xe1, 0x3d, 0xff, 0xd2, 0xf0, 0x25, 0x26, 0x7b, 0xd0, 0xc5, - 0x97, 0xfb, 0xdc, 0x8d, 0xb3, 0x83, 0x59, 0x77, 0x71, 0x65, 0xff, 0xf7, - 0x60, 0x78, 0x19, 0xd8, 0x58, 0x3e, 0xc2, 0xcb, 0xfe, 0xd4, 0x74, 0xf7, - 0xea, 0x24, 0xb2, 0xff, 0xe3, 0xc2, 0xcc, 0xe4, 0xe9, 0x71, 0x8b, 0x2f, - 0xfc, 0xf1, 0xf4, 0xa7, 0x73, 0xe1, 0xc2, 0xca, 0x1a, 0x78, 0x1f, 0x10, - 0x9a, 0x36, 0xe9, 0xa4, 0xc2, 0xda, 0x4f, 0xe1, 0xd7, 0x91, 0x2f, 0x0b, - 0x1a, 0x59, 0x7f, 0x0e, 0x3f, 0xd6, 0x7c, 0xb2, 0xa7, 0x9e, 0x63, 0x07, - 0x6e, 0x0e, 0xcb, 0x2f, 0xf4, 0x33, 0x0f, 0x53, 0x49, 0x65, 0xc7, 0x32, - 0xcb, 0xfd, 0xa8, 0x14, 0x65, 0x1f, 0x2c, 0xbe, 0x82, 0xc1, 0x56, 0x5f, - 0xfc, 0x01, 0xe6, 0xa2, 0x46, 0x38, 0x25, 0x97, 0xfc, 0x4f, 0xb4, 0x6b, - 0x4f, 0x25, 0x97, 0x7a, 0x24, 0x7f, 0x5d, 0x42, 0xbd, 0xe3, 0xd9, 0x65, - 0xfb, 0xf7, 0xfa, 0x26, 0x59, 0x78, 0xa0, 0x2b, 0x2f, 0xfe, 0x19, 0xcd, - 0xd8, 0xd7, 0xd2, 0x8d, 0x2c, 0xbf, 0xfc, 0x64, 0xff, 0x73, 0x99, 0xa1, - 0xf7, 0x16, 0x54, 0xe5, 0x40, 0x92, 0x17, 0x09, 0xa1, 0xc2, 0x6d, 0x85, - 0xae, 0x3a, 0x45, 0x5c, 0x1b, 0x6f, 0x46, 0xb4, 0x2c, 0xbd, 0xd3, 0xf2, - 0xcb, 0x6f, 0xc3, 0x58, 0x20, 0x85, 0xfe, 0x17, 0x35, 0xb0, 0x1c, 0x6b, - 0x2a, 0x17, 0xb8, 0x86, 0xe5, 0x92, 0x8a, 0x8e, 0x18, 0x4c, 0x24, 0xe8, - 0xc3, 0xca, 0x37, 0xfe, 0x16, 0x60, 0x29, 0xbc, 0xc7, 0x11, 0x65, 0xff, - 0x61, 0x48, 0xb1, 0x90, 0x15, 0x97, 0xee, 0x9e, 0xfc, 0x1a, 0xcb, 0xff, - 0x0e, 0x0b, 0x08, 0x12, 0xce, 0x2c, 0xbf, 0x3b, 0x0d, 0xbf, 0x16, 0x5f, - 0xd9, 0xd7, 0xf3, 0xcc, 0xb2, 0xe8, 0xf9, 0x65, 0x7c, 0x78, 0x9e, 0x2d, - 0xac, 0x44, 0x83, 0xb6, 0xdf, 0xf6, 0x00, 0xb3, 0xc4, 0xec, 0x59, 0x71, - 0xcc, 0xb2, 0xec, 0x15, 0x65, 0x41, 0xae, 0xe8, 0xbd, 0xda, 0xc5, 0x97, - 0x89, 0xbb, 0x6f, 0x59, 0x7c, 0x7a, 0x89, 0x2c, 0xbe, 0xd9, 0x91, 0xc5, - 0x95, 0xb1, 0xe2, 0x61, 0x0d, 0xff, 0xdd, 0x8f, 0x38, 0x3c, 0xff, 0x67, - 0x96, 0x5f, 0x82, 0xf0, 0x7b, 0x8b, 0x2f, 0x16, 0x71, 0x65, 0xff, 0xff, - 0xa3, 0xa6, 0xc9, 0xf3, 0x49, 0xf4, 0x27, 0x4f, 0xee, 0x04, 0xf6, 0x59, - 0x5b, 0x2b, 0x87, 0x18, 0xe8, 0xa6, 0xc6, 0x53, 0x34, 0x33, 0x34, 0x43, - 0xd6, 0x4f, 0xc8, 0x08, 0x5b, 0x8d, 0x1e, 0x22, 0x02, 0x20, 0x85, 0x2d, - 0xe3, 0x77, 0x8f, 0xbc, 0x59, 0x7d, 0x39, 0xe4, 0xdd, 0x2c, 0xbf, 0xfb, - 0x37, 0xe0, 0xf0, 0x81, 0x2c, 0xe2, 0xcb, 0xf6, 0xa3, 0xa2, 0x0d, 0x65, - 0x68, 0xfb, 0x5d, 0x12, 0xfa, 0x0f, 0x68, 0x59, 0x7c, 0xd3, 0xe7, 0x16, - 0x5f, 0xc3, 0x8f, 0xcb, 0x3e, 0x59, 0x7f, 0xd2, 0x63, 0xcb, 0xdc, 0x81, - 0x56, 0x54, 0x22, 0x2b, 0x08, 0x9c, 0xba, 0xf7, 0x0c, 0x96, 0x5f, 0x88, - 0x33, 0xb9, 0xf2, 0xcb, 0xfc, 0x24, 0xa3, 0x79, 0x97, 0xeb, 0x2b, 0x0f, - 0xf1, 0xc6, 0xc8, 0xae, 0xb1, 0x52, 0x9e, 0xe8, 0xe3, 0xc2, 0x5b, 0xf2, - 0x12, 0x85, 0x58, 0x21, 0x53, 0x76, 0xd2, 0x59, 0x78, 0xfa, 0x6b, 0x2b, - 0xe3, 0x67, 0xe1, 0x8b, 0xec, 0xfa, 0x50, 0xb2, 0xf0, 0x1f, 0x8b, 0x2b, - 0xa6, 0xf8, 0x42, 0x2b, 0xfe, 0x31, 0x60, 0x71, 0xbf, 0x3a, 0xb2, 0xff, - 0xba, 0x6d, 0x7d, 0x2e, 0x60, 0x56, 0x5f, 0xc0, 0xe4, 0x4c, 0x0d, 0x2c, - 0xbc, 0x0c, 0xf9, 0x65, 0x74, 0xf3, 0x3c, 0x5f, 0x7f, 0x63, 0x35, 0xa8, - 0x1a, 0xcb, 0xfd, 0x20, 0x16, 0xdc, 0x3f, 0x96, 0x5f, 0x7f, 0xfe, 0x7c, - 0xb2, 0xff, 0xfd, 0x1a, 0xff, 0x38, 0x40, 0x79, 0x74, 0x0f, 0xb2, 0xcb, - 0xf7, 0xb1, 0xc8, 0x2b, 0x2b, 0xa7, 0xf8, 0xde, 0xad, 0x7f, 0xf8, 0x7d, - 0x8f, 0xa4, 0x58, 0xcc, 0xfb, 0xcb, 0x2f, 0xcc, 0xce, 0xe1, 0x2c, 0xa3, - 0x3f, 0x17, 0x4b, 0xbf, 0xe0, 0x3c, 0x87, 0x99, 0xff, 0x16, 0x5f, 0x99, - 0x9a, 0x72, 0x59, 0x7f, 0xef, 0xa5, 0xd8, 0x63, 0xfd, 0x2c, 0x59, 0x7f, - 0x1f, 0xdf, 0x4b, 0x3c, 0xb2, 0xa1, 0x12, 0xb8, 0x4d, 0xfa, 0x05, 0x75, - 0x1f, 0xbc, 0x86, 0x75, 0xfb, 0xee, 0x30, 0xf7, 0x56, 0x5f, 0xfd, 0xd7, - 0x3f, 0x7e, 0x02, 0x27, 0x92, 0xcb, 0xe8, 0x20, 0x36, 0xd6, 0x5d, 0x9c, - 0x9c, 0x7d, 0x1d, 0x43, 0xa8, 0x46, 0x19, 0x42, 0x52, 0xfe, 0x7d, 0xbf, - 0x72, 0x1a, 0xca, 0xd9, 0x73, 0x60, 0x67, 0x41, 0x84, 0x39, 0x91, 0x4c, - 0x5b, 0xa3, 0x5e, 0xc2, 0x87, 0x90, 0x96, 0xf4, 0x63, 0xbb, 0xe1, 0xd7, - 0xb8, 0x4d, 0x7f, 0x47, 0xf9, 0x31, 0xb1, 0x65, 0xef, 0x61, 0x2c, 0xbd, - 0xd7, 0xdd, 0x59, 0x7f, 0x84, 0x80, 0xee, 0x66, 0xa1, 0x65, 0xff, 0x0f, - 0x01, 0xad, 0x82, 0x7b, 0x2c, 0xbf, 0xa3, 0xa7, 0xa8, 0x62, 0xca, 0x92, - 0x35, 0xc5, 0x1b, 0xe8, 0xfb, 0x9b, 0x78, 0xee, 0xa1, 0x7c, 0x13, 0x27, - 0x3e, 0x8e, 0x17, 0x6f, 0x18, 0x2d, 0xd3, 0x01, 0x65, 0x98, 0xb2, 0xbe, - 0x35, 0x2d, 0xb1, 0x8b, 0xfd, 0xef, 0xc0, 0x5c, 0x31, 0xac, 0xbf, 0x4b, - 0xfc, 0xc1, 0xac, 0xbe, 0x8d, 0x66, 0xf3, 0x3d, 0xc7, 0x34, 0xbf, 0xfd, - 0x31, 0x47, 0xb9, 0xef, 0x82, 0x65, 0xb2, 0xcb, 0xf1, 0xb0, 0x49, 0xb8, - 0xb2, 0xfe, 0x7f, 0xa4, 0x50, 0x35, 0x97, 0xfd, 0x1f, 0x48, 0xc9, 0x8f, - 0xe5, 0x94, 0x68, 0xdb, 0xea, 0x63, 0x95, 0x11, 0x6d, 0xf9, 0xe5, 0x9b, - 0x42, 0xcb, 0xff, 0xa3, 0x9c, 0xc6, 0x78, 0xa1, 0x9c, 0x59, 0x7f, 0xf4, - 0x7d, 0x2f, 0x02, 0x36, 0x3f, 0xbc, 0xb2, 0xff, 0x1f, 0x5c, 0x30, 0x43, - 0x59, 0x44, 0x7f, 0x1c, 0x47, 0xbf, 0xa0, 0x3f, 0xb0, 0x1f, 0xac, 0xbf, - 0x66, 0xf3, 0x21, 0xac, 0xbf, 0xc3, 0xe1, 0xf7, 0xb8, 0x35, 0x97, 0xff, - 0x1c, 0x70, 0x9e, 0x53, 0xb9, 0x9a, 0x59, 0x78, 0x9f, 0x4b, 0x2f, 0x9d, - 0xdd, 0xbd, 0x65, 0xff, 0xe3, 0xe6, 0xd8, 0xd6, 0x10, 0x1b, 0xe2, 0x7e, - 0x1b, 0xe6, 0x0d, 0xdf, 0xef, 0xa5, 0xc9, 0xa5, 0x1b, 0x2c, 0xa1, 0xaa, - 0xab, 0x09, 0x3e, 0xa1, 0x76, 0xc2, 0x1e, 0x98, 0x39, 0x41, 0x19, 0xfa, - 0x10, 0x40, 0x64, 0xbf, 0xff, 0xbd, 0x9f, 0x7b, 0x5a, 0x8f, 0x7e, 0x21, - 0x4b, 0xb8, 0xb2, 0xe3, 0xde, 0xb2, 0xee, 0x9f, 0xc7, 0xed, 0x32, 0xf5, - 0xfb, 0xb1, 0xbc, 0x70, 0xb2, 0xf0, 0xdc, 0x96, 0x5b, 0x7a, 0xcb, 0xf7, - 0xde, 0x28, 0xea, 0xcb, 0x6a, 0x0d, 0xdb, 0x89, 0xdc, 0x0d, 0x2c, 0xa9, - 0x22, 0xec, 0x65, 0x3a, 0x56, 0xe1, 0x2d, 0xff, 0xa5, 0x05, 0xed, 0x1e, - 0xfc, 0x1a, 0xcb, 0xff, 0x3f, 0xb8, 0x09, 0x08, 0x33, 0xf2, 0xcb, 0xd8, - 0x7c, 0x59, 0x7e, 0xf7, 0xb0, 0x1b, 0x2c, 0xbf, 0xfe, 0xd9, 0xfb, 0x83, - 0x9d, 0x84, 0x58, 0x7f, 0xac, 0xad, 0x91, 0x28, 0x11, 0xbd, 0x14, 0xdf, - 0xf7, 0x42, 0x6f, 0x3b, 0x8f, 0xd5, 0x95, 0x87, 0xd6, 0xe6, 0x37, 0xe7, - 0x2f, 0xa4, 0x6b, 0x2f, 0x02, 0x09, 0x65, 0x74, 0xf0, 0x88, 0x9e, 0xff, - 0xfd, 0xc2, 0x9d, 0xd7, 0x3f, 0x7e, 0x02, 0x27, 0x92, 0xcb, 0xfd, 0xd3, - 0x17, 0x70, 0x1a, 0x15, 0x65, 0xff, 0x43, 0x4c, 0xec, 0x19, 0x6c, 0xb2, - 0xff, 0xf8, 0xb3, 0x98, 0xc8, 0x0e, 0x78, 0xf5, 0x8b, 0x28, 0x28, 0xbe, - 0xf1, 0xce, 0xf3, 0x9b, 0xff, 0x4d, 0xcf, 0x03, 0xec, 0x1b, 0x92, 0xca, - 0xc3, 0xf2, 0x73, 0x2b, 0xfb, 0x6c, 0xd1, 0x86, 0x16, 0x5f, 0x10, 0xe1, - 0x8b, 0x2f, 0xff, 0x80, 0x5e, 0xe7, 0x4e, 0x62, 0x86, 0x3c, 0x96, 0x5f, - 0x61, 0x01, 0xd6, 0x53, 0x0f, 0xbf, 0x7a, 0x7d, 0xfc, 0xff, 0xe0, 0xde, - 0x4b, 0x2a, 0x11, 0xc3, 0x90, 0x90, 0x32, 0x4a, 0x34, 0xd0, 0x3b, 0x18, - 0x75, 0x43, 0x2e, 0xbf, 0x68, 0x41, 0x0e, 0x31, 0x3c, 0x95, 0xca, 0x18, - 0x7f, 0x1c, 0x3a, 0xa6, 0x3d, 0x61, 0xff, 0x63, 0x3f, 0x76, 0x2f, 0xc8, - 0x4a, 0x38, 0x6f, 0x46, 0xc1, 0x7f, 0xf6, 0x17, 0xf9, 0x9a, 0xe7, 0xa3, - 0x16, 0x5f, 0xf7, 0xde, 0xcd, 0x1e, 0xce, 0xc5, 0x97, 0xb3, 0x7e, 0x2c, - 0xb6, 0x7e, 0x89, 0x92, 0x42, 0xe1, 0xd5, 0xe6, 0xdc, 0x8d, 0x65, 0xf4, - 0x13, 0xc9, 0x65, 0xfb, 0x37, 0x5c, 0xbf, 0x9c, 0x78, 0x1a, 0x20, 0xbf, - 0xb7, 0xf4, 0xe3, 0x5c, 0x59, 0x7f, 0xfe, 0x97, 0x0b, 0x3d, 0xc3, 0xc6, - 0x7b, 0x58, 0xd2, 0xcb, 0xff, 0x74, 0xd8, 0x3c, 0x9a, 0x33, 0x4b, 0x2f, - 0x4a, 0x3e, 0x59, 0x7d, 0x1f, 0xbb, 0x16, 0x5a, 0x58, 0x7f, 0xb3, 0x1f, - 0x10, 0xed, 0x7c, 0x98, 0x31, 0x43, 0x4a, 0xfb, 0x87, 0xe8, 0x59, 0x50, - 0x79, 0x4e, 0x53, 0x7f, 0xf0, 0x4f, 0x53, 0x89, 0xf6, 0x28, 0xf9, 0x65, - 0xf0, 0x7a, 0x73, 0x2c, 0xbf, 0xff, 0x16, 0x0a, 0x29, 0x8f, 0xa7, 0x37, - 0x4f, 0xef, 0x2c, 0xa8, 0x3f, 0xbc, 0x23, 0xb8, 0x1a, 0x59, 0x78, 0x2f, - 0xa5, 0x97, 0xfe, 0xdb, 0x09, 0x99, 0xee, 0x09, 0xc5, 0x97, 0xee, 0x06, - 0x34, 0x2a, 0xcb, 0xf8, 0xff, 0xfa, 0x59, 0xe5, 0x95, 0xb2, 0x32, 0xfa, - 0x2e, 0xe3, 0x9f, 0xa0, 0x6f, 0x29, 0xbe, 0xf7, 0x40, 0x15, 0x97, 0xec, - 0x31, 0xf4, 0xd6, 0x56, 0xc7, 0x93, 0x22, 0x3b, 0xcf, 0xa1, 0x56, 0x56, - 0x1e, 0x03, 0x91, 0xdf, 0xfd, 0x9f, 0x7b, 0x86, 0x51, 0xfb, 0xb1, 0x65, - 0xe9, 0x33, 0xab, 0x2b, 0x63, 0xe1, 0xf2, 0x25, 0xff, 0xff, 0xb7, 0x33, - 0xdd, 0x71, 0xcf, 0x2c, 0xde, 0x59, 0xce, 0x1f, 0xde, 0x59, 0x7f, 0x7d, - 0xcc, 0x64, 0x6e, 0xac, 0xbc, 0x29, 0xb4, 0xb2, 0xfc, 0xd1, 0xe1, 0x0a, - 0xb2, 0x8c, 0xf1, 0x80, 0x3d, 0x58, 0x99, 0x69, 0x91, 0xbb, 0x91, 0x3b, - 0xdf, 0xce, 0x1e, 0xbb, 0x7f, 0x16, 0x5d, 0x3b, 0x16, 0x5f, 0x70, 0xa1, - 0x8b, 0x2a, 0x0d, 0xcf, 0xc3, 0x17, 0xbb, 0x26, 0x2c, 0xbb, 0xa6, 0xb2, - 0xb0, 0xd9, 0xf8, 0x76, 0xa1, 0x7e, 0x7a, 0x4e, 0xb8, 0x86, 0x2c, 0x6f, - 0xff, 0x10, 0x76, 0x18, 0x2f, 0x0e, 0xb2, 0x86, 0xb7, 0x23, 0xae, 0xf1, - 0xd0, 0x1a, 0x77, 0x15, 0x2f, 0xf4, 0x4c, 0x7f, 0x70, 0x0c, 0x59, 0x73, - 0x02, 0xb2, 0xb6, 0x3c, 0xc1, 0x9a, 0xdf, 0xc3, 0x10, 0x65, 0x9d, 0x59, - 0x7e, 0xce, 0x03, 0x5b, 0x2c, 0xac, 0x3d, 0x72, 0x2e, 0xbf, 0x82, 0x33, - 0xdf, 0x03, 0x59, 0x6e, 0xac, 0xb7, 0xeb, 0x2e, 0xe4, 0x96, 0x53, 0x9f, - 0x4f, 0xe5, 0xfc, 0x11, 0x00, 0x95, 0xfd, 0xb4, 0xd2, 0x6c, 0xeb, 0x65, - 0x97, 0x9f, 0x34, 0xb2, 0xf1, 0x67, 0x96, 0x57, 0x4d, 0xb1, 0x0d, 0xdd, - 0xe2, 0x59, 0x7a, 0x3e, 0xe2, 0xcb, 0xe3, 0x29, 0x62, 0xcb, 0xdb, 0x39, - 0x2c, 0xa1, 0x9e, 0xcb, 0x07, 0x7c, 0x41, 0x7d, 0x03, 0x79, 0x2c, 0xbf, - 0x67, 0xba, 0x7e, 0x59, 0x7e, 0x7f, 0xb3, 0xef, 0x2c, 0xae, 0x9e, 0x87, - 0x89, 0xeb, 0x64, 0x49, 0x8a, 0xe3, 0x6d, 0x96, 0x5b, 0x4b, 0x2b, 0x63, - 0x46, 0x62, 0x57, 0xf6, 0xd3, 0xb6, 0x77, 0xea, 0xcb, 0xbe, 0xf2, 0xcb, - 0xff, 0xfd, 0xd3, 0xd6, 0x31, 0xfe, 0x9e, 0x30, 0x3e, 0xa4, 0xff, 0xac, - 0xa6, 0xed, 0x56, 0x9c, 0x36, 0x48, 0x83, 0x1b, 0xce, 0x18, 0x5d, 0x48, - 0x72, 0x12, 0x31, 0x00, 0xc5, 0xff, 0x60, 0xc6, 0x7f, 0x67, 0xde, 0x59, - 0x7c, 0x12, 0x89, 0x2c, 0xae, 0x9e, 0xdb, 0x9d, 0x5f, 0xe8, 0xcf, 0x47, - 0x5c, 0x6b, 0x2b, 0x63, 0xd2, 0x19, 0x0d, 0xf6, 0x61, 0x79, 0x65, 0xff, - 0xed, 0xe6, 0x5f, 0xf4, 0xde, 0x5e, 0x3d, 0x96, 0x5f, 0x01, 0xf5, 0x25, - 0x95, 0x07, 0xdc, 0x34, 0xcb, 0xff, 0x87, 0x03, 0xd4, 0x78, 0xc2, 0x63, - 0x59, 0x7d, 0x34, 0x37, 0xc9, 0x65, 0xfd, 0xe0, 0x8c, 0x6c, 0xd2, 0xcb, - 0xfe, 0x9b, 0x9b, 0xdc, 0xb6, 0x00, 0xd6, 0x5f, 0xce, 0xd7, 0xff, 0xb3, - 0x71, 0x65, 0xf6, 0x7b, 0x18, 0xb2, 0xe2, 0x15, 0x65, 0x39, 0xb8, 0x01, - 0x0d, 0x49, 0x11, 0x9c, 0x6c, 0xbf, 0xba, 0x0d, 0xa6, 0xe9, 0xac, 0xbf, - 0xf0, 0x37, 0x7a, 0x73, 0x85, 0xd6, 0x71, 0x65, 0xff, 0x89, 0xc5, 0xeb, - 0xcb, 0x86, 0x35, 0x97, 0xee, 0x99, 0x3e, 0xcb, 0x2c, 0x15, 0x97, 0xc0, - 0x96, 0x70, 0x26, 0xe0, 0x89, 0xe9, 0x88, 0xad, 0x27, 0x6b, 0xc5, 0x9e, - 0x59, 0x70, 0x8c, 0x59, 0x46, 0x7a, 0xa4, 0x45, 0xe1, 0xbb, 0xbe, 0x1a, - 0xca, 0x85, 0xc1, 0x2d, 0x88, 0xe5, 0x08, 0xe1, 0x90, 0xe2, 0x18, 0xa4, - 0xc6, 0x5f, 0x34, 0x32, 0x7a, 0x46, 0x46, 0x1e, 0x8d, 0x1c, 0x05, 0xb7, - 0xf4, 0xe9, 0xa3, 0xc5, 0xbd, 0x65, 0xff, 0xd1, 0xbf, 0x51, 0xac, 0x3e, - 0xc0, 0xd6, 0x5d, 0x18, 0xb2, 0x88, 0xf6, 0x78, 0x89, 0x73, 0xb1, 0x65, - 0xd3, 0x6e, 0x2c, 0xa2, 0x36, 0x3b, 0xc5, 0xaa, 0x48, 0xff, 0xc8, 0x45, - 0x9a, 0x95, 0xa7, 0xb7, 0x6f, 0xd9, 0x50, 0xd8, 0x6f, 0x6e, 0x4b, 0x1b, - 0x23, 0xad, 0xa9, 0x31, 0xb8, 0x8e, 0x36, 0xb4, 0x18, 0x9c, 0x2f, 0xda, - 0x32, 0x09, 0x4a, 0xb3, 0x1c, 0xf1, 0x3e, 0x52, 0xe4, 0x45, 0x94, 0x94, - 0x19, 0xc2, 0xff, 0xa5, 0xb4, 0x9c, 0xa8, 0x09, 0xa7, 0x49, 0xf5, 0x2e, - 0x2d, 0x92, 0x93, 0xbb, 0x49, 0x60, 0x79, 0xc1, 0xdf, 0xe5, 0x8f, 0xb6, - 0xe1, 0x38, 0x53, 0xec, 0x9c, 0xa6, 0x13, 0xfa, 0x92, 0x32, 0x08, 0xc4, - 0x37, 0xbd, 0x35, 0x08, 0x9d, 0xc9, 0x61, 0xe2, 0x4e, 0xa2, 0x37, 0xc7, - 0x6d, 0x53, 0xdf, 0xc0, 0xab, 0xb7, 0xdb, 0x21, 0x7f, 0xfa, 0x7b, 0x1e, - 0x53, 0xf3, 0x41, 0x77, 0x0a, 0xa2, 0x6c, 0x5f, 0xb4, 0x17, 0x70, 0xaa, - 0x2a, 0xd5, 0xdc, 0xdc, 0x59, 0x69, 0xf8, 0x79, 0xdc, 0x34, 0xbb, 0x7e, - 0x96, 0x5f, 0xe9, 0x48, 0x1e, 0x28, 0x92, 0xcb, 0xec, 0xeb, 0xf9, 0x65, - 0x9b, 0x18, 0x7a, 0x84, 0x67, 0x7f, 0xff, 0xe9, 0x46, 0xf8, 0x3d, 0x04, - 0xd8, 0xf2, 0x32, 0xc1, 0xe0, 0xab, 0x2f, 0xff, 0x68, 0xe5, 0x92, 0xc7, - 0x91, 0x43, 0x16, 0x5f, 0xed, 0x60, 0x63, 0xf1, 0x18, 0xb2, 0xff, 0x76, - 0x36, 0xd4, 0x60, 0xd6, 0x5f, 0xff, 0xa3, 0x68, 0xd4, 0x32, 0x23, 0xdd, - 0x3f, 0xd8, 0xb2, 0xa1, 0x11, 0x1d, 0x33, 0xbd, 0x03, 0x99, 0x65, 0x49, - 0x3a, 0xe3, 0x6b, 0xd2, 0x3f, 0x61, 0x7b, 0xe2, 0x2b, 0xed, 0x33, 0xa3, - 0x59, 0x7f, 0xf6, 0xa4, 0x59, 0xee, 0x43, 0x3c, 0x15, 0x95, 0x07, 0xce, - 0x02, 0x3b, 0xc3, 0xc2, 0x59, 0x7f, 0x72, 0x46, 0x17, 0xd2, 0xcb, 0xce, - 0xe1, 0x54, 0x56, 0x8b, 0xf0, 0xbf, 0x70, 0x1f, 0x2c, 0xa8, 0x44, 0x08, - 0x4b, 0x4c, 0xa2, 0xff, 0xf1, 0xfa, 0x50, 0x1e, 0x9f, 0xb8, 0xff, 0x2c, - 0xad, 0x1f, 0xc6, 0xf2, 0xeb, 0xfb, 0xf9, 0xd9, 0xa3, 0x15, 0x65, 0xff, - 0x60, 0xcf, 0x93, 0x14, 0x0d, 0x65, 0x0c, 0xfa, 0x5c, 0xc6, 0xff, 0xf7, - 0x4d, 0x90, 0x1c, 0x66, 0x17, 0xb7, 0x16, 0x5e, 0x97, 0xd2, 0x59, 0x78, - 0x1c, 0xf2, 0xcb, 0xff, 0xf9, 0xcd, 0xbe, 0x08, 0x12, 0x3e, 0x72, 0x27, - 0x30, 0x2b, 0x2f, 0xff, 0x83, 0x1a, 0xcf, 0xdd, 0x8f, 0x28, 0x30, 0xac, - 0xbf, 0xfe, 0x97, 0x30, 0xa1, 0x8f, 0x9e, 0xf4, 0x31, 0x65, 0xbd, 0x08, - 0x9b, 0x74, 0xea, 0x62, 0x67, 0xbd, 0x1d, 0xf4, 0x3e, 0x6f, 0xff, 0xfe, - 0xde, 0x7e, 0xe6, 0x0a, 0x1e, 0x9f, 0xb2, 0x62, 0x86, 0x6d, 0x8d, 0x2c, - 0xbf, 0xff, 0x3f, 0x9f, 0x38, 0x3c, 0x97, 0x63, 0x78, 0xe1, 0x65, 0x42, - 0x32, 0xdd, 0xda, 0xff, 0x47, 0x9f, 0xb3, 0x87, 0x0b, 0x2f, 0xa5, 0xe3, - 0xd9, 0x65, 0xf8, 0x4f, 0x14, 0x7e, 0xb2, 0xdd, 0x59, 0x5f, 0x1e, 0xee, - 0xf2, 0x31, 0x0a, 0x6f, 0xfc, 0x7c, 0xc1, 0xfd, 0xc8, 0xd7, 0x16, 0x5f, - 0xe7, 0x97, 0x8f, 0x6e, 0x9a, 0xca, 0x84, 0x52, 0x84, 0xcc, 0xcf, 0xef, - 0xd9, 0xd3, 0xc6, 0x2c, 0xbf, 0x1f, 0xec, 0x3d, 0x2c, 0xbf, 0xf8, 0x9c, - 0xc3, 0xd7, 0x06, 0xda, 0x35, 0x97, 0xfe, 0xc7, 0xda, 0x30, 0x87, 0xd8, - 0x59, 0x5b, 0x23, 0x34, 0x64, 0xdd, 0x28, 0x24, 0x3b, 0xfd, 0x28, 0xd6, - 0xd1, 0xad, 0x96, 0x5f, 0x4b, 0x58, 0xc5, 0x97, 0xb3, 0x5f, 0xac, 0xbf, - 0x4d, 0x83, 0x66, 0xea, 0xcb, 0xf8, 0xa1, 0xaf, 0xa5, 0xc5, 0x95, 0xf2, - 0x26, 0x8c, 0x8a, 0x61, 0xd6, 0xf2, 0xca, 0x84, 0xc4, 0x32, 0x19, 0xf7, - 0xff, 0xff, 0xf6, 0x18, 0x73, 0xd0, 0x5e, 0xe4, 0xe8, 0x31, 0xe3, 0x27, - 0x6a, 0x0e, 0x4f, 0xc5, 0x97, 0xf6, 0x79, 0xcb, 0xf0, 0x2c, 0xbf, 0xbb, - 0x38, 0xf6, 0x72, 0x59, 0x7f, 0xa1, 0x9c, 0x19, 0x3b, 0x4b, 0x2f, 0x9f, - 0xf7, 0x1a, 0xca, 0x92, 0x2c, 0x70, 0xb4, 0x8b, 0xf8, 0x67, 0x69, 0xed, - 0xdb, 0x32, 0xfd, 0xb2, 0xdb, 0x11, 0xec, 0x6d, 0x0b, 0x61, 0x90, 0xe4, - 0x62, 0x82, 0xc2, 0x34, 0x24, 0x3f, 0x25, 0x9c, 0x6b, 0x7a, 0x8c, 0x05, - 0x84, 0x3d, 0x8c, 0xd9, 0xe1, 0xf6, 0x51, 0xa6, 0xf0, 0x9f, 0xd1, 0x9c, - 0xdf, 0xb4, 0x17, 0x70, 0xaa, 0x2c, 0x05, 0xfe, 0x61, 0xf0, 0x11, 0xa9, - 0x96, 0x5f, 0x04, 0x4e, 0xcc, 0xb2, 0xa0, 0xf6, 0x5c, 0xd2, 0xf7, 0xe2, - 0x7e, 0xb2, 0xd3, 0xf1, 0x19, 0xbc, 0x84, 0x6f, 0x88, 0x2f, 0xda, 0x0b, - 0xb8, 0x55, 0x13, 0xaa, 0xff, 0xff, 0x76, 0x36, 0x1e, 0x32, 0x7f, 0x39, - 0x9d, 0x3e, 0x03, 0x65, 0x97, 0xe9, 0xec, 0x79, 0x4f, 0xc4, 0x4c, 0xcc, - 0x69, 0x7f, 0xff, 0xa0, 0x81, 0x1e, 0xe6, 0x14, 0xff, 0xff, 0x8e, 0xbe, - 0xcb, 0x2f, 0x0b, 0x0c, 0x59, 0x7c, 0xe1, 0x11, 0x8b, 0x2f, 0x4b, 0x93, - 0xc5, 0x3c, 0x0d, 0xe3, 0xb7, 0xed, 0x05, 0xdc, 0x2a, 0x8b, 0x65, 0x7f, - 0x79, 0xfb, 0x38, 0x70, 0xb2, 0xff, 0xfe, 0x94, 0xfe, 0x41, 0xe0, 0xcf, - 0x39, 0x9e, 0x28, 0x59, 0x50, 0x88, 0x87, 0x2f, 0xbf, 0x4a, 0x0f, 0x7c, - 0x2c, 0xbf, 0xe8, 0xe4, 0xfe, 0x98, 0x5f, 0x4b, 0x2a, 0x0f, 0x8b, 0xf2, - 0x8b, 0xfe, 0x89, 0x46, 0xb6, 0x8d, 0x6c, 0xb2, 0xd3, 0xf1, 0x39, 0xb6, - 0x42, 0xf1, 0xe1, 0x06, 0x44, 0x57, 0xfe, 0x29, 0xec, 0x01, 0xf8, 0x9d, - 0xbd, 0x65, 0xff, 0xc0, 0xe4, 0xfc, 0xd3, 0xf3, 0xaf, 0x25, 0x97, 0x3f, - 0xf8, 0x88, 0x8f, 0xd0, 0xae, 0xf8, 0x2b, 0x2f, 0x82, 0xee, 0x15, 0x45, - 0xcc, 0xb3, 0x16, 0x56, 0x8d, 0xfb, 0x45, 0xd7, 0xf1, 0x67, 0xdf, 0x9c, - 0x96, 0x59, 0xb6, 0xb2, 0xb4, 0x78, 0x7b, 0xcb, 0xae, 0x99, 0x8b, 0x29, - 0x65, 0xa7, 0xc2, 0x60, 0x78, 0xae, 0x6c, 0xad, 0x12, 0x6e, 0x0c, 0x5f, - 0xb4, 0x17, 0x70, 0xaa, 0x2e, 0xf5, 0xfe, 0x94, 0xfe, 0x6b, 0x46, 0xd2, - 0xcb, 0x4f, 0xc3, 0xeb, 0x73, 0x4b, 0x87, 0xfa, 0xcb, 0xc5, 0x9b, 0x2c, - 0xb4, 0xf1, 0x4d, 0xa1, 0x0c, 0x54, 0x42, 0x1b, 0xeb, 0x2f, 0xc1, 0x60, - 0x27, 0x1f, 0x42, 0xa0, 0xe9, 0x9d, 0x1a, 0x8f, 0xfd, 0x90, 0xd5, 0xea, - 0x23, 0xc2, 0x8f, 0xf8, 0xf5, 0x0a, 0x1a, 0xbc, 0x8c, 0xcb, 0xd0, 0xbf, - 0x11, 0x72, 0xff, 0xcd, 0x39, 0x6d, 0xc3, 0x2f, 0xa4, 0xb2, 0xff, 0xec, - 0xdb, 0x1a, 0xee, 0x73, 0x0c, 0x96, 0x5f, 0xb3, 0xa3, 0x72, 0x59, 0x71, - 0xcf, 0xea, 0x2a, 0x49, 0x00, 0x44, 0x3b, 0xf7, 0x38, 0xc7, 0x92, 0xcb, - 0xff, 0xff, 0xff, 0x74, 0xfa, 0x70, 0x5e, 0x27, 0x17, 0x3c, 0x0f, 0x1f, - 0xb9, 0xd3, 0xd4, 0x6c, 0xfa, 0x0a, 0xcb, 0xb9, 0x0b, 0x2f, 0xfe, 0xf8, - 0x20, 0x7f, 0xbd, 0x98, 0x42, 0xac, 0xbc, 0x4f, 0x3e, 0x13, 0x1c, 0x09, - 0x47, 0x21, 0x31, 0xe1, 0x6b, 0xc0, 0x76, 0x2c, 0xbf, 0x63, 0x7f, 0xa0, - 0x55, 0x96, 0x6f, 0x59, 0x5b, 0x1b, 0xfc, 0x2b, 0xad, 0x1f, 0xe1, 0x2d, - 0xdf, 0xfb, 0x8e, 0x2f, 0x4e, 0x08, 0x10, 0xb2, 0xff, 0xdd, 0x7f, 0x3f, - 0x7e, 0x96, 0x79, 0x65, 0x61, 0xfe, 0x19, 0xed, 0xcf, 0xfa, 0xcb, 0xff, - 0xff, 0xc4, 0xed, 0x16, 0x7b, 0xd9, 0xb4, 0x13, 0x8b, 0xc6, 0x46, 0x10, - 0xd6, 0x5e, 0xc1, 0x38, 0xb2, 0xb1, 0x15, 0x3a, 0x17, 0x6f, 0x75, 0xbf, - 0xdd, 0xc1, 0x9e, 0xfd, 0x62, 0xcb, 0xfc, 0xf2, 0xd6, 0x6e, 0x1f, 0xeb, - 0x2f, 0x3b, 0x85, 0x51, 0x2b, 0xaf, 0xf0, 0xae, 0x5f, 0xfb, 0x3a, 0xb2, - 0x82, 0x7b, 0x86, 0x51, 0x7f, 0xbe, 0x27, 0x15, 0xfd, 0x25, 0x97, 0xff, - 0x77, 0x24, 0x1e, 0x98, 0xe0, 0xbc, 0xb2, 0x8c, 0xfd, 0xfc, 0x69, 0x52, - 0x4d, 0xfc, 0x66, 0x9a, 0x84, 0x91, 0x42, 0x62, 0xff, 0x46, 0x9e, 0x4f, - 0xf4, 0x96, 0x5f, 0xff, 0xff, 0x69, 0xc8, 0x48, 0xff, 0x25, 0xd8, 0xde, - 0x38, 0x9f, 0x84, 0x09, 0x67, 0x16, 0x5b, 0x65, 0x96, 0xd9, 0x65, 0x41, - 0xa4, 0x90, 0x95, 0xfb, 0x02, 0xf2, 0xc5, 0x97, 0xff, 0xf9, 0xfe, 0xe6, - 0x6b, 0xde, 0x7d, 0x84, 0x60, 0xfa, 0x62, 0xac, 0xbf, 0xec, 0x3d, 0xe5, - 0x19, 0xa9, 0x2c, 0xbf, 0xff, 0x7a, 0x59, 0xba, 0xe5, 0xff, 0xde, 0xd4, - 0x63, 0x4b, 0x1a, 0x37, 0x17, 0xef, 0xbd, 0xd8, 0xfd, 0x65, 0x3a, 0x25, - 0x40, 0xd7, 0x7f, 0xfa, 0x62, 0x8f, 0x73, 0xdf, 0x04, 0xcb, 0x65, 0x97, - 0xfc, 0xed, 0x0f, 0xb1, 0xb6, 0x34, 0xb2, 0x8d, 0x10, 0xe4, 0x99, 0x7f, - 0xfe, 0xc3, 0xff, 0x18, 0x7e, 0xe4, 0x31, 0xfe, 0xf2, 0xcb, 0xff, 0xfc, - 0x17, 0xd3, 0xf7, 0xe9, 0x67, 0xb3, 0xd0, 0x06, 0xde, 0x2c, 0xbf, 0xf9, - 0xfe, 0x91, 0xfb, 0xb1, 0xaf, 0x42, 0xcb, 0xfe, 0x86, 0x7b, 0x26, 0x91, - 0xf9, 0x65, 0x49, 0x33, 0x63, 0x55, 0x63, 0x27, 0x91, 0x2f, 0xff, 0xf7, - 0x4c, 0x63, 0xc6, 0xbe, 0xf0, 0x1f, 0x9d, 0x69, 0xc6, 0xb2, 0xf8, 0x0f, - 0xa9, 0x2c, 0xbf, 0x8a, 0x36, 0xfd, 0xfc, 0xb2, 0xff, 0x38, 0xc4, 0x6f, - 0x82, 0x92, 0xcb, 0x40, 0x4f, 0x91, 0x85, 0xd7, 0xff, 0xf8, 0xfc, 0xec, - 0x72, 0xff, 0xad, 0x39, 0x6c, 0x13, 0xd9, 0x65, 0x0d, 0x30, 0xf3, 0x84, - 0x33, 0x93, 0xdf, 0xf0, 0x3f, 0x63, 0xcb, 0x9a, 0x1a, 0xcb, 0xff, 0xfd, - 0x86, 0x5e, 0xc2, 0x9c, 0x4e, 0x38, 0x2d, 0xa3, 0x4b, 0x2d, 0x9e, 0x44, - 0xce, 0xf3, 0xbb, 0xff, 0xff, 0xdd, 0xc6, 0x7e, 0xfa, 0xcd, 0xf8, 0x3c, - 0xe0, 0x1f, 0xee, 0xb4, 0xfe, 0x59, 0x7f, 0xd3, 0x07, 0xa6, 0xc8, 0xd0, - 0xab, 0x2f, 0xf7, 0xf9, 0xac, 0xcf, 0x71, 0x65, 0x61, 0xf7, 0x7c, 0x77, - 0x43, 0x5d, 0x09, 0xc8, 0xd5, 0xc2, 0x7b, 0xd8, 0xdc, 0xca, 0x19, 0xbe, - 0x2a, 0x12, 0x1d, 0x37, 0xfe, 0xce, 0xf5, 0xe5, 0xfe, 0xb3, 0xe5, 0x97, - 0xfd, 0x9f, 0x70, 0x70, 0xe5, 0xb2, 0xcb, 0xfe, 0x79, 0x73, 0xb1, 0xa1, - 0x06, 0xb2, 0xa4, 0x8b, 0x3c, 0x40, 0xf1, 0xcd, 0xff, 0xde, 0x3d, 0xe7, - 0xe9, 0xa5, 0x05, 0xe5, 0x97, 0xff, 0x9f, 0x25, 0xdc, 0x32, 0xcf, 0xf7, - 0x31, 0x65, 0xe7, 0x94, 0xf8, 0x66, 0xa6, 0xca, 0x13, 0xa3, 0x86, 0x4e, - 0x47, 0x63, 0xf2, 0x3e, 0x8c, 0xd9, 0x0a, 0x4e, 0x90, 0x7e, 0x4c, 0x51, - 0x99, 0x72, 0x76, 0xcb, 0xd1, 0x97, 0x88, 0x5e, 0xde, 0x8d, 0x73, 0x6f, - 0x16, 0x5f, 0xbd, 0x00, 0x6d, 0xe2, 0xcb, 0xf6, 0x05, 0xe5, 0x8b, 0x2f, - 0xf6, 0x0c, 0xcb, 0xd9, 0xd5, 0x97, 0xb3, 0xb3, 0xdb, 0x44, 0x4e, 0x60, - 0xd7, 0x4a, 0xc8, 0x9a, 0xf7, 0xa0, 0x69, 0x2f, 0xff, 0x75, 0xcf, 0xd1, - 0x23, 0xd6, 0xc0, 0xfd, 0x25, 0xfe, 0x70, 0xcf, 0x1e, 0x9b, 0x73, 0xe0, - 0xf9, 0xf8, 0x39, 0x69, 0xe3, 0x6c, 0x88, 0x03, 0x1a, 0xcb, 0x29, 0xc3, - 0xbe, 0x8e, 0x7b, 0x7c, 0x2e, 0xaf, 0xff, 0x4f, 0x63, 0xca, 0x7e, 0x68, - 0x2e, 0xe1, 0x54, 0x4c, 0x2b, 0xff, 0xfb, 0x37, 0xb8, 0xfb, 0x13, 0xfd, - 0xdc, 0x18, 0x3d, 0xc5, 0x97, 0xff, 0xb4, 0xff, 0xcf, 0x17, 0xd2, 0x6a, - 0x39, 0x25, 0x97, 0x64, 0xf2, 0x45, 0x78, 0x8b, 0xf7, 0x33, 0x7a, 0xcb, - 0xff, 0x9b, 0x19, 0xf4, 0x80, 0xfe, 0x28, 0x92, 0xcb, 0xf3, 0x72, 0xdc, - 0xb7, 0x5b, 0x8d, 0xda, 0xcb, 0xf6, 0x32, 0x77, 0xdb, 0xab, 0x2f, 0xe8, - 0x66, 0x7f, 0x1b, 0xd6, 0x50, 0xcf, 0x77, 0xa5, 0xd7, 0xfb, 0x58, 0x18, - 0xfc, 0x46, 0x2c, 0xbf, 0x79, 0xf6, 0x7e, 0x2c, 0xbe, 0x86, 0x1e, 0x96, - 0x5a, 0x26, 0x3c, 0x9d, 0x14, 0x5f, 0x41, 0x1c, 0xcb, 0x2f, 0xdd, 0x81, - 0x98, 0xab, 0x28, 0xd3, 0x11, 0xd1, 0x13, 0x1f, 0x88, 0xa1, 0xbc, 0x86, - 0xf6, 0xf7, 0xe2, 0xcb, 0xfe, 0x36, 0x8b, 0x3e, 0xf6, 0x75, 0x65, 0xfe, - 0x87, 0xdb, 0xc2, 0xbe, 0x96, 0x5f, 0x9f, 0x52, 0x76, 0x2c, 0xac, 0x45, - 0x97, 0x47, 0x88, 0xe4, 0x06, 0x97, 0x6e, 0x37, 0x6b, 0x2f, 0xf7, 0x23, - 0x08, 0x7d, 0x85, 0x97, 0xf4, 0x61, 0x0f, 0xb0, 0xb2, 0xf0, 0x35, 0x34, - 0xe3, 0xdc, 0xe1, 0x8d, 0xff, 0xed, 0x18, 0x30, 0x5c, 0xf0, 0x23, 0xe1, - 0xac, 0xbf, 0xff, 0x1e, 0xba, 0xf3, 0x87, 0x92, 0xec, 0x6f, 0x1c, 0x2c, - 0xbf, 0xe6, 0x84, 0xec, 0x07, 0xa7, 0x32, 0xcb, 0xe0, 0x33, 0x06, 0xb2, - 0xd9, 0xf1, 0xef, 0x37, 0x9e, 0x5f, 0xb5, 0x12, 0xe6, 0x2c, 0xbe, 0x3f, - 0x66, 0xf5, 0x95, 0x07, 0x95, 0xd2, 0x7a, 0xc5, 0x49, 0x21, 0x7b, 0xd1, - 0xbf, 0x52, 0xca, 0x16, 0xde, 0x75, 0xbf, 0xfd, 0x01, 0xe0, 0x3c, 0x7d, - 0x31, 0x7a, 0x6b, 0x2f, 0xe6, 0x46, 0x17, 0xb7, 0x16, 0x5b, 0x8b, 0x2f, - 0xd1, 0x85, 0xed, 0xc5, 0x97, 0xb8, 0xff, 0x4e, 0x3e, 0x99, 0x8b, 0xd8, - 0x23, 0x4c, 0x47, 0xbf, 0xa1, 0x67, 0x7f, 0xdb, 0xb8, 0x3e, 0xc6, 0xe9, - 0x42, 0xca, 0x33, 0xe5, 0x72, 0x8b, 0xfe, 0xd6, 0xc1, 0xe9, 0xf4, 0x1e, - 0x59, 0x5d, 0x3d, 0xb7, 0x20, 0xbf, 0xbd, 0x0c, 0xdf, 0xfc, 0x96, 0x5d, - 0xe3, 0x59, 0x70, 0x31, 0x65, 0x48, 0xf7, 0x45, 0x31, 0xfc, 0x5a, 0xfe, - 0xd6, 0x1f, 0x60, 0x6b, 0x2f, 0x68, 0x1c, 0x59, 0x7f, 0xfd, 0xd8, 0x2c, - 0xf7, 0x73, 0xdd, 0x80, 0x36, 0xd6, 0x5e, 0xee, 0x7c, 0xb2, 0xff, 0xff, - 0x34, 0xdf, 0xec, 0xec, 0xe2, 0xcd, 0x8f, 0x0b, 0xe9, 0x71, 0x65, 0xf9, - 0xaf, 0x67, 0x42, 0xb2, 0xb1, 0x12, 0x0e, 0xcf, 0x43, 0x4d, 0xa7, 0x0b, - 0x0c, 0x75, 0xd4, 0x8a, 0x15, 0xb7, 0xff, 0xbc, 0x4f, 0xff, 0x70, 0xc6, - 0x0f, 0x71, 0x65, 0xf6, 0xfc, 0x1c, 0x2c, 0xbf, 0xe8, 0xd8, 0x49, 0x74, - 0x0f, 0xb2, 0xca, 0x84, 0x54, 0xe2, 0x56, 0x88, 0xef, 0xfd, 0xf4, 0xa7, - 0x75, 0xc3, 0x04, 0x35, 0x97, 0xc0, 0xd7, 0xec, 0x59, 0x58, 0x7c, 0xbc, - 0x41, 0xbe, 0x38, 0xfb, 0x8b, 0x2f, 0xc2, 0x78, 0xa3, 0xf5, 0x95, 0xe3, - 0xcb, 0xde, 0x45, 0x7d, 0xef, 0x63, 0x4b, 0x2f, 0xff, 0x47, 0xbf, 0x89, - 0x67, 0xde, 0xd8, 0x0d, 0x2c, 0xbd, 0xc7, 0xfd, 0x65, 0x42, 0x2c, 0xb0, - 0x90, 0xc8, 0xfc, 0x9d, 0x73, 0xc9, 0x65, 0xff, 0xe3, 0xe4, 0x4a, 0x76, - 0x74, 0xf5, 0xd7, 0x59, 0x5b, 0xa7, 0xc1, 0xd1, 0x6b, 0xf4, 0xdc, 0x18, - 0x36, 0x59, 0x7f, 0x3f, 0xfa, 0xd1, 0xe9, 0x65, 0xef, 0x4e, 0xc5, 0x95, - 0x07, 0xef, 0xf9, 0x58, 0x85, 0xd7, 0xdd, 0x07, 0xde, 0x59, 0x7f, 0xee, - 0x9f, 0x8f, 0x18, 0x59, 0xb2, 0xcb, 0xfb, 0x86, 0x2b, 0x1f, 0xcb, 0x2f, - 0xfd, 0xbe, 0x05, 0x91, 0x94, 0x6a, 0x16, 0x5f, 0xff, 0xfb, 0x59, 0xbe, - 0x0b, 0xd3, 0x84, 0x28, 0xeb, 0x9f, 0xa3, 0xdc, 0x59, 0x70, 0x5b, 0x2b, - 0x2f, 0x6c, 0x09, 0x2c, 0xbc, 0x59, 0xc9, 0xc6, 0xe7, 0x06, 0xe8, 0x29, - 0xc1, 0xfc, 0x7a, 0x65, 0xda, 0x3f, 0xdf, 0x0a, 0x7b, 0xe9, 0xdb, 0xdb, - 0xf6, 0x59, 0x43, 0x54, 0x49, 0x91, 0xd3, 0x8a, 0xa5, 0x6d, 0xd5, 0x96, - 0xdd, 0x59, 0x7b, 0x07, 0xe5, 0x96, 0x61, 0x9b, 0x0d, 0x0a, 0x5d, 0xec, - 0x59, 0x7f, 0xa0, 0xa3, 0xf7, 0x76, 0xf5, 0x97, 0xb4, 0xf2, 0x59, 0x7f, - 0x87, 0xdc, 0x0f, 0x63, 0x4b, 0x28, 0x68, 0x83, 0xd1, 0xa1, 0x0e, 0x5f, - 0xb9, 0x9e, 0xd4, 0x2c, 0xbf, 0xfc, 0xdb, 0x28, 0x63, 0x9f, 0x5f, 0xdd, - 0x85, 0x95, 0x09, 0x9d, 0x1c, 0x26, 0x78, 0x5e, 0x02, 0x7b, 0x9c, 0x2b, - 0x2f, 0xe3, 0x99, 0xc3, 0xc9, 0x2c, 0xa0, 0x9e, 0x27, 0x45, 0xaf, 0xff, - 0xf7, 0x4c, 0x87, 0xac, 0x0f, 0x63, 0xb9, 0xad, 0x40, 0xab, 0x2f, 0xc0, - 0x6f, 0x3c, 0x62, 0xcb, 0xf7, 0x9d, 0x87, 0xe5, 0x94, 0x29, 0xe8, 0x91, - 0x55, 0xff, 0x8f, 0xc0, 0xd3, 0xf2, 0x73, 0x3c, 0xb2, 0xa0, 0xf8, 0xdc, - 0x8a, 0xff, 0xb0, 0xf1, 0x85, 0x9b, 0x3a, 0xcb, 0xf4, 0x7b, 0x9f, 0x81, - 0x65, 0x37, 0x6a, 0xf7, 0xa1, 0x13, 0x23, 0x60, 0x0c, 0x21, 0x66, 0x22, - 0xec, 0x62, 0x84, 0x41, 0xe3, 0x6b, 0xff, 0xe7, 0x60, 0xfb, 0x1d, 0x86, - 0x03, 0xe9, 0x71, 0x65, 0xff, 0xec, 0xf7, 0x4f, 0x3e, 0xf6, 0x6f, 0x8e, - 0x2c, 0xb7, 0x7a, 0x89, 0xc2, 0x51, 0xbe, 0x7e, 0x7b, 0x65, 0x97, 0xff, - 0x39, 0x76, 0x0c, 0x67, 0xcc, 0x92, 0xcb, 0xd1, 0xf8, 0x8b, 0x2f, 0xec, - 0xdf, 0xd3, 0xfe, 0x65, 0x95, 0x88, 0xdb, 0x14, 0xa1, 0xc8, 0xc9, 0x07, - 0x83, 0xd7, 0x14, 0x2c, 0xbe, 0xec, 0x72, 0x16, 0x5e, 0x10, 0x78, 0xb2, - 0xf3, 0x6f, 0x8d, 0x95, 0x95, 0xb1, 0xfc, 0x0c, 0x55, 0xc8, 0x78, 0x3b, - 0x7d, 0x39, 0x93, 0x82, 0xb2, 0xf6, 0x04, 0x6b, 0x2f, 0xbd, 0x85, 0xfa, - 0xcb, 0xf9, 0xda, 0x8f, 0x66, 0xcb, 0x2b, 0x0f, 0xb0, 0xc7, 0x08, 0x8a, - 0xfe, 0x3f, 0x7e, 0x21, 0x49, 0x65, 0xf3, 0x53, 0x72, 0x16, 0x5f, 0xf9, - 0xfd, 0xc1, 0xe9, 0xfd, 0xd0, 0x2c, 0xa1, 0x51, 0x25, 0xf1, 0x79, 0x12, - 0x5a, 0x7b, 0x76, 0xdc, 0x3f, 0x36, 0x46, 0x5b, 0x5a, 0x44, 0x47, 0x5c, - 0x38, 0x7f, 0x64, 0xa8, 0x40, 0xca, 0x13, 0xf9, 0xfa, 0x68, 0xe6, 0xb5, - 0x0f, 0x56, 0x42, 0x4f, 0xb1, 0x8f, 0x3c, 0x26, 0xbf, 0x84, 0xe1, 0x4a, - 0x54, 0xe4, 0xe0, 0xb7, 0xa3, 0xfe, 0x04, 0x30, 0x1a, 0x3c, 0xdc, 0x84, - 0x98, 0x90, 0xbe, 0xbf, 0xfe, 0xd1, 0xfd, 0x2e, 0x1f, 0xbb, 0x1a, 0xf4, - 0x2c, 0xbf, 0xd1, 0xa7, 0x99, 0xf9, 0x25, 0x97, 0x9d, 0xc2, 0xa8, 0xab, - 0x97, 0xf3, 0x89, 0xde, 0xbb, 0x16, 0x50, 0x4f, 0x5b, 0xa5, 0x17, 0xf1, - 0xeb, 0xae, 0x23, 0x16, 0x50, 0xd1, 0xb3, 0xa8, 0x44, 0xf4, 0x8a, 0xf8, - 0x9b, 0xf8, 0xeb, 0x2f, 0x6a, 0x18, 0xb2, 0xff, 0x46, 0xbd, 0x05, 0x1f, - 0xac, 0xbf, 0xd3, 0xf3, 0x41, 0x77, 0x0a, 0xa2, 0x3c, 0x5f, 0xba, 0x7a, - 0xeb, 0xac, 0xbc, 0x5e, 0x75, 0x97, 0x60, 0xf0, 0xf0, 0xb8, 0x4f, 0x52, - 0x45, 0x7b, 0x21, 0x07, 0x7f, 0xa5, 0x1a, 0xda, 0x35, 0xb2, 0xcb, 0xfd, - 0xb8, 0xfd, 0x82, 0x8f, 0xd6, 0x54, 0x1f, 0x56, 0x1a, 0xdf, 0xf7, 0x8c, - 0x0d, 0xbc, 0x96, 0xd3, 0x2c, 0xbf, 0x8b, 0x3d, 0xcc, 0x69, 0x65, 0x41, - 0xf6, 0x39, 0xfd, 0xfe, 0x09, 0xf3, 0xa7, 0xe3, 0x59, 0x7e, 0xcd, 0x9c, - 0xbe, 0x59, 0x5f, 0x1e, 0xd1, 0x19, 0x5f, 0xbd, 0xec, 0x2f, 0xd6, 0x5f, - 0xe6, 0xf7, 0x1c, 0x60, 0xcd, 0x65, 0xa7, 0x8d, 0x72, 0x57, 0x23, 0x29, - 0x33, 0x5d, 0x12, 0x74, 0x71, 0xe1, 0xc2, 0x50, 0x92, 0xe4, 0x23, 0x3c, - 0xf4, 0x21, 0x13, 0x79, 0x45, 0xfb, 0x41, 0x77, 0x0a, 0xa2, 0xc1, 0x5e, - 0x16, 0x36, 0x59, 0x7f, 0xff, 0x10, 0x1f, 0x66, 0x66, 0xe0, 0x35, 0x9a, - 0x90, 0x92, 0x59, 0x7e, 0xc2, 0xcf, 0x71, 0x65, 0xfe, 0xd3, 0xb0, 0x4d, - 0x3f, 0xcb, 0x2d, 0x3f, 0x13, 0x0d, 0x14, 0xd0, 0x23, 0xce, 0xc0, 0x21, - 0x35, 0xfe, 0x9f, 0x9a, 0x0b, 0xb8, 0x55, 0x16, 0x52, 0xff, 0xd9, 0xe9, - 0x67, 0xfb, 0x99, 0xd0, 0x2c, 0xbf, 0x68, 0x2e, 0xe1, 0x54, 0x5a, 0x6b, - 0xfe, 0x71, 0xf5, 0xe6, 0xe9, 0xb1, 0x65, 0xfe, 0x86, 0x60, 0xca, 0x3e, - 0x59, 0x69, 0xe3, 0x47, 0x0e, 0x21, 0x30, 0xd3, 0xa7, 0x37, 0xe6, 0xd4, - 0xdc, 0x5b, 0xb6, 0xed, 0xb9, 0x59, 0x7f, 0xcd, 0x9e, 0x9b, 0x43, 0x77, - 0x0a, 0xcb, 0xf3, 0x6a, 0x6c, 0x73, 0x21, 0x65, 0xfe, 0x11, 0x99, 0xee, - 0x1f, 0x16, 0x58, 0xd6, 0x53, 0x64, 0xf1, 0x37, 0x0d, 0x2f, 0xf4, 0x6d, - 0xa7, 0x1e, 0xce, 0xb2, 0xff, 0xfd, 0xd7, 0x2f, 0x4b, 0x35, 0x90, 0x45, - 0x9e, 0x59, 0x52, 0x44, 0x29, 0x9a, 0x5f, 0xb7, 0xb8, 0xf1, 0x8b, 0x2f, - 0x99, 0x1f, 0x71, 0x65, 0xfe, 0x36, 0x1b, 0x7c, 0x11, 0xac, 0xbf, 0xf8, - 0xf1, 0xff, 0x89, 0x6a, 0x30, 0x96, 0x5f, 0x1e, 0xfe, 0xef, 0x59, 0x7f, - 0x9b, 0xcf, 0xf9, 0xcf, 0xd0, 0x2c, 0xa9, 0x26, 0x83, 0x84, 0x53, 0x14, - 0xf4, 0x8c, 0x8c, 0xf8, 0x82, 0xde, 0x4d, 0x7f, 0x98, 0x23, 0x3f, 0x61, - 0xfe, 0xb2, 0xfd, 0x3b, 0x5a, 0x07, 0x56, 0x5f, 0x8c, 0x58, 0x20, 0xac, - 0xae, 0x1e, 0x97, 0x8a, 0xea, 0x11, 0x57, 0x90, 0x89, 0xbf, 0xfe, 0x20, - 0xf4, 0xfa, 0x7a, 0x89, 0x9a, 0xce, 0xac, 0xbf, 0xf7, 0x0e, 0x77, 0x5f, - 0x51, 0xbe, 0x16, 0x5f, 0xf3, 0x1e, 0x5b, 0x80, 0xe9, 0xe9, 0x65, 0x68, - 0xff, 0x58, 0x83, 0x7e, 0x7e, 0x7a, 0x06, 0xb2, 0xa0, 0xf2, 0x40, 0x45, - 0x7f, 0x9f, 0x52, 0x7f, 0x38, 0x56, 0x54, 0x26, 0xd3, 0xd8, 0xc5, 0x80, - 0x43, 0x7d, 0x02, 0x47, 0x56, 0x5f, 0x05, 0xdc, 0x2a, 0x8b, 0x71, 0x7d, - 0x34, 0x0f, 0x16, 0x5f, 0xfb, 0x35, 0x85, 0x3b, 0xb9, 0xf3, 0x4b, 0x2f, - 0xc5, 0xfb, 0xfd, 0xc5, 0x95, 0x07, 0xd4, 0xe8, 0x35, 0xf2, 0x3f, 0x34, - 0x44, 0xe5, 0xdc, 0x84, 0x65, 0xf6, 0xf8, 0x09, 0x2c, 0xbf, 0x8b, 0xf9, - 0x8a, 0x18, 0xb2, 0x98, 0x7a, 0x2e, 0x47, 0x79, 0x84, 0x6b, 0x2c, 0x4b, - 0x2f, 0xfb, 0xa0, 0x7e, 0x66, 0x10, 0xab, 0x2f, 0xdc, 0x7f, 0x9c, 0x6b, - 0x2c, 0x63, 0x3e, 0x0f, 0x1c, 0x54, 0x22, 0xcb, 0x06, 0xfa, 0xe1, 0x7f, - 0xd0, 0xe5, 0xdc, 0xc2, 0x0a, 0xcb, 0xfd, 0xef, 0x1e, 0xcc, 0x82, 0x59, - 0x52, 0x3e, 0x8c, 0x35, 0xbf, 0xe8, 0x20, 0x32, 0x39, 0xe3, 0x59, 0x7f, - 0xd2, 0x3d, 0xf9, 0xd7, 0x2d, 0x96, 0x5e, 0x8c, 0xd2, 0xcb, 0xfd, 0xd8, - 0x91, 0xee, 0x63, 0x16, 0x50, 0xcf, 0x43, 0x83, 0x77, 0xe9, 0xdf, 0x70, - 0xc5, 0x59, 0x5b, 0x1e, 0x77, 0xc4, 0x55, 0xf2, 0x3f, 0x1e, 0x1b, 0x17, - 0xff, 0x4b, 0x3a, 0x7a, 0x1f, 0x60, 0x82, 0xb2, 0xff, 0x7d, 0x28, 0x2f, - 0x67, 0xeb, 0x2f, 0xb9, 0xf9, 0xf9, 0x65, 0x3a, 0x30, 0xb8, 0x50, 0x04, - 0x31, 0x0d, 0x2f, 0xcf, 0xaf, 0x67, 0x56, 0x5f, 0xf8, 0xff, 0x89, 0x0f, - 0xb0, 0x41, 0x59, 0x52, 0x3e, 0x5f, 0x13, 0xdf, 0xde, 0x96, 0x6b, 0x38, - 0xb2, 0x96, 0x5e, 0x03, 0xf9, 0x65, 0xc0, 0x85, 0x95, 0x23, 0x65, 0xe1, - 0xca, 0x59, 0x7d, 0xf0, 0x4f, 0x4b, 0x2e, 0x64, 0xfc, 0x44, 0x67, 0xc7, - 0xac, 0x21, 0xf0, 0x5d, 0xf6, 0x0c, 0x86, 0xb2, 0xa0, 0xfb, 0x37, 0xa5, - 0xdf, 0xf1, 0x7b, 0xaf, 0x20, 0x38, 0x8b, 0x2a, 0x13, 0xa3, 0xc2, 0x23, - 0x8c, 0x95, 0xc8, 0xef, 0x17, 0xb7, 0x16, 0x5e, 0x9c, 0xdc, 0xb7, 0x2b, - 0x2f, 0xfa, 0x53, 0xf3, 0x41, 0x77, 0x0a, 0xa2, 0x87, 0x51, 0xa2, 0x3e, - 0x61, 0xf7, 0x29, 0xbf, 0x7f, 0x01, 0xc6, 0x2c, 0xbe, 0x89, 0xb0, 0x6b, - 0x2b, 0x47, 0x95, 0xc2, 0x8b, 0xfb, 0x9c, 0x7e, 0xe0, 0x56, 0x5f, 0xf6, - 0x40, 0xfb, 0x0d, 0xf1, 0x32, 0xcb, 0xfd, 0xf9, 0xf7, 0xb9, 0xfb, 0xac, - 0xa6, 0x1f, 0x7f, 0xe7, 0x77, 0xfe, 0x26, 0xf7, 0x27, 0x60, 0xf0, 0x6b, - 0x2a, 0x13, 0x20, 0xc2, 0x27, 0x84, 0xe3, 0x79, 0x1d, 0xff, 0x9c, 0x70, - 0x3e, 0x99, 0x1b, 0x16, 0x5f, 0xfb, 0x7b, 0xeb, 0x8f, 0xde, 0x46, 0xcb, - 0x2f, 0xf7, 0x00, 0x1c, 0xf1, 0x42, 0xca, 0x62, 0x2b, 0xfa, 0x79, 0xe4, - 0x1b, 0xff, 0x81, 0x2e, 0xbe, 0xbe, 0xf4, 0x1e, 0xcb, 0x2f, 0xf4, 0xa3, - 0x5b, 0x46, 0xb6, 0x59, 0x7e, 0x7e, 0x6f, 0xce, 0x2c, 0xa8, 0x3d, 0xef, - 0xcd, 0x6f, 0xd3, 0xbb, 0x9f, 0xba, 0xcb, 0xfa, 0x4f, 0xac, 0xfb, 0xcb, - 0x2f, 0xe1, 0xbb, 0x3a, 0x6d, 0x2c, 0xa8, 0x3d, 0xcc, 0x2e, 0xbf, 0xec, - 0xf7, 0x04, 0xe6, 0x9f, 0x8b, 0x2f, 0xc7, 0xee, 0x39, 0xac, 0xbf, 0xed, - 0x7f, 0xa7, 0x2f, 0x67, 0xeb, 0x2b, 0x64, 0xd0, 0x35, 0x08, 0x66, 0x10, - 0x7e, 0x74, 0x02, 0x6b, 0xc2, 0x6a, 0x4b, 0x2f, 0xe1, 0x3c, 0x08, 0xcd, - 0x96, 0x5f, 0xdf, 0xf5, 0xcf, 0xa0, 0x59, 0x52, 0x3f, 0xb9, 0x87, 0xb4, - 0x5f, 0x7f, 0xf0, 0x4a, 0x3c, 0x59, 0xbf, 0x35, 0x25, 0x97, 0xe7, 0xe7, - 0x36, 0xe2, 0xcb, 0xdc, 0x63, 0xac, 0xbf, 0xc4, 0x28, 0x9d, 0xe8, 0x38, - 0xb2, 0xa6, 0x3d, 0x20, 0x0e, 0x5f, 0xfc, 0x0e, 0x75, 0xe5, 0x04, 0x3c, - 0xea, 0xcb, 0xfe, 0x12, 0x3f, 0x9a, 0x51, 0xad, 0x96, 0x5f, 0xc4, 0xfe, - 0x12, 0x02, 0xb2, 0x98, 0x7d, 0x44, 0x7b, 0x7c, 0x5f, 0xed, 0xfa, 0xcb, - 0xff, 0xfd, 0x37, 0x0c, 0x73, 0xa6, 0x32, 0xde, 0xf3, 0x3f, 0x81, 0x0b, - 0x2b, 0x11, 0x58, 0x64, 0x2e, 0x4b, 0x7f, 0xb9, 0x3b, 0xd3, 0x87, 0x84, - 0xb2, 0xdf, 0xac, 0xb1, 0xfc, 0x79, 0x3a, 0x37, 0xbf, 0x3f, 0xdc, 0xf1, - 0xac, 0xa8, 0x56, 0x63, 0x86, 0x02, 0xa2, 0x1b, 0xde, 0x88, 0xfb, 0x1a, - 0xc9, 0x3b, 0x70, 0xa2, 0xfc, 0xe0, 0x16, 0x04, 0x59, 0x7e, 0x6c, 0xe6, - 0xa3, 0x8b, 0x2a, 0x63, 0xd4, 0x22, 0x9b, 0xfb, 0x3c, 0x63, 0xc6, 0x2c, - 0xbe, 0x29, 0x1b, 0x16, 0x5a, 0x74, 0xc7, 0x9a, 0xe5, 0x97, 0xfb, 0x91, - 0x37, 0xd2, 0xcd, 0xeb, 0x28, 0x67, 0xc2, 0xe5, 0x57, 0xff, 0xe1, 0xf6, - 0x04, 0x9f, 0xe2, 0x7f, 0xf9, 0xc8, 0xfd, 0x25, 0xc3, 0xc5, 0x97, 0xed, - 0xa3, 0x67, 0xe2, 0xca, 0xc4, 0x4c, 0x9a, 0xd3, 0x8b, 0x5d, 0xf8, 0x16, - 0x5f, 0xfb, 0x9b, 0xde, 0x6d, 0x9c, 0x9e, 0x65, 0x97, 0xf3, 0xff, 0x31, - 0x40, 0xd6, 0x5f, 0xf1, 0x66, 0xc3, 0xee, 0x17, 0x96, 0x54, 0x23, 0x02, - 0x61, 0x8e, 0xa1, 0x11, 0x75, 0x37, 0x4d, 0xd0, 0xd3, 0x72, 0x88, 0xdc, - 0x4f, 0x5b, 0x47, 0x58, 0x8f, 0xbe, 0x51, 0x89, 0x0e, 0x38, 0xfc, 0x8c, - 0xc8, 0x58, 0x49, 0x86, 0x1a, 0x7f, 0x42, 0x58, 0xc8, 0x66, 0x8f, 0xd7, - 0x52, 0x91, 0x59, 0x0c, 0xfe, 0xc7, 0x32, 0xf0, 0xf2, 0xfc, 0xc0, 0xa1, - 0x49, 0xc8, 0xd8, 0xbd, 0x2f, 0xf8, 0x10, 0xca, 0xdf, 0x0d, 0x0d, 0xc8, - 0x5d, 0x09, 0x0e, 0xdb, 0xff, 0xf0, 0x67, 0xff, 0xac, 0xf8, 0x3d, 0x3f, - 0x71, 0xfe, 0x59, 0x53, 0xd5, 0x19, 0x02, 0x3d, 0x7b, 0xe8, 0xd4, 0x98, - 0xb2, 0xfb, 0xee, 0x3e, 0xea, 0xcb, 0xcf, 0xa1, 0x56, 0x5a, 0x7e, 0xc7, - 0xca, 0x64, 0x4d, 0x13, 0x5f, 0xe9, 0xf9, 0xa0, 0xbb, 0x85, 0x51, 0x79, - 0xaa, 0x1f, 0x04, 0xae, 0x4e, 0x63, 0x8c, 0x27, 0x2b, 0x8a, 0xef, 0xa7, - 0x8b, 0x35, 0x1e, 0x2b, 0x14, 0xfb, 0x19, 0x11, 0x57, 0x92, 0x1c, 0x84, - 0x96, 0xf3, 0x8b, 0xfd, 0x3f, 0x34, 0x17, 0x70, 0xaa, 0x29, 0x65, 0xcd, - 0xdb, 0x68, 0xb2, 0xfc, 0x73, 0xf9, 0x86, 0xb2, 0xfd, 0xa0, 0xbb, 0x85, - 0x51, 0x61, 0x2f, 0xff, 0xb0, 0x87, 0x1d, 0x8f, 0xbd, 0x84, 0xec, 0x59, - 0x78, 0x80, 0x15, 0x95, 0x07, 0xd2, 0xe9, 0xb6, 0xe2, 0xcb, 0xf8, 0x1a, - 0x3d, 0x9d, 0x8b, 0x2d, 0x3d, 0xb4, 0x4d, 0x14, 0x64, 0x38, 0x50, 0xc8, - 0x4e, 0xf0, 0x83, 0x70, 0x46, 0xff, 0x4f, 0xcd, 0x05, 0xdc, 0x2a, 0x8b, - 0x2d, 0x69, 0x2c, 0xbb, 0x42, 0xac, 0xbe, 0x9e, 0x2b, 0x68, 0xdd, 0x2c, - 0xa4, 0x97, 0xa7, 0x88, 0xc5, 0x94, 0x13, 0xdb, 0xe1, 0x80, 0x02, 0xe8, - 0x54, 0x59, 0x90, 0x8f, 0x1c, 0xee, 0x8e, 0xac, 0xb7, 0xeb, 0x2e, 0x17, - 0x65, 0x96, 0xd4, 0x8d, 0x5e, 0x09, 0x50, 0x4f, 0x9d, 0xd0, 0x6e, 0x3f, - 0xd6, 0x5f, 0xf3, 0xfc, 0x59, 0xf7, 0xa0, 0x55, 0x97, 0xfb, 0x6f, 0xb9, - 0x03, 0xf1, 0xac, 0xbf, 0x46, 0x6f, 0x8e, 0x2c, 0xb4, 0x39, 0xee, 0xb4, - 0x6b, 0x4e, 0x8b, 0xe2, 0x84, 0xbd, 0xf3, 0xca, 0x43, 0x59, 0x7f, 0x3e, - 0xa3, 0xcf, 0xd5, 0x97, 0x9a, 0x69, 0xa4, 0x97, 0xfd, 0x12, 0xfb, 0xda, - 0x8c, 0xf9, 0x24, 0xf3, 0x41, 0x7f, 0xc0, 0x7f, 0xb3, 0xc7, 0xf3, 0x4b, - 0x2e, 0x8e, 0x2c, 0xa1, 0xa6, 0x17, 0xd2, 0x22, 0x4c, 0xe2, 0x66, 0xf3, - 0xbb, 0x9b, 0x46, 0xe9, 0x65, 0xfc, 0x6f, 0xcf, 0xf8, 0x05, 0x97, 0xff, - 0x1c, 0x9f, 0x8e, 0x40, 0x0e, 0x71, 0x25, 0xff, 0xfd, 0xd3, 0xf7, 0x73, - 0x85, 0x8c, 0x07, 0x3a, 0xf2, 0x59, 0x7f, 0xa2, 0x5e, 0x7e, 0xb8, 0xd6, - 0x54, 0x23, 0x3b, 0x10, 0xb4, 0xb5, 0x69, 0x2c, 0xb4, 0x96, 0x5a, 0x4b, - 0x2f, 0x34, 0xd3, 0x4b, 0x2c, 0x14, 0x93, 0xcd, 0x05, 0x41, 0xfb, 0x0a, - 0x22, 0x62, 0x3f, 0x98, 0xdf, 0xc0, 0xe7, 0x5e, 0x58, 0xb2, 0xff, 0xfb, - 0x86, 0x1c, 0x2d, 0x41, 0x60, 0xf0, 0x55, 0x94, 0xc3, 0xfa, 0xf1, 0x6d, - 0xbe, 0x59, 0x61, 0x56, 0x58, 0x0b, 0x28, 0x8d, 0x1f, 0x04, 0xab, 0x0f, - 0xdf, 0x84, 0x5e, 0x35, 0xbb, 0x82, 0xac, 0xb6, 0x2c, 0xb8, 0x1f, 0xc1, - 0xa8, 0x18, 0xc5, 0xc7, 0x0b, 0x2f, 0xe2, 0x86, 0x14, 0x62, 0xcb, 0xff, - 0xa1, 0xf5, 0xee, 0xe0, 0xc1, 0xee, 0x2c, 0xba, 0x50, 0xb2, 0xf7, 0x06, - 0x2a, 0xca, 0xd9, 0x1c, 0x83, 0x2d, 0x98, 0x57, 0xa5, 0x40, 0x44, 0x10, - 0x5a, 0xff, 0xff, 0xfb, 0xb1, 0xee, 0x1f, 0x39, 0x1e, 0xe9, 0xc6, 0xbf, - 0x63, 0xca, 0x5e, 0x15, 0x65, 0xc7, 0xf2, 0xcb, 0xa1, 0x8b, 0x2f, 0xff, - 0xd0, 0x40, 0x94, 0xa3, 0xdd, 0xc6, 0x09, 0x1f, 0xac, 0xbf, 0xfe, 0x32, - 0x04, 0xb3, 0x9a, 0x83, 0x93, 0xf1, 0x25, 0x49, 0x14, 0x7e, 0x56, 0xb8, - 0x33, 0xe1, 0x91, 0xfd, 0xb4, 0x25, 0xe4, 0x42, 0x38, 0x6a, 0xe4, 0x66, - 0x22, 0xa6, 0x04, 0x87, 0x50, 0xfc, 0x78, 0x52, 0x14, 0x65, 0xbc, 0x8c, - 0xeb, 0xcb, 0x5b, 0xdf, 0xf7, 0x05, 0xc4, 0x85, 0xcd, 0xff, 0xe9, 0xec, - 0x79, 0x4f, 0xcd, 0x05, 0xdc, 0x2a, 0x8a, 0x31, 0x7e, 0xdf, 0x1a, 0x8f, - 0xd6, 0x5f, 0x89, 0xff, 0x81, 0x16, 0x5f, 0xf8, 0xfe, 0x97, 0x0b, 0x3d, - 0xd0, 0x2c, 0xbf, 0xe3, 0xd7, 0x73, 0x0a, 0x5c, 0x59, 0x52, 0x3f, 0x60, - 0x9f, 0xdf, 0x3e, 0xfc, 0x25, 0x95, 0xf1, 0xe2, 0x68, 0x8a, 0xff, 0xcf, - 0x20, 0xf4, 0xd9, 0x1a, 0x15, 0x65, 0xa7, 0xc2, 0x6d, 0xdd, 0x2a, 0xf4, - 0x38, 0x9a, 0x23, 0xa9, 0x33, 0xc1, 0x35, 0x1c, 0x33, 0x1b, 0x1e, 0x93, - 0xe5, 0xc8, 0xc3, 0x7d, 0x1e, 0x45, 0xff, 0xd3, 0xde, 0x53, 0xf3, 0x41, - 0x77, 0x0a, 0xa2, 0x39, 0x5f, 0xfe, 0x9e, 0xc7, 0x94, 0xfc, 0xd0, 0x5d, - 0xc2, 0xa8, 0x9c, 0x97, 0xfa, 0x7e, 0x68, 0x2e, 0xe1, 0x54, 0x59, 0x8b, - 0xbd, 0xfa, 0xcb, 0xf6, 0x74, 0xb3, 0x4b, 0x2f, 0x6d, 0x1a, 0x59, 0x7e, - 0x97, 0x1d, 0x93, 0xfa, 0x7b, 0x64, 0x31, 0xc2, 0x6b, 0xe6, 0xe0, 0xdd, - 0x37, 0x4d, 0xc1, 0x65, 0xfe, 0x1e, 0x32, 0x3e, 0x86, 0x2c, 0xa6, 0xe8, - 0xfb, 0x1b, 0x81, 0xcd, 0xfe, 0xd4, 0x7b, 0xaf, 0xf4, 0x96, 0x5f, 0xff, - 0xff, 0x44, 0xdd, 0x8f, 0x40, 0x87, 0xa9, 0xa3, 0xb9, 0xbf, 0x3b, 0x83, - 0xdf, 0x8b, 0x2b, 0xf4, 0x5a, 0x91, 0xa5, 0xff, 0x67, 0x1f, 0xdf, 0x88, - 0x52, 0x59, 0x6f, 0xd6, 0x5f, 0xdc, 0xd6, 0xb3, 0xee, 0x2c, 0xa6, 0xe8, - 0xf0, 0x70, 0x4a, 0xf6, 0xb1, 0x8b, 0x2f, 0x8c, 0xb3, 0x8b, 0x2d, 0x9e, - 0x37, 0x8d, 0xe3, 0x97, 0xed, 0x7b, 0xc7, 0xa5, 0x97, 0x9c, 0x82, 0xb2, - 0xf7, 0x23, 0x8b, 0x2f, 0xfc, 0x65, 0x1c, 0x8f, 0x6d, 0x8d, 0x2c, 0xbf, - 0xf1, 0x0f, 0xb1, 0xce, 0x66, 0xa1, 0x65, 0xfb, 0x3e, 0xf6, 0x42, 0xcb, - 0xa7, 0x08, 0xb2, 0xfc, 0x1e, 0xb9, 0xb6, 0xd6, 0x5f, 0x81, 0xc8, 0xe4, - 0x2c, 0xad, 0x1e, 0x93, 0x95, 0xdf, 0xc5, 0xff, 0x73, 0xf7, 0x59, 0x7c, - 0x51, 0xbc, 0x0b, 0x28, 0xcf, 0x45, 0xcb, 0xae, 0xf9, 0x8b, 0x2f, 0xfe, - 0xdc, 0x72, 0xff, 0x3d, 0x04, 0x7f, 0xac, 0xb4, 0xf6, 0xe9, 0x71, 0xa2, - 0x21, 0xc5, 0xb1, 0x1c, 0x9e, 0xc6, 0xc5, 0x85, 0x21, 0x28, 0xf8, 0x6d, - 0x83, 0x8e, 0x7c, 0x47, 0xbc, 0x27, 0x03, 0x66, 0xf7, 0x2d, 0xc2, 0x01, - 0x06, 0x2f, 0xf4, 0xfc, 0xd0, 0x5d, 0xc2, 0xa8, 0xb7, 0x57, 0xf1, 0x3c, - 0xfd, 0x6d, 0xd5, 0x97, 0x8f, 0xef, 0xd6, 0x5f, 0xfd, 0xa7, 0x0f, 0xe0, - 0xe7, 0xa3, 0xe6, 0x96, 0x5c, 0x42, 0xac, 0xbe, 0x0b, 0xb8, 0x55, 0x14, - 0x82, 0xb0, 0xf1, 0x74, 0x2f, 0x7f, 0xa5, 0xe3, 0x6b, 0x9f, 0x9a, 0xcb, - 0xff, 0x67, 0x4f, 0x7f, 0x73, 0x08, 0x2b, 0x2f, 0x3c, 0xa7, 0x8d, 0x32, - 0x1c, 0x84, 0x6f, 0xc4, 0x3c, 0x35, 0xbf, 0xc6, 0x30, 0x7b, 0x8c, 0x25, - 0x97, 0xcd, 0x32, 0x38, 0xb2, 0xf3, 0x94, 0x96, 0x5a, 0x78, 0x55, 0x1b, - 0x68, 0xc1, 0x91, 0x9f, 0xba, 0xb0, 0x0c, 0xda, 0x23, 0xbf, 0xfa, 0x7b, - 0xca, 0x7e, 0x68, 0x2e, 0xe1, 0x54, 0x4a, 0x4a, 0xd9, 0x95, 0x1f, 0x32, - 0xa3, 0x16, 0x9e, 0x13, 0x9f, 0xce, 0x90, 0x94, 0x3c, 0xbd, 0x29, 0xdd, - 0xbd, 0x9e, 0xf4, 0xf7, 0x0a, 0xcb, 0xf8, 0xcb, 0x3b, 0x81, 0x59, 0x7f, - 0x19, 0x7b, 0x0c, 0x6b, 0x2e, 0x97, 0x96, 0x5e, 0x28, 0x69, 0x65, 0xd1, - 0x3f, 0x46, 0xcc, 0x85, 0xea, 0x48, 0x8b, 0xf2, 0xf5, 0xee, 0x01, 0x8b, - 0x2d, 0x3e, 0x48, 0xf6, 0xfa, 0x16, 0xc6, 0x47, 0x78, 0x9e, 0x4b, 0x2f, - 0xda, 0x0b, 0xb8, 0x55, 0x13, 0xb2, 0xff, 0xec, 0xe9, 0x3c, 0x81, 0xfb, - 0x1e, 0x4b, 0x2f, 0x3c, 0xa7, 0xe1, 0xfc, 0x11, 0xa5, 0xdb, 0x6e, 0xac, - 0xbf, 0xff, 0x18, 0xc0, 0xc8, 0x6f, 0x71, 0x94, 0x16, 0x05, 0x65, 0xfe, - 0x94, 0x6b, 0x68, 0xd6, 0xcb, 0x2f, 0xfd, 0xd2, 0x79, 0x03, 0xf6, 0x3c, - 0x96, 0x54, 0x1f, 0xa6, 0x1a, 0xda, 0x7e, 0x27, 0x94, 0xc8, 0x49, 0xf4, - 0xcd, 0xc6, 0xca, 0x19, 0x37, 0xc7, 0xa8, 0xde, 0xb2, 0xec, 0xea, 0xcb, - 0xff, 0xb7, 0x1c, 0xbf, 0xcf, 0x41, 0x1f, 0xeb, 0x2d, 0x3f, 0x87, 0xff, - 0xb8, 0x46, 0x20, 0xb5, 0xff, 0xce, 0xce, 0xe0, 0x5f, 0xb0, 0x24, 0x96, - 0x5e, 0x31, 0xba, 0xcb, 0xff, 0x8b, 0x3a, 0xfb, 0x67, 0x09, 0xfe, 0x59, - 0x76, 0xe4, 0xf1, 0xa2, 0x8b, 0xa8, 0x9c, 0x1b, 0xa8, 0x5d, 0x12, 0x94, - 0x62, 0x8c, 0x94, 0x0f, 0xc8, 0x6c, 0xee, 0x43, 0x76, 0xff, 0xdc, 0x82, - 0xfb, 0xfe, 0x72, 0x3f, 0x59, 0x7f, 0xff, 0xff, 0xdd, 0x3f, 0x3b, 0xfd, - 0xce, 0x72, 0x19, 0x1d, 0xcc, 0xdb, 0x0b, 0x3e, 0xf7, 0x23, 0xe5, 0x97, - 0xfa, 0x24, 0x7e, 0x32, 0x92, 0xcb, 0xff, 0xff, 0x04, 0x1b, 0x66, 0xf8, - 0xfb, 0x06, 0xf2, 0x11, 0x9c, 0xc7, 0x1a, 0xcb, 0xe1, 0xbf, 0xa7, 0xe2, - 0x6e, 0xc1, 0x41, 0xd4, 0x25, 0x38, 0x63, 0x7f, 0xf4, 0xdf, 0x70, 0xd9, - 0x38, 0x4d, 0x66, 0xcb, 0x2f, 0xda, 0x0b, 0xb8, 0x55, 0x11, 0x62, 0xff, - 0xcf, 0x29, 0xf9, 0xa0, 0xbb, 0x85, 0x51, 0x2e, 0xaf, 0xff, 0xec, 0x1f, - 0x60, 0x49, 0xfe, 0x27, 0xff, 0x9c, 0x8f, 0xd2, 0x5a, 0x7c, 0x26, 0x55, - 0x89, 0x6c, 0x34, 0xdc, 0x4c, 0xbf, 0xf9, 0x8f, 0x29, 0xf9, 0xa0, 0xbb, - 0x85, 0x51, 0x31, 0x2f, 0xff, 0xb0, 0x31, 0x3f, 0xae, 0x7b, 0x87, 0xfe, - 0x0d, 0x65, 0x4f, 0x45, 0x2f, 0x54, 0xaf, 0xda, 0x0b, 0xb8, 0x55, 0x15, - 0x4a, 0xd8, 0xb2, 0xb0, 0xf1, 0x05, 0x34, 0xbf, 0xf0, 0x1f, 0x52, 0x2c, - 0x69, 0xff, 0x59, 0x7f, 0xf3, 0xf3, 0x46, 0xd7, 0xba, 0x7a, 0x92, 0xcb, - 0xfe, 0xd3, 0xf7, 0xe9, 0x67, 0xa7, 0x8d, 0x10, 0x9d, 0x3f, 0xa9, 0xe8, - 0xfa, 0x78, 0x53, 0x5f, 0xfc, 0xc7, 0x94, 0xfc, 0xd0, 0x5d, 0xc2, 0xa8, - 0x9d, 0x17, 0xfe, 0x64, 0x0b, 0x3c, 0x1b, 0x14, 0x6c, 0xb2, 0xa7, 0xa2, - 0x54, 0xd4, 0xaf, 0xf1, 0xbe, 0xa2, 0x4f, 0xbd, 0x65, 0xfa, 0x68, 0x9a, - 0x38, 0xb2, 0xfe, 0x6b, 0x0f, 0x7e, 0x12, 0xca, 0x33, 0xd7, 0xe1, 0x4d, - 0xe3, 0xec, 0x2c, 0x9e, 0x68, 0x6f, 0xfe, 0x07, 0x3d, 0x1f, 0x4f, 0x04, - 0xc6, 0xc5, 0x94, 0xc3, 0xf6, 0xe9, 0x6d, 0xff, 0x9e, 0x53, 0xf3, 0x41, - 0x77, 0x0a, 0xa2, 0x77, 0x5f, 0xbc, 0x07, 0x61, 0xa4, 0xbf, 0xf1, 0x47, - 0xb3, 0x99, 0x9f, 0x49, 0x65, 0x0d, 0x3f, 0x3c, 0x8c, 0x85, 0x84, 0x4e, - 0x99, 0xe2, 0x7b, 0xfe, 0x1c, 0x4a, 0x27, 0xb5, 0xcf, 0xd6, 0x5f, 0xb8, - 0x51, 0xff, 0x16, 0x5e, 0x2c, 0x1a, 0xcb, 0xa2, 0x7c, 0x1e, 0x1f, 0xe5, - 0x15, 0x3d, 0x1f, 0xd8, 0x9e, 0x50, 0x80, 0xbf, 0xfd, 0x3d, 0x8f, 0x29, - 0xf9, 0xa0, 0xbb, 0x85, 0x51, 0x42, 0xaf, 0xff, 0x9f, 0xd2, 0xc2, 0x31, - 0xcf, 0xe6, 0xd1, 0xa5, 0x97, 0xff, 0xff, 0xba, 0x06, 0x31, 0xe5, 0x3c, - 0x3d, 0x07, 0xa0, 0xb3, 0x61, 0x41, 0x13, 0x2c, 0xbf, 0x03, 0xef, 0x18, - 0x56, 0x5f, 0xb3, 0xfc, 0x72, 0x59, 0x7d, 0xc3, 0x6b, 0xcb, 0x2f, 0x47, - 0xf3, 0xf6, 0x3f, 0x22, 0x29, 0xf1, 0x35, 0x1a, 0x66, 0x45, 0x0e, 0xfb, - 0xff, 0xd3, 0xd8, 0xf2, 0x9f, 0x9a, 0x0b, 0xb8, 0x55, 0x14, 0x92, 0xff, - 0xff, 0x67, 0x27, 0x89, 0x93, 0x75, 0xd9, 0xee, 0xc7, 0x80, 0xc5, 0x95, - 0x0c, 0xa9, 0xfd, 0xa3, 0x85, 0x94, 0x3b, 0x03, 0x1b, 0x1e, 0xa1, 0x7c, - 0xc9, 0x62, 0xbf, 0x9a, 0x92, 0xd7, 0xa3, 0x83, 0x01, 0x3e, 0xe2, 0xd5, - 0xfe, 0x9f, 0x9a, 0x0b, 0xb8, 0x55, 0x11, 0x22, 0xf6, 0x9f, 0x4b, 0x2f, - 0xfc, 0xf2, 0x9f, 0x9a, 0x0b, 0xb8, 0x55, 0x12, 0xf2, 0xd3, 0xcc, 0xfa, - 0x18, 0x39, 0x7f, 0xf4, 0x6f, 0x79, 0x8f, 0x5f, 0x4a, 0x26, 0x59, 0x79, - 0xba, 0x67, 0xeb, 0x2f, 0xb4, 0x0f, 0x71, 0x65, 0xfb, 0x5f, 0xb0, 0xf8, - 0xb2, 0xf4, 0x17, 0xcb, 0x2f, 0xde, 0x11, 0x85, 0x0b, 0x2c, 0x7d, 0x3c, - 0x42, 0x1c, 0xbf, 0xfd, 0xdd, 0xf0, 0x5f, 0xee, 0xe0, 0xf3, 0x5f, 0x2c, - 0xbf, 0xc7, 0xa7, 0x19, 0x90, 0xab, 0x2e, 0x8f, 0x2c, 0xbf, 0xe7, 0xdb, - 0x51, 0xf4, 0x8d, 0x8b, 0x2f, 0xff, 0x00, 0x67, 0xa1, 0x26, 0x6f, 0x03, - 0x94, 0xcb, 0x2a, 0x49, 0xa4, 0x19, 0x37, 0x54, 0x3f, 0x32, 0x21, 0x6e, - 0x1d, 0x5f, 0xdf, 0xf6, 0x34, 0x6c, 0x59, 0x7f, 0xe9, 0xb9, 0x1b, 0xdf, - 0xb1, 0xf4, 0xcb, 0x2a, 0x0f, 0xc5, 0xcb, 0xaf, 0x8d, 0xbc, 0x46, 0x2c, - 0xbf, 0x66, 0xd9, 0xc6, 0x2c, 0xbf, 0x9f, 0x67, 0xe3, 0xfe, 0xb2, 0xff, - 0xe9, 0xa7, 0x08, 0x51, 0xbd, 0xf7, 0xc4, 0xcb, 0x29, 0x65, 0xf7, 0xb3, - 0x53, 0x2c, 0xbd, 0xe7, 0xde, 0xb2, 0xd2, 0xc3, 0xc1, 0x72, 0x3b, 0xf3, - 0xf2, 0x37, 0xe2, 0xca, 0x98, 0xf3, 0xb7, 0x93, 0x54, 0x26, 0x17, 0x89, - 0x8f, 0x09, 0xab, 0xb5, 0x0b, 0x28, 0x6b, 0x92, 0x06, 0x47, 0x34, 0x76, - 0xba, 0x86, 0x47, 0x48, 0x08, 0x9b, 0xc5, 0x1b, 0xe3, 0x39, 0x6f, 0x33, - 0xbb, 0x09, 0x65, 0xfd, 0x3b, 0x9d, 0xc3, 0xf2, 0xca, 0x19, 0xe2, 0x18, - 0xad, 0xc3, 0xf9, 0x65, 0xfc, 0x40, 0xf4, 0xd0, 0x2a, 0xcb, 0xcd, 0xb3, - 0xd2, 0xcb, 0x1b, 0x9e, 0x78, 0x0b, 0xef, 0xc5, 0x9b, 0x09, 0xbd, 0x65, - 0xf6, 0x6c, 0x26, 0xf5, 0x97, 0xe1, 0xc7, 0xc3, 0x79, 0xc7, 0xa2, 0x45, - 0x77, 0xff, 0xc7, 0xa9, 0xdd, 0x83, 0xf7, 0x00, 0x10, 0x42, 0xcb, 0xe3, - 0xdb, 0xfd, 0xd5, 0x97, 0x9d, 0xc2, 0xa8, 0xa5, 0xd4, 0xb2, 0x82, 0x6c, - 0xe6, 0x28, 0xbe, 0x2f, 0x46, 0x96, 0x5f, 0xf6, 0x6b, 0x77, 0x07, 0x9a, - 0xf9, 0x65, 0x19, 0xee, 0xef, 0x21, 0xbf, 0xf4, 0x4b, 0xae, 0x7f, 0x72, - 0x05, 0x59, 0x52, 0x4f, 0x30, 0x54, 0x09, 0x94, 0x74, 0xb5, 0xd7, 0xf2, - 0x23, 0xbd, 0x1a, 0xf2, 0xcb, 0xf8, 0x7f, 0x46, 0x8f, 0xe5, 0x97, 0xde, - 0xdb, 0x1a, 0x59, 0x52, 0x3e, 0xf3, 0x1c, 0x22, 0xfb, 0xf1, 0x8b, 0xac, - 0xe2, 0xcb, 0xff, 0x41, 0x47, 0x67, 0x00, 0x80, 0x15, 0x97, 0x80, 0xfc, - 0x59, 0x7d, 0x30, 0x1e, 0x65, 0x97, 0xe8, 0xfd, 0xfe, 0xe2, 0xcb, 0xc4, - 0x7f, 0xac, 0xbd, 0x9e, 0xe2, 0xca, 0x83, 0x71, 0xc1, 0xca, 0x92, 0x65, - 0x03, 0x28, 0x98, 0xff, 0xa3, 0x9f, 0x92, 0x79, 0x86, 0xfd, 0xba, 0xe4, - 0x36, 0xf5, 0x94, 0xb2, 0xfd, 0xcf, 0x6a, 0x38, 0xb2, 0xd1, 0xf1, 0xb3, - 0xf0, 0x5d, 0xff, 0x7f, 0xcd, 0x47, 0xd2, 0x36, 0x2c, 0xbd, 0xe7, 0xde, - 0xb2, 0xfd, 0xb0, 0x26, 0x8d, 0xd5, 0x97, 0xc0, 0x9a, 0x37, 0x56, 0x5c, - 0xfb, 0x4e, 0x3d, 0x3d, 0x8b, 0x6a, 0x11, 0xba, 0xe7, 0x60, 0x71, 0xbf, - 0xe8, 0x3f, 0xf9, 0x0c, 0x7f, 0x2c, 0xbf, 0xe3, 0xe4, 0xc6, 0x5e, 0x8f, - 0xd6, 0x5f, 0xfc, 0x5e, 0xdf, 0x1a, 0xe3, 0x94, 0x6e, 0xac, 0xa9, 0x23, - 0x9b, 0x45, 0xcc, 0x38, 0xe1, 0xcd, 0xfe, 0x8d, 0xde, 0x43, 0x1f, 0xcb, - 0x2e, 0x72, 0x59, 0x7f, 0xd1, 0xfc, 0xee, 0xc3, 0x1c, 0x96, 0x57, 0xc7, - 0x9f, 0xbc, 0x56, 0xa4, 0x8a, 0x9d, 0x42, 0x12, 0xfe, 0x86, 0x8f, 0xa0, - 0xdd, 0x59, 0x7f, 0x7d, 0x2e, 0x39, 0x7c, 0xb2, 0xa1, 0x5d, 0xc4, 0x98, - 0x32, 0x3e, 0xa3, 0x87, 0x36, 0x8a, 0x04, 0x31, 0xbf, 0xf1, 0x4d, 0x3b, - 0x51, 0xf4, 0x8d, 0x8b, 0x2f, 0xff, 0x6f, 0x82, 0xf7, 0xbb, 0x83, 0x07, - 0xb8, 0xb2, 0xe8, 0x62, 0xca, 0x84, 0x52, 0x62, 0x16, 0x93, 0x2f, 0xe8, - 0x29, 0xbc, 0x62, 0xac, 0xbf, 0xe9, 0x66, 0xa6, 0xc2, 0x86, 0x2c, 0xbf, - 0x7f, 0x01, 0xc6, 0x2c, 0xbf, 0xd9, 0xb7, 0x22, 0x60, 0x69, 0x65, 0x1a, - 0x25, 0x74, 0x70, 0x45, 0x17, 0x4b, 0x16, 0x5f, 0xb8, 0x2e, 0x9d, 0xa5, - 0x97, 0x8a, 0x18, 0xb2, 0x86, 0x78, 0xba, 0x2a, 0xbe, 0xfb, 0x77, 0x24, - 0xb2, 0xff, 0x3e, 0xa6, 0xcf, 0x37, 0xef, 0x59, 0x7a, 0x3f, 0xe2, 0xca, - 0x84, 0xc9, 0xc6, 0x5d, 0x8b, 0x6e, 0x44, 0x02, 0x66, 0x8e, 0x6f, 0x9f, - 0xaf, 0xb2, 0xcb, 0xf7, 0x40, 0x2e, 0x12, 0xcb, 0xfc, 0xd1, 0x3f, 0xa4, - 0xe3, 0x59, 0x7e, 0xf0, 0x9b, 0x47, 0x56, 0x5f, 0xf4, 0x77, 0x8f, 0xe8, - 0xd3, 0x7a, 0xcb, 0xff, 0x31, 0xc6, 0x24, 0xd2, 0x82, 0xf9, 0x65, 0x0c, - 0xff, 0x0c, 0xee, 0xfe, 0x07, 0x63, 0x59, 0xfa, 0xcb, 0xed, 0x7e, 0x26, - 0xf5, 0x97, 0x8d, 0xaf, 0x2c, 0xa9, 0x1f, 0x97, 0x4b, 0xb8, 0x4f, 0x5b, - 0x27, 0xca, 0x32, 0x2f, 0x8a, 0x26, 0x33, 0xec, 0x29, 0xbd, 0x09, 0x3b, - 0xfc, 0x5e, 0xce, 0x1b, 0xf5, 0x65, 0xff, 0x7e, 0x7d, 0xcd, 0x3c, 0xdc, - 0x59, 0x7f, 0xfe, 0x89, 0x14, 0x6c, 0x24, 0xdc, 0xee, 0x37, 0xeb, 0xf5, - 0x97, 0xf4, 0xe6, 0x67, 0x9f, 0xcb, 0x2f, 0xee, 0x98, 0xcf, 0x41, 0x59, - 0x60, 0xac, 0xbb, 0xee, 0x61, 0xf6, 0x84, 0xbd, 0xcb, 0x6f, 0x41, 0x8d, - 0x65, 0x42, 0x71, 0x3f, 0x18, 0xb0, 0xe9, 0xe1, 0x93, 0xc3, 0xab, 0xfd, - 0x8d, 0x48, 0xf8, 0x06, 0x2c, 0xbb, 0x7f, 0x16, 0x5f, 0xc0, 0xe4, 0x4c, - 0x0d, 0x2c, 0xbf, 0x66, 0xd9, 0xde, 0x2c, 0xa8, 0x3f, 0x0e, 0x8c, 0x91, - 0x7d, 0xec, 0xd7, 0x16, 0x50, 0x4f, 0x27, 0x79, 0x6d, 0xff, 0x7f, 0x1f, - 0x89, 0xbe, 0x09, 0xbd, 0x65, 0x42, 0x6a, 0x39, 0x0e, 0xd3, 0x24, 0xbf, - 0xff, 0xfb, 0xb1, 0xaf, 0x82, 0x7f, 0x4e, 0x15, 0xe7, 0x73, 0xae, 0x18, - 0x21, 0xac, 0xbe, 0x31, 0x77, 0x31, 0x65, 0xfc, 0x27, 0xa3, 0x62, 0xf9, - 0x65, 0xe2, 0x36, 0x2c, 0xad, 0x1f, 0x87, 0xe4, 0xbe, 0x30, 0xbf, 0xc5, - 0x0e, 0x5e, 0xc2, 0x59, 0x7f, 0xa3, 0xee, 0x6e, 0xc6, 0x85, 0x59, 0x7f, - 0xba, 0xf3, 0x1e, 0xa3, 0x65, 0x97, 0xf6, 0x37, 0xb2, 0x33, 0xcb, 0x2e, - 0xc6, 0x2c, 0xa1, 0xa7, 0xf1, 0x90, 0xe8, 0x61, 0x87, 0x4b, 0xdc, 0xe0, - 0x06, 0x9b, 0xcb, 0xef, 0xcd, 0xe6, 0xc8, 0xe2, 0xcb, 0xf3, 0xef, 0xcd, - 0x71, 0x65, 0x0c, 0xf4, 0xd8, 0x55, 0x7e, 0xeb, 0x91, 0xb1, 0x65, 0xf0, - 0xb3, 0x72, 0x16, 0x5f, 0xdf, 0xfd, 0xfe, 0x6b, 0x16, 0x5f, 0xc1, 0x83, - 0xf1, 0xc9, 0x65, 0xfc, 0xff, 0xb2, 0x33, 0xcb, 0x2a, 0x11, 0x13, 0x86, - 0x06, 0x59, 0x7c, 0x3e, 0xbf, 0xcb, 0x2f, 0xef, 0xf9, 0x1d, 0x8e, 0x2c, - 0xa8, 0x3d, 0x17, 0x23, 0xbf, 0x7d, 0xee, 0x66, 0xcb, 0x2e, 0xcd, 0x96, - 0x53, 0x9e, 0x09, 0x15, 0x54, 0x27, 0xe9, 0x84, 0x46, 0x4d, 0xd8, 0x56, - 0x93, 0xf7, 0x18, 0x6e, 0xfc, 0x2b, 0x2d, 0xc5, 0x97, 0x18, 0xbc, 0x35, - 0x20, 0x18, 0xbd, 0xfb, 0x85, 0x65, 0xf3, 0x53, 0x72, 0x16, 0x5f, 0xdc, - 0x27, 0xda, 0x3c, 0xb2, 0xfd, 0xb3, 0xf3, 0x24, 0xb2, 0xff, 0xf8, 0x79, - 0xbd, 0xf5, 0x30, 0x92, 0x7f, 0x3b, 0x16, 0x54, 0x1f, 0xd9, 0x94, 0x5f, - 0xcf, 0xf7, 0xec, 0x3e, 0x2c, 0xa8, 0x4c, 0xe3, 0xe1, 0xd9, 0x89, 0x35, - 0x0a, 0x8e, 0x90, 0x5f, 0xef, 0x1b, 0x4f, 0x34, 0x31, 0x65, 0xa7, 0xb6, - 0x1b, 0xef, 0xe6, 0xe5, 0x22, 0x27, 0x2c, 0xf6, 0x86, 0xd4, 0x88, 0x46, - 0xcf, 0x92, 0x90, 0xfe, 0x86, 0x41, 0xc6, 0xab, 0x34, 0xe0, 0x96, 0xa3, - 0x06, 0x61, 0x77, 0x63, 0xea, 0x79, 0x47, 0x7f, 0xc7, 0xdc, 0x51, 0xd0, - 0x72, 0x51, 0x5f, 0xa5, 0x58, 0xee, 0x42, 0x08, 0x48, 0xd9, 0x5b, 0xd4, - 0x6f, 0xf4, 0xfc, 0xd0, 0x5d, 0xc2, 0xa8, 0xa7, 0x17, 0xf9, 0x90, 0xcc, - 0x6f, 0x8f, 0x2c, 0xbe, 0xce, 0x09, 0x25, 0x97, 0xfe, 0x3d, 0x3f, 0x3b, - 0x98, 0x41, 0x59, 0x7e, 0x66, 0xb5, 0x9c, 0x59, 0x7f, 0xfe, 0xe8, 0x3d, - 0xa8, 0xf7, 0x30, 0x3c, 0x8d, 0x05, 0x65, 0xff, 0x70, 0xc5, 0xc9, 0x47, - 0xfc, 0x59, 0x7f, 0xff, 0x7b, 0x26, 0x23, 0xe7, 0xa0, 0x43, 0xd4, 0xd1, - 0xd5, 0x97, 0xf3, 0x07, 0x1c, 0x01, 0x2c, 0xbd, 0xee, 0x9a, 0xca, 0x33, - 0xc9, 0x72, 0xdb, 0xf9, 0xfe, 0xe4, 0xee, 0x08, 0xb2, 0xfd, 0xef, 0xa5, - 0x0d, 0x2c, 0xbf, 0x9c, 0x4c, 0xdf, 0x1c, 0x59, 0x58, 0x7b, 0x20, 0x2a, - 0xbf, 0xf1, 0xfd, 0xc2, 0xc1, 0xf5, 0xda, 0x59, 0x7f, 0xfd, 0x9b, 0x67, - 0xde, 0xe1, 0x94, 0x7e, 0xec, 0x59, 0x42, 0xa2, 0x3f, 0x87, 0xf7, 0xfe, - 0xce, 0xc6, 0xb2, 0x7b, 0x4d, 0x34, 0x92, 0xe3, 0x69, 0x65, 0xdb, 0x4f, - 0x85, 0x79, 0x52, 0x35, 0x19, 0x1e, 0x1e, 0x04, 0xa3, 0xe5, 0x63, 0x3a, - 0xec, 0x29, 0x7f, 0x20, 0x28, 0x45, 0xfa, 0x16, 0x1b, 0x84, 0x8d, 0xe8, - 0x77, 0xed, 0x05, 0xdc, 0x2a, 0x8a, 0xf1, 0x7f, 0xff, 0x60, 0xfb, 0x02, - 0x4f, 0xf1, 0x3f, 0xfc, 0xe4, 0x7e, 0x92, 0xd3, 0xf1, 0x12, 0x7b, 0x86, - 0x97, 0xff, 0x4f, 0x79, 0x4f, 0xcd, 0x05, 0xdc, 0x2a, 0x89, 0x1d, 0x78, - 0x38, 0xc5, 0x97, 0x8f, 0xf8, 0x59, 0x78, 0x38, 0xc4, 0x93, 0xcb, 0xcb, - 0xec, 0x7f, 0xbf, 0x59, 0x7c, 0x17, 0x70, 0xaa, 0x24, 0x85, 0x6c, 0x7a, - 0x3a, 0x23, 0xbf, 0xff, 0x1e, 0x8d, 0xbe, 0x0b, 0x68, 0xf1, 0xf5, 0xf6, - 0x59, 0x7e, 0x79, 0x78, 0xf6, 0x59, 0x50, 0x7f, 0xe6, 0xaf, 0x7f, 0xf9, - 0xfd, 0x37, 0x30, 0x63, 0x03, 0xea, 0x4b, 0x2f, 0xff, 0x16, 0x7f, 0xb9, - 0x9a, 0x8d, 0x9f, 0x41, 0x59, 0x74, 0xa7, 0xc2, 0x7b, 0x18, 0xfd, 0xd8, - 0x51, 0x7e, 0x41, 0xe4, 0xbb, 0xf6, 0x76, 0x7e, 0x31, 0x65, 0xa7, 0xc2, - 0xa9, 0x67, 0x94, 0x21, 0xe5, 0xdb, 0xff, 0xa7, 0xbc, 0xa7, 0xe6, 0x82, - 0xee, 0x15, 0x44, 0x94, 0xbf, 0x68, 0x2e, 0xe1, 0x54, 0x5e, 0x2b, 0xfe, - 0x94, 0xfc, 0xd0, 0x5d, 0xc2, 0xa8, 0x93, 0x56, 0x9f, 0x87, 0xf6, 0xe6, - 0x97, 0xee, 0x73, 0x0b, 0x16, 0x5f, 0xf6, 0x83, 0x1b, 0x66, 0x17, 0x96, - 0x5f, 0xd1, 0xc3, 0x64, 0x4c, 0xb2, 0xf9, 0xcf, 0xee, 0x2c, 0xb7, 0x56, - 0x56, 0x22, 0xf8, 0xc9, 0x98, 0x71, 0xd2, 0xd6, 0x88, 0xaf, 0xf1, 0xff, - 0x85, 0x1f, 0x71, 0x65, 0xfe, 0x72, 0x1e, 0x6f, 0x89, 0x2c, 0xbf, 0xe7, - 0xd4, 0xb9, 0x80, 0xd6, 0xcb, 0x28, 0xcf, 0xb4, 0x06, 0x77, 0xfd, 0x9f, - 0x8f, 0xb0, 0x50, 0xd2, 0xcb, 0xef, 0xf9, 0x84, 0xb2, 0xa0, 0xf6, 0xcc, - 0xe6, 0xff, 0xe3, 0x00, 0x79, 0xc7, 0xd7, 0xa0, 0x55, 0x97, 0xd2, 0x04, - 0x7c, 0xb2, 0xff, 0xb6, 0x3e, 0x71, 0xff, 0xe8, 0x16, 0x5f, 0xc7, 0xa1, - 0x94, 0x7c, 0xb2, 0xff, 0xf8, 0x0f, 0xf6, 0x60, 0xa2, 0xbc, 0xb3, 0xef, - 0x2c, 0xbf, 0xe8, 0x97, 0x35, 0xa7, 0x2f, 0x2c, 0xa9, 0x26, 0xf4, 0x32, - 0x09, 0x91, 0x74, 0x47, 0xd3, 0xbe, 0x16, 0xef, 0x52, 0xbf, 0xdd, 0xcf, - 0x7a, 0x0b, 0x65, 0x97, 0x9c, 0x82, 0xb2, 0xf7, 0x60, 0x45, 0x95, 0xe3, - 0x70, 0xd0, 0xdd, 0xfc, 0x4f, 0xf9, 0x3b, 0x16, 0x5f, 0xf8, 0xe1, 0x9d, - 0xc1, 0x8c, 0xfe, 0x59, 0x7c, 0xde, 0x70, 0x2a, 0xcb, 0xd2, 0xf8, 0x55, - 0x97, 0xf3, 0x3d, 0xd0, 0x7b, 0x8b, 0x2f, 0x00, 0x7f, 0x2c, 0xbf, 0xf9, - 0xff, 0x0f, 0x4f, 0x44, 0x7e, 0xe2, 0xcb, 0xfd, 0xbf, 0x25, 0xd8, 0x21, - 0x56, 0x5c, 0x5b, 0x2c, 0xa8, 0x4c, 0x84, 0x64, 0xb8, 0x3e, 0x65, 0xee, - 0x3d, 0xfa, 0x20, 0x86, 0xb6, 0xf2, 0xcb, 0xb5, 0x8b, 0x2f, 0x7e, 0x26, - 0xcb, 0x2b, 0x47, 0x8f, 0xf8, 0x89, 0x0b, 0x5f, 0x3e, 0xb7, 0xf5, 0x65, - 0xff, 0xb4, 0x06, 0x74, 0xe1, 0x8e, 0x4b, 0x2f, 0xfb, 0x90, 0xc2, 0xc9, - 0x41, 0x2c, 0xad, 0x1f, 0x9f, 0x8f, 0x6f, 0x6e, 0x36, 0x5a, 0x59, 0x58, - 0x78, 0xed, 0xe4, 0x57, 0xef, 0x1f, 0x63, 0x7a, 0xcb, 0x8b, 0x65, 0x97, - 0xd1, 0xd0, 0x6e, 0xac, 0xbd, 0xe8, 0xd2, 0xca, 0x84, 0x40, 0xcc, 0x52, - 0xe2, 0xe0, 0x25, 0xb9, 0xc2, 0xb2, 0xfe, 0x08, 0xc1, 0xb0, 0x8c, 0x59, - 0x7f, 0x7d, 0xcc, 0x63, 0xf1, 0x65, 0xf0, 0xf3, 0xb0, 0xb2, 0xfe, 0xcd, - 0xb5, 0x1f, 0x69, 0x65, 0xfe, 0x00, 0xf2, 0x51, 0xff, 0x16, 0x54, 0x23, - 0xe7, 0x05, 0x8c, 0xc5, 0xcb, 0x88, 0x87, 0x85, 0xf7, 0xe9, 0xb9, 0xc3, - 0x62, 0xcb, 0xdc, 0x07, 0xcb, 0x2f, 0xff, 0xb6, 0x69, 0xe5, 0xce, 0x66, - 0x9a, 0x8d, 0x0a, 0xb2, 0xc4, 0xb2, 0xfe, 0x7f, 0x73, 0x6c, 0x69, 0x65, - 0xc2, 0x08, 0xb2, 0xb1, 0x1e, 0x73, 0x14, 0xb8, 0xf7, 0xea, 0x84, 0x20, - 0x21, 0x7d, 0xdb, 0x93, 0xe1, 0x95, 0x19, 0x24, 0x91, 0xc2, 0x83, 0x23, - 0xf6, 0x0b, 0x47, 0xcd, 0x73, 0x11, 0x68, 0xb3, 0xb1, 0xaf, 0xbc, 0x2a, - 0xbf, 0x2f, 0x28, 0x6f, 0x72, 0x14, 0xbe, 0x8c, 0xd4, 0x48, 0xd1, 0x6f, - 0xf0, 0x36, 0x9e, 0xde, 0xde, 0x62, 0xac, 0xa8, 0x76, 0xf7, 0x7b, 0x42, - 0xa6, 0x55, 0xf9, 0x38, 0xe3, 0x95, 0x39, 0xc0, 0xb9, 0xa3, 0x69, 0x61, - 0x6f, 0x65, 0x75, 0x78, 0xfc, 0x10, 0xcf, 0x12, 0x96, 0xe4, 0xdf, 0x18, - 0x6d, 0x44, 0xf9, 0xdf, 0x96, 0xd3, 0x81, 0x52, 0xa4, 0xde, 0x0e, 0x7e, - 0xaf, 0x33, 0x0f, 0xfb, 0x16, 0x93, 0x92, 0x1c, 0x47, 0x18, 0xfd, 0x69, - 0x15, 0x0e, 0xb1, 0x8d, 0xdd, 0x94, 0xa1, 0x35, 0xea, 0xab, 0x6a, 0xf3, - 0xb1, 0x99, 0xa9, 0xd8, 0xc3, 0xb5, 0xa3, 0x33, 0xdf, 0x1b, 0x97, 0xf4, - 0xc9, 0xa6, 0xdc, 0xbe, 0x82, 0xb4, 0xbc, 0xbc, 0xb5, 0x42, 0x7e, 0xc4, - 0xc3, 0x08, 0x2f, 0x53, 0xe7, 0x7d, 0x3f, 0x59, 0xaa, 0x58, 0x26, 0xe4, - 0xed, 0x20, 0x94, 0xc7, 0xb6, 0xfb, 0x70, 0xfb, 0x40, + 0xff, 0xff, 0xff, 0xcc, 0x79, 0x4f, 0xd4, 0x7b, 0xb9, 0xd3, 0xf7, 0x5e, + 0x53, 0xf3, 0xaf, 0xf7, 0xfe, 0x28, 0x67, 0x16, 0x5f, 0xb4, 0x17, 0x70, + 0xaa, 0x22, 0x55, 0xee, 0x9e, 0x96, 0x5a, 0x7e, 0x1e, 0x84, 0xc6, 0x97, + 0x37, 0x62, 0xac, 0xbb, 0xf0, 0x2c, 0xbd, 0x22, 0xdd, 0x59, 0x77, 0xde, + 0x59, 0x7f, 0xfd, 0x1d, 0x89, 0x13, 0x8b, 0xf4, 0xa3, 0x3c, 0xb2, 0xe7, + 0xe2, 0xca, 0x91, 0xfe, 0x8c, 0x60, 0xd3, 0xef, 0xf6, 0x34, 0x51, 0xee, + 0x9a, 0xcb, 0xfe, 0x79, 0x16, 0x6f, 0x2c, 0xe2, 0xcb, 0xff, 0x80, 0xce, + 0x96, 0x7d, 0xe2, 0x7e, 0xac, 0xbf, 0xff, 0x48, 0x9f, 0xce, 0xce, 0x40, + 0xe3, 0xb1, 0x25, 0x95, 0xc4, 0x4b, 0x88, 0x89, 0x76, 0x71, 0x65, 0xe7, + 0x70, 0xaa, 0x22, 0xd5, 0x48, 0xf8, 0xb0, 0x90, 0x22, 0xd7, 0x6b, 0x8b, + 0x28, 0x69, 0xbb, 0x6a, 0x33, 0x1e, 0x17, 0x5d, 0xef, 0x2c, 0xbf, 0xfe, + 0x7e, 0xe1, 0x6b, 0x59, 0xf4, 0xbc, 0x6c, 0x59, 0x52, 0x3e, 0x60, 0x0b, + 0xdc, 0x18, 0x59, 0x7f, 0xe0, 0x38, 0x85, 0x93, 0x6a, 0x1a, 0x59, 0x71, + 0x34, 0xb2, 0xb0, 0xfb, 0x7a, 0x2c, 0xd2, 0x05, 0xff, 0xe9, 0x46, 0x17, + 0x80, 0xe3, 0xe4, 0x0a, 0xb2, 0xe7, 0xde, 0xb2, 0xfa, 0x02, 0xc0, 0x2c, + 0xb0, 0xcc, 0xdd, 0x10, 0xc5, 0xfb, 0xe1, 0xe9, 0xe4, 0xb2, 0xff, 0x03, + 0xf2, 0xcd, 0x84, 0x92, 0xca, 0x83, 0xdf, 0xe9, 0x4d, 0xe2, 0x1c, 0x2c, + 0xb8, 0x63, 0x59, 0x7f, 0x6a, 0x19, 0x84, 0xc5, 0x97, 0xf8, 0x8f, 0x86, + 0x5f, 0x49, 0x65, 0x68, 0xf7, 0x9a, 0x2c, 0xb8, 0xf6, 0x59, 0x7f, 0xde, + 0x06, 0x9f, 0x8f, 0x9d, 0x59, 0x74, 0x6e, 0xac, 0xa1, 0x9f, 0x41, 0x8b, + 0xb0, 0xe2, 0xb1, 0x32, 0xe3, 0x75, 0x78, 0x45, 0xdf, 0xfc, 0x1d, 0x40, + 0xb0, 0x5e, 0x6d, 0x1b, 0x46, 0xe9, 0x65, 0xff, 0x76, 0x35, 0x9d, 0x3f, + 0x89, 0x65, 0xfd, 0xd2, 0x03, 0x8a, 0x15, 0x97, 0xf4, 0x6b, 0x06, 0xf2, + 0x59, 0x43, 0x44, 0x91, 0x9c, 0x08, 0x5d, 0x71, 0x71, 0x65, 0x42, 0x65, + 0x99, 0x0e, 0x62, 0x30, 0xbf, 0xe0, 0x89, 0xe3, 0x93, 0x59, 0xd5, 0x97, + 0xff, 0xef, 0x47, 0xb9, 0x93, 0x14, 0x33, 0x5a, 0x8f, 0x96, 0x5f, 0xfa, + 0x3b, 0xd8, 0x97, 0x85, 0x3d, 0x2c, 0xb6, 0xea, 0xcb, 0xed, 0x73, 0x1a, + 0x59, 0x7c, 0x51, 0xf0, 0x90, 0x6d, 0xf0, 0x52, 0xb6, 0x45, 0x69, 0x3b, + 0x5f, 0xe0, 0x9f, 0x35, 0xa8, 0x92, 0xcb, 0xff, 0xf6, 0x7f, 0xc3, 0xf9, + 0xac, 0x0c, 0x10, 0x1e, 0x4b, 0x2f, 0xfe, 0x8c, 0x2f, 0x73, 0xd9, 0x8d, + 0x71, 0x65, 0x42, 0xa2, 0xdc, 0x3b, 0x38, 0xc0, 0xfa, 0x46, 0x46, 0x7e, + 0x56, 0xbc, 0x2e, 0x37, 0xac, 0xb9, 0xbd, 0xbd, 0x65, 0xd9, 0xf2, 0x4b, + 0x42, 0x4b, 0x7f, 0xa3, 0x4f, 0xf8, 0xbd, 0xfe, 0xf6, 0x6b, 0xf6, 0x1f, + 0x12, 0x4f, 0x35, 0x37, 0xf4, 0xba, 0x7b, 0xf2, 0x65, 0x95, 0x07, 0xec, + 0xe8, 0xd7, 0xf7, 0x4c, 0x30, 0xc3, 0x59, 0x7f, 0xa3, 0xfd, 0x9e, 0x51, + 0xba, 0xb2, 0xc5, 0x07, 0xc6, 0x45, 0x96, 0x9e, 0xdd, 0xb3, 0x0e, 0x1b, + 0xa1, 0xd6, 0xe0, 0x31, 0x10, 0x9c, 0xd8, 0xbb, 0x23, 0xa8, 0x16, 0x13, + 0xa1, 0x84, 0x7f, 0xc5, 0xe7, 0x08, 0x39, 0xa1, 0x09, 0xa2, 0x1e, 0xc6, + 0x92, 0x51, 0xaf, 0xf2, 0x53, 0x00, 0x16, 0xda, 0x20, 0xdc, 0x87, 0x18, + 0x90, 0x83, 0xbf, 0xff, 0xf9, 0xd9, 0x3c, 0xf5, 0xa0, 0x6b, 0x50, 0x58, + 0x29, 0xf7, 0xb8, 0x22, 0xcb, 0xff, 0xcd, 0xa0, 0xad, 0x6e, 0xec, 0x36, + 0xcc, 0xe9, 0xdd, 0xdc, 0x59, 0x7c, 0x17, 0x70, 0xaa, 0x2a, 0x25, 0xf9, + 0xca, 0x46, 0xc5, 0x95, 0xa3, 0xd4, 0x61, 0x75, 0xf7, 0x73, 0x58, 0xb2, + 0xf1, 0xcc, 0xde, 0xb2, 0xa0, 0xf0, 0x7a, 0x43, 0x7e, 0x0b, 0xf6, 0x3a, + 0xb2, 0xff, 0xfe, 0x01, 0x38, 0xb3, 0xbc, 0x2c, 0x14, 0xb3, 0xa6, 0xc5, + 0x97, 0x00, 0x45, 0x97, 0xc3, 0x1c, 0x31, 0x65, 0xff, 0xf4, 0xb6, 0x6d, + 0x21, 0xb9, 0xd8, 0x3a, 0x9d, 0x3b, 0xbb, 0x8b, 0x2a, 0x11, 0x3e, 0x63, + 0x1f, 0x91, 0x5f, 0xff, 0xc0, 0x27, 0x16, 0x77, 0x85, 0x82, 0x96, 0x74, + 0xd8, 0xb2, 0xfb, 0x5a, 0xcd, 0xc5, 0x94, 0xc4, 0x41, 0x3a, 0xed, 0xff, + 0xf9, 0xe4, 0x51, 0xcc, 0xf8, 0x24, 0xf9, 0xf0, 0x56, 0x5a, 0x7c, 0x95, + 0xc2, 0xe4, 0x2d, 0xc2, 0xc6, 0x64, 0x2c, 0x27, 0xec, 0x3f, 0x39, 0x0b, + 0x1d, 0xe4, 0x57, 0xfd, 0x8c, 0x9f, 0xb9, 0x84, 0x7e, 0x59, 0x7f, 0xe8, + 0x9f, 0xd3, 0x79, 0x78, 0xf6, 0x59, 0x43, 0x3f, 0xce, 0x1e, 0x5e, 0xc6, + 0xb1, 0x65, 0xe0, 0x46, 0xcb, 0x2f, 0xe7, 0x97, 0xdc, 0x8d, 0x96, 0x5f, + 0xf3, 0xfc, 0x59, 0xbf, 0x47, 0xc5, 0x97, 0xe3, 0x89, 0x3c, 0x96, 0x50, + 0xd1, 0x1e, 0xc2, 0xfe, 0x9d, 0x5f, 0xd9, 0xb0, 0xe3, 0x06, 0xb2, 0xf8, + 0x7d, 0x39, 0x96, 0x56, 0x1e, 0x83, 0x96, 0xdf, 0x89, 0xdb, 0xf3, 0x65, + 0x97, 0x9a, 0x7e, 0xac, 0xba, 0x06, 0xb2, 0xa0, 0xd9, 0xf4, 0x76, 0xff, + 0x9c, 0xbd, 0xcd, 0x64, 0x31, 0x65, 0xf8, 0xc8, 0x81, 0xba, 0xb2, 0xff, + 0xb9, 0x83, 0xcd, 0x4a, 0x34, 0xb2, 0xa0, 0xf8, 0x74, 0x53, 0x6d, 0x96, + 0x54, 0x1b, 0x3c, 0x21, 0xbf, 0x14, 0x7f, 0xfc, 0x2c, 0xb9, 0xc0, 0xb2, + 0xc4, 0xb2, 0xfd, 0xb6, 0x9d, 0xfc, 0xb2, 0x8c, 0xdc, 0x38, 0x85, 0xf7, + 0x4f, 0xb3, 0xdb, 0x0a, 0xd9, 0x06, 0x39, 0x90, 0xac, 0x16, 0x10, 0x01, + 0x20, 0x99, 0x75, 0x84, 0x1d, 0x86, 0x5f, 0x87, 0xda, 0x28, 0xdc, 0x4e, + 0xbf, 0x68, 0x2e, 0xe1, 0x54, 0x57, 0xab, 0xf1, 0xb7, 0x84, 0x1b, 0x2c, + 0xba, 0x24, 0xb2, 0xe8, 0xfd, 0x65, 0xfd, 0xb0, 0x9b, 0x8e, 0x5f, 0xac, + 0xbf, 0xf3, 0x97, 0xf9, 0xe8, 0x23, 0xfd, 0x65, 0x41, 0xf8, 0x6e, 0x19, + 0xda, 0x7e, 0x26, 0x43, 0xa3, 0x47, 0x2c, 0xfc, 0x58, 0x48, 0x43, 0xdf, + 0xfd, 0x3d, 0xe5, 0x3f, 0x34, 0x17, 0x70, 0xaa, 0x24, 0x65, 0xff, 0xe9, + 0xec, 0x79, 0x4f, 0xcd, 0x05, 0xdc, 0x2a, 0x89, 0xe1, 0x7f, 0xfa, 0x7b, + 0x1e, 0x53, 0xf3, 0x41, 0x77, 0x0a, 0xa2, 0x7f, 0x5f, 0xfe, 0x9e, 0xc7, + 0x94, 0xfc, 0xd0, 0x5d, 0xc2, 0xa8, 0xa1, 0x97, 0xff, 0x31, 0xe5, 0x3f, + 0x34, 0x17, 0x70, 0xaa, 0x28, 0x85, 0xff, 0xa5, 0x3c, 0x1c, 0x9d, 0x1c, + 0x89, 0x2c, 0xa9, 0xe8, 0x95, 0x85, 0x2b, 0xff, 0x4c, 0x7d, 0xfb, 0x3c, + 0x3c, 0x62, 0xcb, 0xf8, 0xfc, 0x7a, 0x7f, 0xd6, 0x5f, 0x67, 0xb3, 0xf5, + 0x97, 0xe2, 0x03, 0xcb, 0x8b, 0x2f, 0x13, 0xcf, 0x91, 0xfb, 0x11, 0x6f, + 0x88, 0xaf, 0xda, 0x0b, 0xb8, 0x55, 0x14, 0x8a, 0xff, 0xee, 0xef, 0x7d, + 0x71, 0xfb, 0xc8, 0xd9, 0x65, 0xff, 0xcf, 0xf7, 0x3a, 0xd4, 0x7f, 0x38, + 0x46, 0x2c, 0xbf, 0xe8, 0x94, 0x6b, 0x68, 0xd6, 0xcb, 0x2f, 0x3c, 0xa7, + 0xe2, 0x60, 0x0e, 0x69, 0xfa, 0x39, 0x25, 0xdf, 0xff, 0xdb, 0xe7, 0x88, + 0x1c, 0xf4, 0x17, 0xb8, 0xe4, 0x0c, 0x59, 0x7f, 0xfa, 0x53, 0xf4, 0xff, + 0xbf, 0x8f, 0x58, 0xc5, 0x97, 0xfc, 0x61, 0x86, 0x73, 0xd1, 0x25, 0x97, + 0xf0, 0x35, 0xfc, 0xe1, 0xcc, 0xb2, 0xef, 0xe7, 0xc8, 0xfa, 0xf8, 0x71, + 0x7f, 0x4b, 0x3b, 0xd7, 0x92, 0xcb, 0xff, 0xfb, 0x07, 0xd8, 0x12, 0x7f, + 0x89, 0xff, 0xe7, 0x23, 0xf4, 0x96, 0x9f, 0x0b, 0x82, 0xe1, 0x85, 0xb3, + 0x23, 0x40, 0xea, 0x7b, 0xaf, 0x7f, 0x0b, 0x7f, 0x18, 0xee, 0x16, 0xdf, + 0xff, 0x76, 0x3a, 0x62, 0xf3, 0x98, 0x5f, 0xee, 0x62, 0xcb, 0xe0, 0xbb, + 0x85, 0x51, 0x28, 0x2f, 0xfd, 0x1f, 0xb1, 0xe5, 0xd8, 0x7d, 0x2c, 0xa9, + 0x22, 0xff, 0x4a, 0x64, 0x5d, 0x7f, 0xf8, 0x9f, 0xdc, 0x10, 0x81, 0x22, + 0xc6, 0x2c, 0xbe, 0xe3, 0x8f, 0x16, 0x5f, 0xfe, 0x7d, 0x8f, 0x5a, 0x3f, + 0xa5, 0xe7, 0xf9, 0x65, 0xf4, 0xf7, 0x94, 0xfc, 0x47, 0x2b, 0x0b, 0xf8, + 0x93, 0xb8, 0x43, 0x5b, 0x3a, 0x14, 0x69, 0x53, 0x18, 0x87, 0x1a, 0xe8, + 0x65, 0xfc, 0x9c, 0x60, 0xdb, 0xb2, 0xe1, 0xb5, 0x1f, 0x63, 0x16, 0x3a, + 0xa9, 0xfa, 0xd3, 0x6d, 0x6b, 0x90, 0xef, 0x04, 0xe1, 0xdb, 0x7c, 0xa3, + 0x2b, 0xff, 0xd3, 0xd8, 0xf2, 0x9f, 0x9a, 0x0b, 0xb8, 0x55, 0x13, 0x9a, + 0xff, 0xf4, 0xf6, 0x3c, 0xa7, 0xe6, 0x82, 0xee, 0x15, 0x45, 0x12, 0xbf, + 0xe0, 0x3e, 0xa4, 0xdc, 0x77, 0xfe, 0x6b, 0x2f, 0x1f, 0xdc, 0x59, 0x78, + 0xa1, 0x8b, 0x2f, 0xf8, 0x9f, 0xef, 0x3f, 0xa4, 0xeb, 0x2b, 0x63, 0xf0, + 0x31, 0xdf, 0xc6, 0xef, 0xe3, 0xe4, 0xd2, 0x3f, 0xd6, 0x5f, 0xd8, 0x31, + 0x06, 0xec, 0x59, 0x7f, 0xa3, 0x61, 0x37, 0x1c, 0xbf, 0x59, 0x74, 0xa7, + 0x8d, 0x37, 0x7c, 0x85, 0x97, 0x4c, 0x37, 0x97, 0x88, 0x5d, 0x7f, 0xfa, + 0x7f, 0x0b, 0x3f, 0x8f, 0xf5, 0xa8, 0x69, 0x65, 0x69, 0x15, 0xdf, 0xb0, + 0x56, 0x95, 0x7e, 0xf1, 0x68, 0x12, 0x9f, 0xef, 0xda, 0x0b, 0xb8, 0x55, + 0x10, 0xe2, 0xfe, 0x00, 0x74, 0x70, 0x4b, 0x2f, 0xc6, 0x5e, 0x86, 0x2c, + 0xb4, 0xfc, 0x44, 0x37, 0x4d, 0x37, 0x0b, 0x2f, 0xfc, 0x63, 0xc6, 0x16, + 0x7d, 0xe7, 0x59, 0x7f, 0xd1, 0xac, 0x0f, 0x63, 0xe9, 0x2c, 0xa5, 0x97, + 0xff, 0x13, 0x8a, 0x1e, 0x9e, 0xb5, 0x0d, 0x2c, 0xb8, 0x89, 0x65, 0xf0, + 0x5d, 0xc2, 0xa8, 0x8b, 0xd7, 0xfb, 0x3e, 0xff, 0x8e, 0x7b, 0x2c, 0xbf, + 0x13, 0xfe, 0xfc, 0x59, 0x7e, 0xc9, 0xa4, 0xfc, 0x59, 0x53, 0x23, 0x1f, + 0x42, 0xa4, 0x5d, 0xe3, 0x51, 0x09, 0xef, 0xec, 0x1f, 0x73, 0xf7, 0x59, + 0x7d, 0x00, 0x6d, 0xf1, 0x65, 0x70, 0xf4, 0xda, 0x2d, 0xb8, 0x4e, 0x2c, + 0xb4, 0x96, 0x54, 0x1a, 0x97, 0x18, 0xb8, 0xb6, 0x59, 0x7f, 0xde, 0x28, + 0x60, 0x83, 0xec, 0x2c, 0xbf, 0x3c, 0x99, 0x12, 0x59, 0x50, 0x7e, 0xe6, + 0x2f, 0xd3, 0x9b, 0xe9, 0xa4, 0xf2, 0x59, 0x77, 0x3e, 0x59, 0x7d, 0xe9, + 0x40, 0xa9, 0x2f, 0xb0, 0x7e, 0xe2, 0xca, 0xc4, 0x40, 0x30, 0x8d, 0xc6, + 0x08, 0x8e, 0xff, 0x16, 0x7d, 0x2e, 0x18, 0xab, 0x2f, 0xcf, 0xf0, 0x1f, + 0xcb, 0x2e, 0xdc, 0x25, 0x97, 0xe7, 0xdb, 0xd9, 0xd5, 0x96, 0x9f, 0x0b, + 0x92, 0x3b, 0x1e, 0xc8, 0xe4, 0x61, 0x79, 0x18, 0x64, 0xd0, 0x9e, 0x62, + 0x67, 0x61, 0x2c, 0x50, 0xad, 0xe1, 0xd0, 0x0d, 0x37, 0x94, 0x6e, 0x0c, + 0xdf, 0xff, 0xff, 0x13, 0xcf, 0xc0, 0x36, 0xcc, 0x53, 0xf7, 0x70, 0xe5, + 0xc9, 0xd8, 0x2c, 0x49, 0x65, 0xfb, 0x38, 0xc1, 0xc2, 0xcb, 0xff, 0x3c, + 0xa7, 0xe6, 0x82, 0xee, 0x15, 0x44, 0xc8, 0xb4, 0xf0, 0xa3, 0xdf, 0x50, + 0x84, 0x61, 0x3d, 0xef, 0x63, 0x16, 0x5d, 0xd6, 0x2c, 0xbf, 0x68, 0x2e, + 0xe1, 0x54, 0x5b, 0xcb, 0x4f, 0x83, 0xe7, 0x18, 0xe6, 0x0b, 0xdf, 0xfe, + 0x9e, 0xc7, 0x94, 0xfc, 0xd0, 0x5d, 0xc2, 0xa8, 0xa4, 0xd7, 0x37, 0x6d, + 0xca, 0xcb, 0xff, 0x70, 0x0f, 0xf6, 0xb4, 0x09, 0xb8, 0xb2, 0xe6, 0x7c, + 0xb2, 0xfe, 0xcf, 0x14, 0x43, 0x16, 0x5f, 0xdf, 0x7e, 0x26, 0x9f, 0xf5, + 0x97, 0x76, 0x7b, 0x61, 0x1b, 0x18, 0x42, 0xc4, 0x2e, 0x8c, 0x39, 0x5d, + 0x43, 0x23, 0xf6, 0x53, 0x99, 0x79, 0x1e, 0x6f, 0x21, 0x49, 0xbc, 0xd4, + 0x48, 0xcc, 0xaf, 0xf4, 0xfc, 0xd0, 0x5d, 0xc2, 0xa8, 0x87, 0x57, 0xed, + 0x05, 0xdc, 0x2a, 0x89, 0x61, 0x7d, 0x9f, 0xb0, 0xd6, 0x5f, 0xa7, 0xb1, + 0xe5, 0x3f, 0x0f, 0x5b, 0x70, 0xd2, 0xff, 0x4f, 0xcd, 0x05, 0xdc, 0x2a, + 0x88, 0xc1, 0x7f, 0xa7, 0x82, 0x59, 0xc7, 0xe2, 0xcb, 0xff, 0xf3, 0xff, + 0xb9, 0x93, 0xc9, 0xfd, 0x2c, 0xf6, 0x0d, 0x65, 0xff, 0xf8, 0xd8, 0x7a, + 0x9f, 0xed, 0xcc, 0xef, 0xa3, 0xe6, 0x96, 0x51, 0x23, 0xab, 0x86, 0xbe, + 0x59, 0xbe, 0x9f, 0x2c, 0xe2, 0xcb, 0xff, 0xfe, 0x97, 0x27, 0x87, 0xaf, + 0x30, 0x7b, 0x9a, 0x6e, 0xbb, 0x33, 0x38, 0xb2, 0xfd, 0x9e, 0xfe, 0x02, + 0xb2, 0xff, 0xf4, 0x78, 0xff, 0x89, 0x0f, 0xb0, 0x41, 0x59, 0x7e, 0xd0, + 0x5d, 0xc2, 0xa8, 0x8f, 0x57, 0xdc, 0x7f, 0xb7, 0xac, 0xba, 0x53, 0xf0, + 0xf6, 0x7c, 0x69, 0x7f, 0xff, 0x3c, 0xf2, 0x06, 0x77, 0x0b, 0xfc, 0x2f, + 0x77, 0x16, 0x5a, 0x7f, 0xc9, 0xe2, 0xcc, 0xe5, 0xa2, 0x87, 0x85, 0x11, + 0x17, 0xdf, 0xb4, 0x17, 0x70, 0xaa, 0x2c, 0x35, 0xfe, 0x91, 0x46, 0x73, + 0x09, 0x65, 0xc7, 0x25, 0x96, 0x9f, 0x87, 0xf5, 0xf1, 0xa7, 0xe6, 0x17, + 0xa0, 0xb6, 0x59, 0x7e, 0x28, 0xfe, 0x4c, 0x59, 0x5d, 0x3c, 0x4f, 0x0e, + 0x5f, 0xff, 0xf4, 0x47, 0x27, 0xf8, 0x66, 0xcf, 0xa5, 0xcf, 0xa5, 0x9a, + 0xd9, 0x65, 0xd1, 0xa9, 0xe8, 0x8e, 0x22, 0x2b, 0xfd, 0x3f, 0x34, 0x17, + 0x70, 0xaa, 0x2e, 0x75, 0xff, 0xff, 0xff, 0xd0, 0xda, 0xb2, 0xd8, 0x3d, + 0x9d, 0x3b, 0xbb, 0x93, 0xf6, 0x00, 0xad, 0xc2, 0x1b, 0x1f, 0x6d, 0xb0, + 0x59, 0x3a, 0x77, 0x77, 0x16, 0x54, 0x2f, 0x9b, 0xed, 0x09, 0x79, 0x22, + 0xe4, 0x65, 0x61, 0x2f, 0x38, 0xfa, 0x59, 0x0d, 0x2e, 0xc6, 0x15, 0xe2, + 0xf6, 0xf4, 0x1b, 0xfd, 0x3f, 0x34, 0x17, 0x70, 0xaa, 0x21, 0xe5, 0xff, + 0xdb, 0xf4, 0x7c, 0x81, 0xb9, 0x1b, 0x16, 0x5f, 0x05, 0xdc, 0x2a, 0x88, + 0x99, 0x7f, 0xff, 0xb4, 0x59, 0xb6, 0x0f, 0x1a, 0x06, 0xb0, 0x3d, 0x8d, + 0xeb, 0x2f, 0x80, 0xcc, 0x1a, 0xcb, 0x64, 0x22, 0x15, 0xbd, 0x8e, 0xc0, + 0x59, 0x7f, 0xbc, 0x07, 0xfb, 0xb1, 0xbd, 0x65, 0x69, 0x32, 0x42, 0x85, + 0x9f, 0x0a, 0xbc, 0x23, 0x7f, 0xce, 0xe5, 0xfe, 0x8e, 0x05, 0x59, 0x78, + 0x81, 0xb2, 0xcb, 0xf7, 0xfc, 0x9d, 0x83, 0x59, 0x7f, 0x8d, 0xac, 0x2c, + 0xfb, 0xcb, 0x28, 0xcf, 0x7b, 0x45, 0x77, 0xff, 0xe8, 0xd7, 0xfd, 0x8d, + 0xf3, 0x44, 0x33, 0x98, 0x35, 0x97, 0xfd, 0xde, 0xc6, 0xf9, 0x66, 0xa1, + 0x65, 0xbd, 0xd4, 0x49, 0x3a, 0xc5, 0xff, 0x1f, 0x8f, 0xd9, 0xfc, 0x69, + 0x65, 0xf6, 0xdd, 0x06, 0xcb, 0x2b, 0x11, 0x0a, 0xe5, 0x00, 0x38, 0xbf, + 0x3e, 0xcc, 0x8d, 0x2c, 0xb8, 0x7d, 0x59, 0x7f, 0xfb, 0xd2, 0xcd, 0x69, + 0xe5, 0x8c, 0x80, 0xac, 0xac, 0x3e, 0x07, 0x17, 0xbf, 0xe8, 0x96, 0x19, + 0x64, 0x0a, 0xb2, 0xff, 0xfd, 0xd8, 0xd7, 0xfc, 0xc1, 0xf8, 0x0e, 0x1c, + 0xd2, 0xca, 0x99, 0x11, 0x9e, 0x36, 0xbb, 0xcc, 0x59, 0x7f, 0xe1, 0x36, + 0xe4, 0x1f, 0xde, 0x86, 0x2c, 0xbf, 0xfb, 0x8e, 0xe1, 0xc0, 0xc1, 0x40, + 0x56, 0x5b, 0x3a, 0x88, 0x2e, 0x20, 0xde, 0x8d, 0x71, 0x65, 0xff, 0x44, + 0x84, 0xcd, 0x73, 0x1a, 0x59, 0x7f, 0xa5, 0x02, 0x9f, 0x5f, 0x65, 0x95, + 0xb1, 0xf7, 0x19, 0xd5, 0x62, 0x72, 0x3f, 0x12, 0x76, 0x13, 0x3f, 0x94, + 0x02, 0x11, 0x57, 0xfc, 0x3c, 0xdf, 0xa7, 0xdf, 0xd3, 0x59, 0x7e, 0x68, + 0x11, 0xad, 0x96, 0x58, 0xe7, 0x1f, 0x33, 0x47, 0x97, 0xd2, 0xe8, 0x9c, + 0x59, 0x73, 0x88, 0xa8, 0x85, 0xd6, 0xf7, 0xc7, 0x90, 0x02, 0x4b, 0xf7, + 0x73, 0x60, 0x12, 0xcb, 0xe7, 0xd4, 0x6f, 0x59, 0x43, 0x3c, 0xbf, 0xca, + 0x2f, 0xd3, 0x4b, 0x1c, 0x96, 0x5f, 0x11, 0x00, 0x55, 0x96, 0x9f, 0x0c, + 0x89, 0x6c, 0x8d, 0xa0, 0x54, 0x23, 0x38, 0xd3, 0xdf, 0x63, 0x38, 0x72, + 0xe2, 0x84, 0x47, 0x25, 0x1e, 0xfa, 0x17, 0x80, 0x72, 0xde, 0xe9, 0xb8, + 0x46, 0x21, 0x3d, 0xff, 0xb4, 0x0d, 0xb3, 0xb3, 0x14, 0x0d, 0x65, 0xf0, + 0xc4, 0x82, 0x59, 0x7f, 0xff, 0x1f, 0x81, 0xa7, 0xe6, 0x17, 0x73, 0x0a, + 0x5c, 0x59, 0x50, 0x7f, 0x4e, 0x45, 0x7e, 0x06, 0xbf, 0x9d, 0x0b, 0x2e, + 0xeb, 0xac, 0xb8, 0xc5, 0x59, 0x60, 0x2c, 0xac, 0x37, 0xd3, 0x0b, 0x70, + 0x5e, 0xef, 0x79, 0x65, 0xef, 0xf9, 0x3e, 0x13, 0x88, 0xec, 0x2e, 0xb8, + 0x41, 0xe6, 0x91, 0x0b, 0xaf, 0xff, 0xb0, 0xe5, 0xc9, 0xf9, 0xf4, 0x9f, + 0x61, 0x02, 0xb2, 0xa1, 0x17, 0x3d, 0x65, 0xbf, 0xe6, 0xed, 0xb1, 0xac, + 0xf1, 0xf4, 0x0b, 0x2f, 0xb8, 0x7b, 0x36, 0x16, 0x5f, 0x80, 0x44, 0x72, + 0x59, 0x4d, 0xda, 0x23, 0xdb, 0xa4, 0x2e, 0x13, 0xdf, 0xf9, 0xbb, 0x6c, + 0x1e, 0xd1, 0x38, 0x3c, 0xc5, 0x97, 0x36, 0x84, 0xb2, 0xf7, 0x73, 0x4b, + 0x29, 0xbb, 0x44, 0x0b, 0x74, 0x95, 0xd1, 0xbb, 0xf6, 0x78, 0xf5, 0x8b, + 0x2f, 0xfb, 0x3c, 0x26, 0xcf, 0xa3, 0x99, 0x65, 0xfd, 0x26, 0xd3, 0x66, + 0xc3, 0x70, 0x6e, 0x2b, 0x2f, 0xf6, 0x73, 0x98, 0x64, 0x15, 0x94, 0xdd, + 0x23, 0x5d, 0xb0, 0x4c, 0xdc, 0x9d, 0x92, 0x2d, 0xfc, 0xdd, 0x89, 0xde, + 0xe6, 0xcb, 0x2d, 0xd5, 0x94, 0xdd, 0x9e, 0x30, 0x0d, 0x6f, 0x87, 0x85, + 0x32, 0xcb, 0x8f, 0xcb, 0x2d, 0xe3, 0x37, 0x1d, 0x22, 0xbf, 0xdf, 0x7b, + 0xe9, 0x00, 0x85, 0x59, 0x7f, 0xe8, 0x98, 0xb3, 0x7b, 0xb1, 0x86, 0xb2, + 0x9c, 0xfd, 0x80, 0x6f, 0x7f, 0xff, 0xf7, 0x40, 0x33, 0xcd, 0x4c, 0x59, + 0xbf, 0xb8, 0x38, 0xe7, 0x20, 0x55, 0x97, 0xff, 0x8e, 0x69, 0x67, 0xd2, + 0x9c, 0xc7, 0x72, 0x59, 0x73, 0xb7, 0xac, 0xbf, 0xff, 0xdc, 0xcf, 0x4e, + 0xee, 0x06, 0x1a, 0x2c, 0x1f, 0x4e, 0x65, 0x96, 0x6c, 0x62, 0x7f, 0x22, + 0xc2, 0x70, 0x24, 0x3d, 0x74, 0x74, 0xcf, 0x0c, 0xdd, 0xb8, 0x2a, 0xcb, + 0xe7, 0x94, 0x7e, 0xb2, 0xfd, 0xd7, 0xf3, 0xc9, 0x65, 0xfc, 0x7a, 0x2c, + 0xcd, 0x2c, 0xbc, 0x1d, 0xba, 0xb2, 0xfd, 0x1c, 0x6d, 0x6d, 0xdb, 0x76, + 0xb2, 0xe6, 0x31, 0x65, 0x70, 0xf3, 0xc0, 0x71, 0x7e, 0x8e, 0x03, 0xa6, + 0xb2, 0xa7, 0x22, 0xda, 0x4d, 0xbc, 0x22, 0xbf, 0xee, 0x16, 0x7d, 0x22, + 0x7d, 0x96, 0x5f, 0xb8, 0x07, 0x2f, 0xd6, 0x59, 0x93, 0x8f, 0x87, 0xc7, + 0x37, 0xb8, 0x7f, 0xac, 0xac, 0x3c, 0x73, 0x2a, 0xbc, 0xd3, 0x4d, 0x24, + 0xbf, 0x39, 0x7b, 0xb8, 0x92, 0x79, 0xa0, 0xbf, 0xff, 0xfa, 0x36, 0x9d, + 0xc0, 0x47, 0xde, 0xee, 0x33, 0x3c, 0x51, 0xff, 0xf0, 0xb2, 0xfb, 0xd3, + 0x67, 0x96, 0x58, 0x6b, 0x28, 0x68, 0xaa, 0x77, 0x60, 0x11, 0xd0, 0xd3, + 0x51, 0xfd, 0x00, 0xa1, 0xc5, 0x7e, 0xe9, 0x37, 0x1d, 0xc6, 0xf5, 0x97, + 0x3b, 0xac, 0xb7, 0x4c, 0xf2, 0x5c, 0xd2, 0xff, 0xfe, 0xff, 0x51, 0x3b, + 0x51, 0xef, 0xa5, 0x02, 0xe9, 0xda, 0x59, 0x7f, 0xe3, 0x9a, 0x77, 0x60, + 0xf4, 0x0d, 0xd5, 0x95, 0x08, 0xa5, 0xfd, 0x86, 0xfe, 0xd1, 0xb7, 0xeb, + 0x9c, 0x59, 0x7f, 0x10, 0x3c, 0x7b, 0x42, 0xcb, 0xff, 0x18, 0xb0, 0x51, + 0xc8, 0x36, 0x2c, 0xbf, 0x6f, 0x04, 0xb3, 0x8b, 0x2f, 0xbf, 0x32, 0x02, + 0xca, 0xc3, 0xcc, 0x01, 0x55, 0xf6, 0x0f, 0x36, 0x59, 0x7d, 0xbb, 0x3a, + 0x1b, 0xa5, 0x97, 0x6a, 0x16, 0x50, 0xd7, 0x8b, 0x70, 0x88, 0x24, 0xff, + 0x43, 0x84, 0xe5, 0x15, 0xee, 0xbf, 0xcd, 0x0c, 0xbd, 0x11, 0xb0, 0xc7, + 0xa5, 0xa5, 0x08, 0x8f, 0x10, 0xef, 0x22, 0x6f, 0x2c, 0xbc, 0x59, 0xe5, + 0x97, 0xff, 0xbe, 0x97, 0x39, 0x07, 0xf7, 0xbd, 0x0c, 0x59, 0x44, 0x7c, + 0xed, 0x0d, 0xdf, 0xfc, 0x5e, 0x2c, 0xde, 0xe6, 0x1c, 0x25, 0x97, 0xd1, + 0x83, 0x35, 0x94, 0x67, 0xc4, 0xd2, 0x15, 0xe0, 0x7b, 0x8b, 0x2f, 0xfa, + 0x24, 0xd3, 0xeb, 0xd1, 0x8b, 0x2f, 0xff, 0xff, 0xfb, 0x93, 0xbb, 0x9b, + 0x43, 0x5f, 0x4b, 0x93, 0x80, 0x1d, 0x6a, 0x27, 0x4c, 0x2f, 0xd3, 0xa7, + 0x77, 0x71, 0x65, 0xfd, 0xf4, 0xe9, 0xb3, 0x02, 0xb2, 0xa1, 0x3d, 0x7c, + 0x84, 0x20, 0x48, 0x88, 0x77, 0xc7, 0x00, 0x85, 0x5d, 0xfd, 0x29, 0x32, + 0x68, 0x6f, 0x59, 0x6f, 0xd6, 0x51, 0x1e, 0x20, 0x0c, 0xaf, 0x16, 0xe4, + 0x2c, 0xbb, 0x71, 0xbb, 0x59, 0x7f, 0x9f, 0xef, 0xf4, 0x7f, 0x7e, 0xb2, + 0xff, 0xc0, 0x64, 0x67, 0x0b, 0x37, 0xba, 0xca, 0xe9, 0xfa, 0xf0, 0xde, + 0xf4, 0xe9, 0x05, 0x65, 0x42, 0x62, 0x98, 0x42, 0x28, 0xf1, 0xc2, 0x51, + 0x84, 0x57, 0xff, 0xf6, 0xa7, 0x16, 0x6f, 0xcd, 0x4a, 0x74, 0x0d, 0xe6, + 0xe2, 0xcb, 0xff, 0xb1, 0xa6, 0xf6, 0x00, 0xd9, 0x85, 0xfa, 0xcb, 0xff, + 0xff, 0x7d, 0x02, 0x96, 0x0f, 0xa7, 0x34, 0xee, 0x67, 0xd2, 0xd6, 0x34, + 0xb2, 0x8d, 0x17, 0x44, 0x91, 0x58, 0x99, 0xe1, 0x46, 0x37, 0x7d, 0xe0, + 0x46, 0xcb, 0x2f, 0xe9, 0x3e, 0xb8, 0x63, 0x59, 0x7f, 0x67, 0x71, 0x90, + 0x15, 0x95, 0x07, 0xb3, 0x22, 0xdb, 0xf1, 0xe8, 0xf7, 0xe2, 0xca, 0x34, + 0x62, 0xf9, 0xf1, 0xbc, 0x86, 0xfb, 0x73, 0x35, 0x0b, 0x2f, 0xff, 0xef, + 0xa5, 0xc6, 0x61, 0x4e, 0x6f, 0x3e, 0xec, 0x79, 0xa5, 0x96, 0xdd, 0x59, + 0x58, 0x7e, 0xa1, 0x61, 0xbf, 0xff, 0xf3, 0x53, 0x8b, 0x03, 0xd3, 0x2c, + 0x07, 0xde, 0x9c, 0xed, 0x60, 0xab, 0x2f, 0xf0, 0xa3, 0x04, 0x74, 0xa1, + 0x65, 0xfd, 0x2e, 0x0a, 0x08, 0xf9, 0x65, 0xf6, 0x0d, 0xe4, 0xb2, 0xbe, + 0x3d, 0x16, 0x8c, 0x2f, 0xb5, 0x11, 0xb2, 0xcb, 0xe9, 0xa3, 0xce, 0xb2, + 0xe7, 0x6b, 0x87, 0x88, 0x02, 0x2b, 0xdb, 0xfc, 0x22, 0xca, 0x84, 0xeb, + 0x31, 0xc8, 0xe1, 0x08, 0x4d, 0x0d, 0x17, 0x5f, 0xff, 0x8b, 0x07, 0xd0, + 0x35, 0xc3, 0xf7, 0x4d, 0xff, 0x59, 0x7f, 0x8b, 0x37, 0xce, 0x93, 0x24, + 0xb2, 0xb4, 0x88, 0xde, 0x2b, 0x5d, 0xcd, 0xeb, 0x2a, 0x0d, 0xe0, 0x08, + 0xef, 0xbf, 0xf1, 0xec, 0xb2, 0xff, 0x7b, 0xa6, 0x5f, 0x88, 0xc5, 0x97, + 0xff, 0xf7, 0x4f, 0x0b, 0x0c, 0x79, 0x1f, 0xb8, 0x5f, 0x4b, 0x2f, 0xf6, + 0xd0, 0xc2, 0x8f, 0xbf, 0x59, 0x52, 0x46, 0x0f, 0xc6, 0xae, 0xaf, 0x7e, + 0xec, 0xe7, 0xce, 0x2c, 0xa8, 0x3d, 0x9c, 0x30, 0xbf, 0xf9, 0xf5, 0x29, + 0xde, 0x28, 0x96, 0x79, 0x65, 0x42, 0xf2, 0xf6, 0x43, 0xb7, 0xe3, 0x23, + 0x84, 0xce, 0xa3, 0xcd, 0xec, 0x62, 0xce, 0x40, 0x51, 0x9f, 0x00, 0x82, + 0xdb, 0xab, 0x2d, 0xe5, 0x97, 0x47, 0xeb, 0x2f, 0xff, 0x18, 0x1b, 0x71, + 0x3b, 0x80, 0xfd, 0x99, 0xe5, 0x95, 0xf1, 0xf4, 0x68, 0x5e, 0xff, 0xd0, + 0x1e, 0x41, 0xfd, 0xe8, 0x62, 0xca, 0x59, 0x7b, 0x40, 0xdd, 0x59, 0x52, + 0x35, 0x7e, 0x0b, 0xa2, 0x44, 0x50, 0x1a, 0x6f, 0xbf, 0xe6, 0xde, 0x59, + 0x7f, 0xe7, 0x16, 0x77, 0x9d, 0xca, 0x76, 0xcb, 0x2a, 0x0f, 0xa0, 0x89, + 0x6f, 0x3f, 0xb8, 0xb2, 0xe0, 0x6c, 0xb2, 0xa4, 0x6d, 0x34, 0x39, 0x7e, + 0xc9, 0x75, 0xe4, 0xb2, 0xe2, 0xf4, 0xc7, 0x91, 0xd2, 0x1b, 0xfc, 0xe4, + 0x27, 0x7b, 0x03, 0x59, 0x7f, 0x00, 0x33, 0x87, 0xf3, 0x4b, 0x2f, 0xf3, + 0x5d, 0xc2, 0xfa, 0x05, 0x59, 0x7f, 0x83, 0xdc, 0xf6, 0xb1, 0xa5, 0x95, + 0x07, 0xd2, 0x66, 0xb7, 0x6a, 0x4b, 0x2a, 0x13, 0x34, 0xf8, 0xb8, 0xcc, + 0xf5, 0x09, 0xc6, 0x10, 0x5f, 0xdc, 0x19, 0x3b, 0xf5, 0x65, 0xfe, 0xd4, + 0x0e, 0x3b, 0x12, 0x59, 0x7f, 0xff, 0xe3, 0xfb, 0xcf, 0xd2, 0xc1, 0xf4, + 0xe6, 0xe0, 0x70, 0xca, 0x65, 0x97, 0xff, 0xd1, 0xe9, 0xc4, 0x06, 0xf9, + 0xd9, 0xed, 0xcc, 0xf2, 0xca, 0x34, 0x7b, 0xe8, 0xc8, 0x0d, 0x97, 0x3f, + 0x96, 0x5f, 0xfd, 0xd8, 0x16, 0x77, 0x89, 0xfd, 0x1e, 0x59, 0x7f, 0xa7, + 0x7d, 0x23, 0xe8, 0x18, 0xb2, 0xba, 0x89, 0x3f, 0xc5, 0x89, 0x1a, 0xfc, + 0xd3, 0xf6, 0x66, 0xed, 0x65, 0xff, 0x60, 0xe7, 0x78, 0x53, 0x6b, 0x8b, + 0x2d, 0x9a, 0x3e, 0xcd, 0xe5, 0xf7, 0xfe, 0xd4, 0xd3, 0xb9, 0x07, 0xb3, + 0xf9, 0x65, 0x42, 0x60, 0xe3, 0x84, 0xe0, 0x0a, 0x6e, 0x7f, 0xd6, 0x5f, + 0xff, 0x4e, 0x28, 0xe4, 0x6c, 0x58, 0x3e, 0x9c, 0xcb, 0x2f, 0xff, 0xfe, + 0xe6, 0x8a, 0x26, 0x9c, 0x27, 0x8e, 0x59, 0xf7, 0xb3, 0x79, 0x67, 0x16, + 0x56, 0x91, 0x90, 0x4a, 0x35, 0xe4, 0xc0, 0x41, 0x0d, 0xfa, 0x59, 0x7b, + 0xd3, 0x85, 0x59, 0x74, 0xd2, 0x59, 0x50, 0x78, 0x7f, 0x05, 0xe8, 0x82, + 0xff, 0xe2, 0xf7, 0x37, 0x9f, 0xa3, 0x0a, 0x65, 0x97, 0xed, 0x1f, 0x23, + 0xe5, 0x95, 0x87, 0xda, 0xe8, 0xb7, 0xfb, 0x66, 0xc4, 0xd2, 0x3f, 0x71, + 0x65, 0xd1, 0xfa, 0xcb, 0xf1, 0x7b, 0xb8, 0xde, 0xb2, 0xfd, 0x37, 0x1f, + 0x42, 0xac, 0xbc, 0xed, 0x6a, 0x0f, 0x53, 0x0a, 0xaf, 0xf1, 0x8a, 0xf2, + 0x28, 0x62, 0xca, 0x92, 0x65, 0x26, 0x41, 0x31, 0xd6, 0x9a, 0xfa, 0x65, + 0x7c, 0x61, 0x7d, 0x2c, 0xbc, 0xc7, 0x69, 0x65, 0xb9, 0x23, 0x7c, 0xe4, + 0x37, 0xf8, 0xc7, 0x85, 0x2e, 0xe2, 0xcb, 0xfe, 0xe9, 0xea, 0x6e, 0xbe, + 0x69, 0x65, 0xff, 0xff, 0xfd, 0xff, 0x0b, 0x1f, 0xe9, 0xc3, 0xe8, 0x27, + 0x16, 0x7d, 0x2c, 0x06, 0xc5, 0x8f, 0xf2, 0xca, 0x0a, 0x32, 0x0c, 0xe6, + 0xf3, 0xb8, 0x55, 0x14, 0xc2, 0xa1, 0x36, 0x9d, 0x89, 0xb2, 0x1f, 0x21, + 0x22, 0xbf, 0xf6, 0x17, 0xd2, 0xe7, 0xa3, 0x53, 0x2c, 0xbf, 0xf3, 0xfd, + 0x87, 0xa3, 0x64, 0x0a, 0xb2, 0xf6, 0x1f, 0xeb, 0x2d, 0x8b, 0x2f, 0x7c, + 0x59, 0xf9, 0xac, 0xde, 0x39, 0x46, 0x8d, 0xfd, 0x20, 0x3b, 0x55, 0xec, + 0x06, 0x96, 0x5d, 0xb4, 0xcb, 0x2c, 0xd2, 0xcb, 0x8c, 0x6b, 0x2b, 0x74, + 0xd4, 0x70, 0x4a, 0xe1, 0xcc, 0xb2, 0xff, 0xb5, 0x83, 0xec, 0x34, 0xc0, + 0x2c, 0xb8, 0x5d, 0x96, 0x54, 0x23, 0x43, 0x10, 0x58, 0x49, 0xd1, 0x86, + 0x8e, 0xae, 0x67, 0xeb, 0x2f, 0x6b, 0xaf, 0x38, 0xf8, 0x7f, 0x49, 0xbf, + 0xd3, 0xbe, 0x91, 0x46, 0x71, 0x65, 0x7c, 0x9d, 0xc1, 0xc6, 0x9a, 0xe6, + 0xd7, 0xff, 0xef, 0xcf, 0x93, 0xba, 0xfc, 0xf4, 0x4d, 0xce, 0xe2, 0xca, + 0x59, 0x7f, 0x00, 0xc6, 0x64, 0x6b, 0x2c, 0x29, 0x9b, 0x66, 0x05, 0xdf, + 0x9f, 0x9d, 0x79, 0x2c, 0xbf, 0x75, 0xe4, 0x6c, 0x59, 0x5a, 0x3f, 0x5e, + 0x93, 0xb4, 0x4f, 0x7f, 0x1f, 0x5c, 0xf6, 0x85, 0x97, 0xa5, 0x1f, 0x2c, + 0xbf, 0xff, 0x16, 0x7d, 0xe9, 0xdd, 0x7d, 0xf3, 0x87, 0xd0, 0x6c, 0xb2, + 0xfd, 0xd8, 0xdb, 0x1a, 0x59, 0x66, 0x42, 0x21, 0xc6, 0xbd, 0x7d, 0xe9, + 0x67, 0x96, 0x54, 0x26, 0x95, 0x86, 0x1f, 0x16, 0x3c, 0x29, 0x00, 0x51, + 0x7e, 0xf8, 0x25, 0x1b, 0xd6, 0x5f, 0xcf, 0xa9, 0xa4, 0x7d, 0x59, 0x7f, + 0x81, 0xb7, 0x4f, 0x7e, 0x4c, 0xb2, 0xff, 0xcf, 0xf7, 0x04, 0xef, 0x60, + 0x82, 0xb2, 0xb1, 0x19, 0xee, 0x55, 0xc2, 0xe0, 0x1b, 0xdd, 0xce, 0x2c, + 0xb6, 0x2c, 0xbf, 0xf4, 0xc6, 0x29, 0xf8, 0xb1, 0xbe, 0x76, 0x8d, 0x3e, + 0xf1, 0x7b, 0xff, 0xfc, 0x58, 0x1f, 0x7a, 0x3d, 0xc9, 0x8b, 0x1a, 0x9d, + 0x0d, 0xd2, 0xcb, 0xff, 0x06, 0x19, 0xdc, 0xe6, 0x19, 0x2c, 0xa8, 0x45, + 0x27, 0x5a, 0x2f, 0xda, 0x8d, 0xf1, 0xa5, 0x97, 0xf3, 0x94, 0xe1, 0xc1, + 0x2c, 0xa8, 0x4d, 0xe3, 0x23, 0x00, 0x32, 0x20, 0x14, 0xdf, 0xf4, 0x34, + 0x13, 0xdb, 0x3e, 0xf2, 0xca, 0x6e, 0x5b, 0x52, 0x66, 0xd6, 0x29, 0x0f, + 0x3b, 0x42, 0xb6, 0x50, 0x8a, 0x1c, 0x7a, 0x18, 0x9e, 0x2c, 0x64, 0x61, + 0x8f, 0x27, 0xe8, 0xcd, 0x8d, 0xb2, 0x68, 0xf1, 0x75, 0x1f, 0x93, 0x23, + 0x21, 0xec, 0x7c, 0xdf, 0x9b, 0x14, 0xa4, 0xee, 0x46, 0x3b, 0xe8, 0xf6, + 0xb7, 0xa0, 0xdf, 0xf6, 0x9d, 0xa9, 0xce, 0x37, 0xd9, 0x65, 0xfc, 0xed, + 0x4c, 0x46, 0x35, 0x97, 0x8f, 0x66, 0x2c, 0xbf, 0xdf, 0x77, 0x3f, 0x64, + 0x05, 0x65, 0xff, 0xfe, 0x1e, 0x6c, 0xe5, 0xee, 0x40, 0x67, 0x31, 0x86, + 0x41, 0x59, 0x7f, 0x0f, 0x8f, 0x1f, 0x49, 0x65, 0x42, 0x24, 0x1d, 0x8a, + 0xff, 0x4d, 0xd3, 0x86, 0x38, 0xd6, 0x5f, 0xe9, 0xda, 0xc3, 0xec, 0x0d, + 0x65, 0x41, 0xf3, 0x91, 0x9d, 0x0a, 0x9f, 0xa6, 0x8f, 0x3a, 0x5c, 0xe3, + 0xa5, 0x0c, 0x50, 0x42, 0x22, 0xfb, 0x08, 0x5d, 0xd5, 0x97, 0xff, 0xff, + 0xee, 0x9f, 0xbb, 0x9a, 0x8d, 0xf3, 0x98, 0x06, 0xf9, 0xd9, 0xf4, 0xb0, + 0x05, 0xff, 0x16, 0x5b, 0xc6, 0x8b, 0x3e, 0x12, 0xdf, 0xe7, 0x94, 0xdd, + 0x3f, 0xbc, 0xb2, 0xff, 0xd0, 0x19, 0xc4, 0xfc, 0x64, 0x12, 0xcb, 0xff, + 0xdd, 0x30, 0xf7, 0x27, 0x70, 0x1d, 0x8d, 0xd5, 0x97, 0xf1, 0x47, 0xd2, + 0x32, 0x59, 0x4b, 0x2f, 0xf6, 0x74, 0xb3, 0xdd, 0x35, 0x94, 0x33, 0xe8, + 0x22, 0xcf, 0x05, 0xdf, 0xf7, 0xa2, 0x5c, 0x9a, 0x51, 0xb2, 0xcb, 0x66, + 0x26, 0x41, 0xf4, 0x2d, 0xfc, 0x5d, 0x7f, 0xfd, 0xee, 0xe7, 0xf3, 0x99, + 0x19, 0xe1, 0xe1, 0x2c, 0xb3, 0x4b, 0x2f, 0xe7, 0x1e, 0xb4, 0x0d, 0x96, + 0x5f, 0xa3, 0x0b, 0xdb, 0x8b, 0x28, 0x53, 0xea, 0x08, 0x93, 0x0b, 0xef, + 0xbc, 0x7a, 0xc5, 0x96, 0xfa, 0x71, 0xe8, 0xe1, 0x85, 0xb9, 0x89, 0x9b, + 0x3c, 0x61, 0x94, 0x35, 0x66, 0x4c, 0x35, 0x28, 0xd7, 0xbd, 0x1b, 0x8d, + 0xff, 0xff, 0xf6, 0x7d, 0x23, 0xe1, 0x66, 0xfe, 0xe4, 0xdd, 0x82, 0x9a, + 0x73, 0x84, 0xf7, 0xac, 0xbf, 0xff, 0xfe, 0xd4, 0x34, 0x59, 0xbf, 0xb9, + 0xad, 0x67, 0xb8, 0xdf, 0xe8, 0xe7, 0x4f, 0x16, 0x5f, 0xff, 0xf6, 0x10, + 0xb3, 0xb5, 0x1b, 0xcf, 0xdc, 0xc1, 0x4f, 0x4f, 0xf2, 0xca, 0x24, 0xdb, + 0xfd, 0x08, 0x31, 0x21, 0x03, 0x46, 0x9f, 0xa0, 0x23, 0xb9, 0xbf, 0xfc, + 0x63, 0x9c, 0xc3, 0x9d, 0x03, 0x79, 0xb8, 0xb2, 0xfd, 0xd3, 0xf6, 0x31, + 0x65, 0xa4, 0xb2, 0x9b, 0x06, 0xe2, 0x44, 0xf6, 0xd4, 0x22, 0xaf, 0x68, + 0x43, 0x5f, 0xa5, 0x1f, 0x4b, 0x8b, 0x2f, 0xff, 0xff, 0xfd, 0x84, 0x2c, + 0xe3, 0xe8, 0x27, 0xcc, 0x7e, 0x86, 0x13, 0x8b, 0xd3, 0x9f, 0x9d, 0xfb, + 0xf8, 0x1a, 0x4b, 0xff, 0xff, 0x82, 0x6d, 0x0c, 0x1a, 0x9c, 0x08, 0xdb, + 0x81, 0xe8, 0x3b, 0xf3, 0xb4, 0xb2, 0xe0, 0x6d, 0xf2, 0x68, 0xa6, 0x53, + 0xc8, 0x51, 0x5f, 0xc2, 0x96, 0x7b, 0xa6, 0xb2, 0xe1, 0xe2, 0xca, 0x86, + 0x40, 0xdf, 0x67, 0x53, 0x9e, 0x1a, 0x85, 0x1b, 0x98, 0x10, 0xf7, 0x0b, + 0x6c, 0xde, 0xb2, 0xcc, 0x59, 0x7f, 0x9e, 0x58, 0xc7, 0x2f, 0xd6, 0x5f, + 0x67, 0x62, 0x65, 0x97, 0x98, 0x19, 0xcd, 0xc9, 0xf2, 0xf4, 0x45, 0xcc, + 0xaf, 0xff, 0xff, 0x68, 0x25, 0x9b, 0xe7, 0x70, 0xf0, 0xbf, 0x9c, 0x59, + 0xbc, 0xb3, 0x9b, 0xd6, 0x5f, 0xec, 0x76, 0x4e, 0xdc, 0x86, 0x2c, 0xbf, + 0xfd, 0x28, 0xe7, 0x41, 0xac, 0xf7, 0x8d, 0x8b, 0x28, 0x28, 0x81, 0xf8, + 0xde, 0xff, 0xfc, 0x08, 0x9c, 0x58, 0x3e, 0x98, 0xa3, 0x81, 0x7f, 0x59, + 0x58, 0x9b, 0xee, 0xa3, 0x00, 0x22, 0x4b, 0xff, 0xf1, 0x97, 0xbb, 0x8d, + 0xfe, 0x9b, 0x37, 0x5c, 0xbf, 0x59, 0x7c, 0xd4, 0xee, 0x4c, 0xb2, 0xde, + 0x59, 0x50, 0x6e, 0x1c, 0x9e, 0xff, 0xc5, 0xb1, 0x66, 0xfe, 0x02, 0x3e, + 0x59, 0x7f, 0xdd, 0x8f, 0xa7, 0x37, 0x1d, 0xff, 0x9a, 0xcb, 0xf7, 0xbe, + 0x91, 0xee, 0x2c, 0xa1, 0x9f, 0x8f, 0x11, 0x6a, 0x11, 0xa9, 0xb4, 0x2c, + 0xa8, 0xd3, 0xe3, 0xe1, 0xaf, 0xa1, 0x26, 0x08, 0x79, 0xdf, 0xfc, 0xd6, + 0x70, 0x10, 0x2f, 0x23, 0x53, 0x2c, 0xbe, 0xd4, 0x9c, 0x6b, 0x2e, 0x70, + 0xac, 0xbf, 0x6b, 0x37, 0x0f, 0xf5, 0x97, 0xfd, 0x20, 0xf4, 0xfa, 0x40, + 0xd9, 0x65, 0x6c, 0x7c, 0xa4, 0x57, 0x7b, 0xd8, 0xdb, 0x59, 0x4d, 0x84, + 0x5e, 0xc3, 0xde, 0x11, 0x5e, 0xdc, 0xce, 0xac, 0xb8, 0x58, 0x59, 0x76, + 0x0d, 0x65, 0x37, 0x4b, 0xc1, 0x7b, 0x3c, 0xca, 0x5d, 0x3e, 0x23, 0xba, + 0x3f, 0x21, 0xbf, 0xe3, 0x20, 0x0f, 0xef, 0x17, 0xbf, 0x1f, 0xb9, 0x9f, + 0xac, 0xbf, 0x77, 0x37, 0x9e, 0xf5, 0x97, 0xff, 0xfe, 0x27, 0xf7, 0x62, + 0x69, 0xc5, 0x9d, 0x3f, 0x70, 0x01, 0x04, 0x2c, 0xbb, 0x3f, 0x59, 0x7f, + 0xf1, 0x7e, 0x58, 0x73, 0x76, 0x08, 0x55, 0x94, 0x67, 0xb6, 0xe2, 0xf7, + 0xf4, 0xb9, 0xe3, 0x8f, 0x96, 0x5f, 0xa0, 0xba, 0xf2, 0x59, 0x7a, 0x07, + 0x0b, 0x28, 0x67, 0x82, 0xc2, 0x6a, 0x59, 0x7a, 0x07, 0x0b, 0x2f, 0xd9, + 0xee, 0x3c, 0xd3, 0x8f, 0x22, 0x08, 0x98, 0x17, 0x7c, 0xdc, 0xb6, 0xb6, + 0xcb, 0x72, 0xb2, 0xf8, 0xdc, 0x86, 0xb2, 0xcd, 0x4e, 0x3d, 0x71, 0x9b, + 0xdf, 0xdf, 0xe3, 0xfd, 0x2e, 0x2c, 0xa9, 0x23, 0xf8, 0xe1, 0x49, 0xc2, + 0xbb, 0xff, 0xf6, 0x81, 0xad, 0x41, 0x60, 0xa7, 0xde, 0xe0, 0x8b, 0x2f, + 0xbb, 0x00, 0x25, 0x97, 0xc0, 0x7f, 0xbc, 0xb2, 0xa4, 0xae, 0xf8, 0x65, + 0x18, 0x56, 0x2c, 0x32, 0x3e, 0x20, 0x9a, 0x3b, 0x5d, 0x1a, 0x31, 0x5b, + 0xa4, 0x36, 0x6f, 0x59, 0x4b, 0x2f, 0xec, 0x60, 0xfb, 0x9c, 0x59, 0x7f, + 0x70, 0x21, 0x72, 0x15, 0x65, 0x36, 0x87, 0xcd, 0xb0, 0x5f, 0x8b, 0x6f, + 0xf1, 0x4e, 0xdf, 0xf4, 0xb9, 0x32, 0xcb, 0xb6, 0xf9, 0x65, 0xfb, 0xaf, + 0xbb, 0x1f, 0xac, 0xa1, 0x9f, 0xf3, 0x9d, 0x37, 0x8c, 0xdf, 0xd3, 0x16, + 0x75, 0xfc, 0xb2, 0xfe, 0x14, 0xfe, 0xe0, 0x38, 0xb2, 0xb4, 0x7b, 0xa4, + 0x5b, 0x50, 0x9b, 0x16, 0x42, 0xcc, 0xe1, 0x1d, 0x7f, 0xb5, 0x83, 0x9a, + 0x51, 0xba, 0xb2, 0xfb, 0x43, 0xc2, 0x59, 0x7d, 0xff, 0x37, 0x42, 0xb2, + 0x8c, 0xf2, 0x00, 0x43, 0x7e, 0xff, 0x3c, 0x26, 0xcb, 0x2f, 0xf3, 0x5e, + 0xce, 0xce, 0xfb, 0x8b, 0x2a, 0x0f, 0x8d, 0xca, 0xe9, 0xb2, 0xac, 0xde, + 0x51, 0xee, 0x19, 0xc7, 0x5f, 0xca, 0x10, 0x97, 0xf7, 0x70, 0x32, 0x86, + 0x2c, 0xbf, 0xdd, 0xc9, 0x39, 0x67, 0xcb, 0x2b, 0x0f, 0x7f, 0xc5, 0xb7, + 0xff, 0xfc, 0x4f, 0xff, 0x36, 0xc3, 0x2f, 0x16, 0x6f, 0x9d, 0xc6, 0x89, + 0x65, 0xfd, 0xdc, 0x2f, 0xa0, 0x55, 0x94, 0x48, 0xb9, 0xf1, 0x0b, 0x4d, + 0x57, 0x0d, 0xbd, 0x65, 0xec, 0x39, 0x96, 0x5f, 0xf8, 0xf2, 0x69, 0xdc, + 0x8e, 0xbe, 0xea, 0xcb, 0xfe, 0xc7, 0xfb, 0xb9, 0xef, 0xdd, 0x65, 0xff, + 0xf4, 0xb8, 0x0c, 0x29, 0xc5, 0x9d, 0xeb, 0x8d, 0x65, 0xff, 0x7d, 0x91, + 0xf4, 0xc5, 0x0c, 0x59, 0x7f, 0x7d, 0xce, 0xe3, 0xe9, 0x65, 0xff, 0xff, + 0x8d, 0x9a, 0x3c, 0xf8, 0x81, 0xe8, 0xec, 0xed, 0xe7, 0xe9, 0xa1, 0x65, + 0x3a, 0x27, 0xbc, 0x5d, 0x5b, 0x27, 0xc4, 0x31, 0xc1, 0x50, 0xfe, 0x39, + 0xea, 0x87, 0xa1, 0xb1, 0x7f, 0xfd, 0x8f, 0xb7, 0x60, 0xfd, 0xc8, 0xdb, + 0x38, 0xb2, 0xff, 0xb3, 0x5b, 0x41, 0xeb, 0x09, 0x65, 0x98, 0xb2, 0x71, + 0xb7, 0xbc, 0x58, 0x35, 0x95, 0x06, 0xfb, 0xe2, 0x3b, 0xe9, 0x6e, 0x03, + 0xcb, 0x2f, 0xef, 0xb9, 0x98, 0x42, 0xac, 0xbe, 0x60, 0x91, 0xfa, 0xcb, + 0xff, 0xdb, 0x0f, 0x4e, 0x12, 0xcd, 0xfa, 0x3e, 0x2c, 0xa8, 0x46, 0x26, + 0x13, 0x19, 0x70, 0x09, 0x2f, 0xef, 0x75, 0xe6, 0x11, 0x8b, 0x2e, 0x7e, + 0xac, 0xbf, 0xbd, 0x1f, 0xcb, 0x38, 0xb2, 0x9c, 0xfd, 0x3f, 0x30, 0x21, + 0x6b, 0xc0, 0xfb, 0xf5, 0x97, 0xf7, 0x23, 0xef, 0xf5, 0x0b, 0x2e, 0x19, + 0xac, 0xa8, 0x5d, 0x75, 0xd8, 0xc3, 0x23, 0xfc, 0x0b, 0x01, 0xc3, 0x13, + 0x50, 0xe5, 0x78, 0x57, 0x11, 0x77, 0x07, 0xf7, 0x97, 0xdf, 0x1b, 0x23, + 0xab, 0x2f, 0xcf, 0xd9, 0xc3, 0x85, 0x95, 0xd3, 0xca, 0xf1, 0x0d, 0xfd, + 0xe2, 0x89, 0x67, 0x96, 0x5f, 0x61, 0x3c, 0x96, 0x5f, 0x7b, 0x82, 0x72, + 0x71, 0xe6, 0x36, 0x4b, 0x2f, 0xf7, 0x8f, 0x6c, 0xe8, 0x3c, 0xb2, 0xfb, + 0xdc, 0x81, 0x56, 0x5a, 0x65, 0x97, 0xf6, 0x03, 0x3a, 0x1d, 0x96, 0x5b, + 0xe8, 0x3c, 0x0e, 0x09, 0x5e, 0xec, 0x0d, 0x65, 0x42, 0x29, 0xf1, 0x8e, + 0x62, 0x8b, 0xe6, 0x33, 0xef, 0x96, 0x5f, 0xd2, 0xf1, 0xec, 0x4e, 0xb2, + 0xfe, 0xeb, 0xc9, 0x9a, 0x35, 0x97, 0xff, 0x0a, 0x2b, 0xfb, 0x9e, 0x28, + 0xfa, 0x4b, 0x2f, 0xef, 0x14, 0x4b, 0x3c, 0xb2, 0xa0, 0xfc, 0xe4, 0x8f, + 0x71, 0xf1, 0x65, 0x98, 0xb2, 0xf6, 0xb3, 0xe5, 0x97, 0xb0, 0xf6, 0x59, + 0x7d, 0x0c, 0x61, 0xac, 0xb6, 0x6c, 0x6f, 0x7c, 0x39, 0x43, 0x45, 0x47, + 0x45, 0xbf, 0x11, 0x25, 0xab, 0xff, 0xce, 0x2f, 0x85, 0x82, 0x96, 0x74, + 0xd8, 0xb2, 0xfc, 0x7c, 0xe4, 0x31, 0x65, 0x1a, 0x2b, 0x88, 0xf7, 0x7a, + 0x55, 0x42, 0xe2, 0x96, 0x37, 0x0a, 0x82, 0x70, 0xdb, 0x61, 0x7b, 0x92, + 0xfe, 0x5a, 0x50, 0xa0, 0x04, 0x6e, 0xf7, 0xe1, 0x99, 0x38, 0xd6, 0x5e, + 0xe0, 0xfe, 0x59, 0x77, 0xe1, 0x59, 0x7f, 0xfb, 0x26, 0xec, 0x10, 0xa5, + 0x9e, 0xe8, 0x16, 0x50, 0xa7, 0xc5, 0xd1, 0x8b, 0xe0, 0x81, 0xe4, 0xb2, + 0xa7, 0x23, 0x16, 0x50, 0x80, 0xf8, 0x8e, 0x8d, 0x32, 0x3d, 0x43, 0xae, + 0xff, 0xff, 0x1e, 0x7d, 0x2e, 0x7b, 0xb0, 0xc8, 0x31, 0xce, 0x86, 0xe9, + 0x65, 0xfe, 0x72, 0x9c, 0x1e, 0x7e, 0x35, 0x97, 0xfe, 0x07, 0x27, 0x30, + 0x4e, 0xbf, 0x61, 0x65, 0xfb, 0x3c, 0x0c, 0xf9, 0x65, 0xe1, 0x73, 0xe5, + 0x97, 0x44, 0xd3, 0x8f, 0x1b, 0xc5, 0x14, 0x48, 0xb8, 0x04, 0x22, 0x2f, + 0xff, 0xff, 0xc0, 0x29, 0xcd, 0x3f, 0xd2, 0xd3, 0xff, 0x3b, 0x80, 0x8f, + 0xbb, 0x86, 0x58, 0x2a, 0xcb, 0xff, 0xfd, 0xe0, 0x61, 0x4e, 0x3c, 0xf1, + 0x47, 0xf3, 0xb0, 0xc6, 0xb2, 0xff, 0x99, 0x8c, 0x9c, 0xcd, 0xdd, 0xf2, + 0x59, 0x5a, 0x45, 0x1b, 0x18, 0xaf, 0xff, 0xb5, 0xac, 0xf7, 0x3a, 0x79, + 0x3b, 0xbf, 0xc2, 0xca, 0x33, 0xf5, 0x01, 0x1d, 0xff, 0xfd, 0x1d, 0xc1, + 0x8a, 0x08, 0xee, 0x7a, 0x18, 0xfe, 0x59, 0x58, 0xa8, 0x77, 0xb1, 0xd1, + 0x00, 0x86, 0xfd, 0x84, 0x11, 0x18, 0xb2, 0xff, 0xee, 0xe4, 0x14, 0xc5, + 0x9e, 0xe3, 0xac, 0xb4, 0xbc, 0x7d, 0x4d, 0xe5, 0x17, 0xff, 0xe1, 0xe3, + 0x27, 0x37, 0xfa, 0x39, 0x34, 0x9f, 0x5b, 0x2c, 0xbd, 0x31, 0xee, 0xac, + 0xbf, 0xff, 0xbc, 0x7b, 0x60, 0xe7, 0x31, 0xe5, 0xa3, 0xd9, 0xd8, 0xb2, + 0xff, 0x6c, 0xec, 0x28, 0xd4, 0xcb, 0x2f, 0xfb, 0xec, 0x17, 0xf6, 0x64, + 0xed, 0x62, 0x24, 0x8d, 0x7a, 0xfb, 0xf7, 0x79, 0x96, 0x5a, 0x16, 0x5e, + 0xc2, 0xda, 0x71, 0xb3, 0x09, 0x1d, 0xff, 0xf6, 0x03, 0x53, 0xa6, 0xe8, + 0x05, 0x3c, 0x21, 0x56, 0x5f, 0xff, 0x3f, 0xa3, 0x40, 0x61, 0xf2, 0x77, + 0x25, 0xc5, 0x97, 0xfd, 0xad, 0xa3, 0x6d, 0x81, 0xad, 0x96, 0x5f, 0xfa, + 0x74, 0xdd, 0x00, 0xa7, 0x84, 0x2a, 0xcb, 0xfc, 0x53, 0xb8, 0x0d, 0xc0, + 0x69, 0x65, 0x61, 0xfe, 0x01, 0x0e, 0xa1, 0x1b, 0x7c, 0x85, 0xd5, 0xf8, + 0x79, 0xf3, 0x92, 0xcb, 0xff, 0xdb, 0x4e, 0xe7, 0x41, 0x3b, 0xdc, 0xe4, + 0x69, 0x65, 0xff, 0xf7, 0x63, 0x69, 0xc5, 0x9b, 0xdf, 0xbd, 0x8f, 0x96, + 0x5f, 0xff, 0xf7, 0xdc, 0x3c, 0x6a, 0x77, 0x73, 0xdc, 0xcd, 0xa7, 0x61, + 0x8d, 0x65, 0x0d, 0x18, 0x18, 0xa9, 0x7f, 0xc5, 0x9a, 0xc0, 0xe1, 0x8d, + 0x65, 0xfd, 0xb7, 0xa6, 0x28, 0x62, 0xcb, 0xfe, 0x89, 0xa7, 0x3c, 0x4d, + 0x13, 0x2c, 0xbf, 0xff, 0xb3, 0x6c, 0x31, 0x90, 0x3b, 0x3a, 0x06, 0xf3, + 0x71, 0x65, 0xff, 0x63, 0x59, 0xd3, 0xd7, 0x5d, 0x65, 0x42, 0xa9, 0x0c, + 0x27, 0x38, 0xc4, 0x7a, 0x44, 0xe6, 0xc4, 0x5f, 0xc3, 0xcf, 0x2e, 0xd6, + 0xcc, 0xad, 0xb1, 0xb3, 0x8b, 0x0e, 0xe0, 0xca, 0x44, 0xfa, 0x14, 0x26, + 0x57, 0x32, 0xee, 0xa1, 0x64, 0xc8, 0x43, 0xf4, 0xd0, 0x95, 0x39, 0x19, + 0x6f, 0xa5, 0x5b, 0xdf, 0xef, 0x16, 0x7b, 0xb9, 0xb2, 0xcb, 0xff, 0x3e, + 0xbb, 0x9e, 0x82, 0x3f, 0xd6, 0x5f, 0xff, 0x16, 0x6d, 0x3b, 0xf0, 0x7b, + 0x31, 0x9f, 0xb4, 0xb2, 0xfa, 0x5e, 0x3d, 0x96, 0x5f, 0xf6, 0x35, 0xf4, + 0xb9, 0x3b, 0xc6, 0xb2, 0xff, 0xd2, 0x8c, 0xff, 0xb9, 0x84, 0x15, 0x97, + 0xff, 0xba, 0x64, 0x39, 0xc2, 0x04, 0xb3, 0xb8, 0xb2, 0xff, 0x9f, 0xdc, + 0x9a, 0x40, 0x2f, 0x2c, 0xac, 0x46, 0x14, 0xc7, 0xbf, 0xa5, 0xdf, 0xf7, + 0x4d, 0x91, 0x85, 0xee, 0x2c, 0xbf, 0xff, 0xc0, 0xf6, 0x81, 0x34, 0xef, + 0x4d, 0xd0, 0x7f, 0xe3, 0xc6, 0xf5, 0x97, 0xd0, 0x18, 0x64, 0xe4, 0x69, + 0x84, 0xc4, 0x8d, 0xea, 0x15, 0x80, 0x84, 0xcf, 0x47, 0xae, 0xaa, 0x44, + 0x6d, 0xf1, 0xe9, 0x5f, 0xff, 0xda, 0xc7, 0x64, 0xe1, 0x5f, 0xee, 0xe7, + 0x7b, 0x1e, 0x59, 0x7d, 0x9a, 0x9a, 0x4b, 0x2f, 0xfe, 0x3f, 0xa5, 0xc9, + 0xc3, 0x3d, 0xf0, 0x35, 0x97, 0xbe, 0x8d, 0xd5, 0x94, 0x29, 0xf4, 0xba, + 0x4d, 0xff, 0x64, 0xd2, 0xce, 0xe6, 0xfe, 0x2c, 0xbf, 0xff, 0x0f, 0xa0, + 0xe4, 0xee, 0x9f, 0xbb, 0x9a, 0x8d, 0xeb, 0x2f, 0xec, 0xf8, 0xb3, 0x3f, + 0x59, 0x58, 0x88, 0x72, 0x5a, 0xba, 0x19, 0x89, 0xc8, 0x8b, 0x08, 0xcd, + 0x11, 0x14, 0x30, 0xad, 0x0b, 0x2f, 0x8f, 0x4f, 0xf2, 0xcb, 0x8f, 0xc6, + 0x6c, 0xb8, 0x21, 0x7f, 0xce, 0x41, 0xe9, 0xb0, 0xa1, 0x65, 0xff, 0xc3, + 0x27, 0x9a, 0x68, 0xf7, 0xf9, 0xc5, 0x97, 0xa1, 0x82, 0x2c, 0xbf, 0xf8, + 0xf7, 0x98, 0xe7, 0x44, 0xc3, 0x76, 0x96, 0x5f, 0xff, 0xfe, 0x23, 0x17, + 0xaf, 0x34, 0xe2, 0x03, 0x7c, 0xec, 0xfa, 0x58, 0x02, 0xff, 0x8b, 0x2f, + 0xdd, 0x38, 0x2d, 0x96, 0x53, 0x11, 0x51, 0xbe, 0x10, 0x37, 0xcc, 0x33, + 0x69, 0x65, 0x41, 0xe6, 0x39, 0x55, 0x12, 0x6f, 0x5c, 0x1d, 0xf4, 0x67, + 0xb7, 0xfb, 0x51, 0xb7, 0x4f, 0x06, 0xb2, 0xfa, 0x26, 0xe1, 0xac, 0xa9, + 0x2a, 0xac, 0x19, 0x5e, 0x1b, 0x1c, 0x78, 0x1a, 0x36, 0x23, 0x3b, 0xff, + 0xfe, 0xc9, 0xa5, 0x1a, 0x15, 0x84, 0x7f, 0x4b, 0x83, 0xd1, 0xec, 0xb2, + 0xf4, 0xc0, 0x1a, 0xca, 0x86, 0xd5, 0x1b, 0x29, 0x60, 0x67, 0x2f, 0x87, + 0x4b, 0xfd, 0x8f, 0xbd, 0xe5, 0x98, 0x12, 0xe0, 0x1a, 0xaf, 0x8b, 0xc7, + 0xbd, 0x65, 0xf4, 0x80, 0xfe, 0x59, 0x50, 0x78, 0xb8, 0x47, 0x7d, 0xee, + 0x3f, 0xeb, 0x2f, 0xfe, 0xe9, 0xce, 0x3d, 0x03, 0x67, 0xd0, 0x56, 0x5f, + 0x1f, 0x5f, 0x65, 0x97, 0xdb, 0xe3, 0xd0, 0xb2, 0xfd, 0xcc, 0xf1, 0xf1, + 0x65, 0xff, 0xc7, 0xee, 0x9e, 0x60, 0xcb, 0x1a, 0x59, 0x7f, 0xf1, 0xf2, + 0x26, 0xce, 0x9e, 0xba, 0xeb, 0x2f, 0x68, 0xc5, 0x59, 0x7f, 0xfc, 0x0c, + 0x3e, 0xe0, 0x7a, 0x73, 0x9a, 0x60, 0x56, 0x5e, 0xf6, 0x34, 0xb2, 0xf6, + 0x03, 0x62, 0x3e, 0xff, 0x29, 0x5f, 0x80, 0xdb, 0x27, 0xf2, 0xcb, 0xf6, + 0xce, 0x5e, 0xe2, 0xcb, 0xfb, 0xaf, 0xb4, 0xe9, 0x79, 0x65, 0xfc, 0xf3, + 0x09, 0xc8, 0xc5, 0x97, 0xe7, 0xd1, 0x7c, 0x6b, 0x2a, 0x11, 0xb3, 0x85, + 0x66, 0x51, 0xd3, 0x1f, 0x17, 0x5e, 0xeb, 0x92, 0xca, 0x1a, 0xb7, 0x5c, + 0x20, 0x14, 0x8c, 0x28, 0xe6, 0x45, 0x31, 0x1b, 0x09, 0xfa, 0x84, 0xe8, + 0x65, 0x08, 0xcf, 0x46, 0x18, 0xd2, 0x3d, 0xf1, 0x7a, 0x18, 0xb2, 0xfd, + 0x9f, 0x0f, 0xe1, 0x56, 0x5f, 0xfd, 0xee, 0xc1, 0x40, 0x75, 0x18, 0x4b, + 0x2f, 0xec, 0xda, 0x05, 0x7e, 0x2c, 0xbb, 0xee, 0x4e, 0x3e, 0xf1, 0xa0, + 0xdf, 0xee, 0xc1, 0x93, 0xe8, 0x55, 0x97, 0xf4, 0x19, 0x3e, 0x85, 0x59, + 0x7f, 0x3f, 0xfa, 0xd1, 0xea, 0x71, 0xef, 0x74, 0xca, 0xf1, 0x63, 0x16, + 0x5b, 0xe5, 0x97, 0x3c, 0xa4, 0x6b, 0x78, 0x37, 0x7f, 0xff, 0xfa, 0x73, + 0x23, 0x3d, 0x3b, 0x24, 0x7b, 0xcb, 0x39, 0x3a, 0x06, 0xf3, 0x71, 0x65, + 0xfc, 0x41, 0x9c, 0xd7, 0x3f, 0x59, 0x52, 0x45, 0x83, 0xbf, 0x51, 0xaa, + 0xbc, 0xd1, 0x0b, 0xc2, 0x6b, 0xf8, 0x47, 0x93, 0xa0, 0x21, 0xb9, 0x7b, + 0x9e, 0x35, 0x97, 0xa6, 0xff, 0xe5, 0x97, 0xa0, 0x59, 0xc1, 0x37, 0x9f, + 0x8e, 0x5f, 0x7f, 0xf8, 0x37, 0x56, 0x5b, 0xf5, 0x97, 0xf4, 0x6b, 0x68, + 0xd6, 0xcb, 0x2f, 0xb5, 0x2e, 0x62, 0xcb, 0xff, 0x1e, 0x35, 0xc0, 0x4c, + 0x50, 0xc5, 0x97, 0x80, 0xfc, 0x59, 0x52, 0x45, 0x66, 0x17, 0xb0, 0x88, + 0x43, 0xfb, 0xff, 0xf8, 0xf5, 0x3b, 0x0f, 0x08, 0x5e, 0x9e, 0x33, 0x02, + 0xb2, 0xff, 0xff, 0xcc, 0xe0, 0x7b, 0x01, 0xfa, 0x44, 0x01, 0xce, 0x31, + 0x5c, 0xbf, 0x59, 0x7f, 0xff, 0xb6, 0xd4, 0x33, 0x80, 0x89, 0xd1, 0xa8, + 0x1f, 0x61, 0x8b, 0x2b, 0x11, 0xa8, 0x6e, 0x35, 0x89, 0xa7, 0xea, 0x32, + 0xeb, 0xf7, 0xfc, 0x3f, 0x9a, 0x59, 0x7e, 0xfa, 0x19, 0xb4, 0x2c, 0xbe, + 0xfa, 0x47, 0xd5, 0x97, 0xb5, 0x9f, 0x74, 0xf3, 0x3c, 0x53, 0x7f, 0x7c, + 0xf2, 0x28, 0x62, 0xcb, 0xff, 0x00, 0xa6, 0xf1, 0x66, 0xce, 0x4b, 0x2f, + 0xff, 0xff, 0x6b, 0x47, 0xb4, 0xee, 0xe7, 0x8a, 0x26, 0xee, 0x6d, 0x1f, + 0x78, 0x01, 0x59, 0x7f, 0xff, 0xf4, 0x0b, 0xd8, 0x9c, 0x58, 0x01, 0x67, + 0x7d, 0x2e, 0x19, 0x09, 0x1b, 0x2c, 0xbf, 0x7d, 0xc3, 0xc2, 0x59, 0x58, + 0x8a, 0x00, 0x3c, 0xd4, 0x27, 0x55, 0x85, 0xa6, 0x7d, 0xd8, 0xc7, 0x6f, + 0xfe, 0xd1, 0x7d, 0x9c, 0x04, 0xc5, 0x0c, 0x59, 0x7f, 0xc6, 0x2f, 0x60, + 0xf6, 0x81, 0x56, 0x5a, 0x46, 0x7f, 0xfc, 0x45, 0xbf, 0xe2, 0x04, 0xc5, + 0x9d, 0x7f, 0x2c, 0xbf, 0xfa, 0x40, 0xff, 0x85, 0x9c, 0xe4, 0x34, 0xb2, + 0xff, 0x76, 0x1a, 0x1f, 0x5d, 0x8b, 0x2f, 0xf9, 0x99, 0xc9, 0xd3, 0x14, + 0x31, 0x65, 0xff, 0xfb, 0x9b, 0x3c, 0xe1, 0xf6, 0x35, 0xac, 0xdf, 0x1f, + 0x2c, 0xa1, 0xa3, 0x29, 0x86, 0x9e, 0x3b, 0xbf, 0xff, 0xe7, 0xd7, 0x73, + 0xc7, 0x85, 0xb7, 0x23, 0x08, 0x7d, 0x85, 0x97, 0xde, 0x9d, 0xb6, 0x96, + 0x57, 0xc8, 0x89, 0x76, 0x3b, 0xff, 0xff, 0x7d, 0x9b, 0x01, 0xbe, 0x77, + 0xd2, 0xf4, 0x35, 0x3b, 0x35, 0xff, 0xf0, 0xb2, 0xff, 0xb2, 0x6d, 0xc0, + 0x7b, 0x3e, 0xf2, 0xcb, 0xd9, 0xa1, 0xac, 0xba, 0x24, 0xb2, 0xb0, 0xfc, + 0x18, 0x7d, 0xf8, 0xe5, 0xff, 0xec, 0xd9, 0xcb, 0x3b, 0x9e, 0xd6, 0x34, + 0xb2, 0xff, 0xf3, 0x4e, 0x5b, 0x30, 0x06, 0x33, 0x23, 0x59, 0x7f, 0x4d, + 0xf4, 0x81, 0x1e, 0x59, 0x7f, 0xc0, 0xfb, 0xb9, 0xed, 0x63, 0x4b, 0x2f, + 0xff, 0xe9, 0x46, 0xbe, 0x97, 0x27, 0x76, 0x0c, 0x9f, 0x42, 0xac, 0xbf, + 0x4b, 0xc5, 0x92, 0x59, 0x7f, 0xef, 0x87, 0xd0, 0x3f, 0x0b, 0x06, 0xb2, + 0xb0, 0xf9, 0x80, 0x4f, 0x7f, 0xdd, 0x76, 0x16, 0x75, 0xfc, 0xb2, 0xef, + 0xda, 0x59, 0x7d, 0xb9, 0x9a, 0x85, 0x96, 0xcd, 0x1b, 0xdd, 0xe3, 0x35, + 0x09, 0xf6, 0x61, 0x87, 0xc7, 0x7d, 0x86, 0x27, 0x08, 0x7c, 0xe9, 0x7f, + 0xf6, 0x7b, 0x93, 0xb5, 0x87, 0xd8, 0x1a, 0xcb, 0xfb, 0x3d, 0xad, 0x64, + 0x96, 0x52, 0xcb, 0xf6, 0x74, 0xb0, 0x2b, 0x2b, 0xf3, 0x62, 0x41, 0x75, + 0x31, 0xff, 0xf9, 0x7a, 0xf6, 0x7d, 0xe5, 0x97, 0xfb, 0x06, 0x7b, 0xfc, + 0x7a, 0x59, 0x78, 0xb3, 0x93, 0x8f, 0xd3, 0x74, 0x8d, 0xc7, 0x6f, 0xfb, + 0x19, 0xd8, 0x3d, 0x03, 0x75, 0x65, 0xfd, 0xe3, 0xd8, 0x9d, 0x8b, 0x28, + 0x6c, 0xb5, 0xfc, 0x29, 0x15, 0xdc, 0x31, 0xef, 0x7d, 0x0c, 0x03, 0x27, + 0x98, 0xe3, 0x51, 0x88, 0x76, 0x17, 0x2e, 0x47, 0xfc, 0x3a, 0x88, 0xbf, + 0x89, 0x3e, 0x94, 0x6a, 0x05, 0xcd, 0xf1, 0x9c, 0x08, 0x86, 0xde, 0x77, + 0x7f, 0xd0, 0xc2, 0xc1, 0xe8, 0xf6, 0x59, 0x7f, 0xff, 0x9a, 0xe8, 0x23, + 0xe9, 0xda, 0xd4, 0x6c, 0x4e, 0xfa, 0x15, 0x65, 0xfe, 0x2c, 0x06, 0x0b, + 0x2f, 0xd6, 0x53, 0xa2, 0x69, 0xa6, 0x6a, 0x92, 0x3d, 0x72, 0x1a, 0x57, + 0x85, 0x8d, 0x2c, 0xbf, 0x7e, 0xcc, 0xcf, 0x2c, 0xbf, 0xec, 0x9d, 0xac, + 0xe9, 0x64, 0xcb, 0x2b, 0x0f, 0x88, 0x8a, 0x2f, 0xff, 0xf7, 0x5f, 0xfe, + 0x4e, 0x2c, 0xde, 0x59, 0xcc, 0x64, 0x05, 0x65, 0x4c, 0x98, 0x11, 0x3f, + 0xf0, 0x82, 0x9b, 0xb6, 0xc5, 0x15, 0xb4, 0x28, 0x88, 0x5f, 0x65, 0x33, + 0xaf, 0xe9, 0x43, 0x4f, 0x19, 0x4d, 0xfd, 0x9d, 0x10, 0xbe, 0xfd, 0x65, + 0xff, 0xff, 0x6b, 0x25, 0xdc, 0x39, 0x73, 0x08, 0x1e, 0x2c, 0xfe, 0x16, + 0x5f, 0xf6, 0xef, 0xa3, 0x08, 0x22, 0x31, 0x65, 0x42, 0x28, 0x1d, 0x92, + 0xfe, 0xee, 0x17, 0xbf, 0x02, 0xcb, 0xfe, 0x18, 0xe3, 0xf9, 0xd9, 0xf7, + 0x96, 0x5f, 0xcf, 0xba, 0x32, 0xce, 0xac, 0xb9, 0x9c, 0x59, 0x79, 0xf8, + 0x6b, 0x2a, 0x0d, 0x97, 0xe2, 0xf7, 0xfc, 0x26, 0xd8, 0x4e, 0xc7, 0xea, + 0xca, 0x34, 0x7c, 0x4c, 0x7a, 0x4c, 0x3e, 0x21, 0xbf, 0xdc, 0xe4, 0x1e, + 0xcf, 0xe5, 0x97, 0xf6, 0x7b, 0x1c, 0xa6, 0x59, 0x7d, 0x9c, 0x8d, 0x2c, + 0xb0, 0xbd, 0x3c, 0xd2, 0x2c, 0xb4, 0xa1, 0x15, 0x00, 0x84, 0x05, 0xa4, + 0xb2, 0xfa, 0x18, 0xe3, 0x59, 0x50, 0x6c, 0x88, 0x46, 0xff, 0x64, 0xdd, + 0xcf, 0x40, 0xd6, 0x5f, 0xc5, 0xe7, 0x61, 0xf9, 0x65, 0xf7, 0x3f, 0x7d, + 0xd5, 0x96, 0x92, 0xca, 0x83, 0xe3, 0xc2, 0xcf, 0x13, 0x5e, 0x20, 0xc2, + 0xcb, 0xff, 0xff, 0xee, 0xe7, 0xb8, 0xf3, 0x4e, 0x2c, 0xfa, 0x58, 0x0d, + 0x8b, 0x07, 0xd3, 0x99, 0x65, 0xff, 0xf1, 0xf2, 0x25, 0xec, 0xe9, 0x67, + 0xba, 0x6b, 0x2e, 0x00, 0xab, 0x28, 0xd3, 0x01, 0xd0, 0xdf, 0x61, 0x03, + 0xe4, 0xdb, 0xfd, 0xf9, 0xfb, 0xde, 0xc6, 0x96, 0x5e, 0x64, 0x05, 0x65, + 0xec, 0x31, 0xac, 0xb7, 0x16, 0x5c, 0x58, 0x13, 0x59, 0xf0, 0xdd, 0xff, + 0xd9, 0xfc, 0xee, 0x9f, 0xb8, 0x47, 0x32, 0xca, 0xd8, 0xfc, 0xfc, 0x59, + 0x4d, 0xca, 0x37, 0xb2, 0x17, 0x77, 0xff, 0x17, 0xfb, 0x99, 0xd3, 0x86, + 0x38, 0xd6, 0x5f, 0xf1, 0x7f, 0xac, 0x91, 0x43, 0x16, 0x5f, 0xff, 0xff, + 0xa5, 0xce, 0x02, 0x3c, 0x63, 0xc2, 0x9a, 0x71, 0x66, 0xa0, 0xbd, 0xdc, + 0x6f, 0x59, 0x7f, 0xf7, 0xd2, 0xe6, 0x33, 0xe8, 0xef, 0x61, 0x65, 0x62, + 0x60, 0x9f, 0x1c, 0x6a, 0x10, 0xd6, 0xe2, 0xca, 0xc4, 0xe4, 0x41, 0x1a, + 0x50, 0x86, 0xd6, 0xd9, 0x65, 0xfb, 0x68, 0xf6, 0x7e, 0xb2, 0xfd, 0xac, + 0xfa, 0x5c, 0x59, 0x78, 0x3d, 0xc5, 0x96, 0xcd, 0x8f, 0x17, 0x45, 0x37, + 0xfd, 0xf4, 0x6b, 0x69, 0xd8, 0x63, 0x59, 0x74, 0xc6, 0xb2, 0xb1, 0x1f, + 0x66, 0x24, 0x4d, 0xc0, 0x28, 0xde, 0x79, 0x7f, 0x67, 0xd2, 0x8f, 0xe1, + 0x65, 0xf8, 0xb3, 0xaf, 0xe5, 0x95, 0xf1, 0xea, 0x30, 0xba, 0xf8, 0xf7, + 0xe6, 0x96, 0x54, 0x1e, 0x37, 0x48, 0xef, 0xa7, 0x07, 0x66, 0x96, 0x5f, + 0xb6, 0x9c, 0x08, 0x99, 0x65, 0xff, 0xff, 0x14, 0x7f, 0xf4, 0xb8, 0x08, + 0xf1, 0x60, 0xcf, 0x35, 0x32, 0xca, 0x74, 0x49, 0xf8, 0xb2, 0xa1, 0x96, + 0xc3, 0xb4, 0x34, 0x06, 0x43, 0x91, 0x93, 0x7d, 0x0e, 0x43, 0x5f, 0x98, + 0x7f, 0xb0, 0x96, 0x78, 0xcb, 0xbf, 0x42, 0x28, 0xc4, 0xf9, 0x1d, 0xef, + 0xa3, 0x32, 0x04, 0x38, 0xf7, 0x90, 0x89, 0x0b, 0xab, 0xf4, 0x8f, 0x59, + 0xf2, 0xcb, 0xdc, 0xee, 0x2c, 0xbf, 0x67, 0x36, 0xc6, 0x96, 0x57, 0xc7, + 0xdb, 0x31, 0x47, 0x47, 0x2f, 0xff, 0xf7, 0xb9, 0xdc, 0xfb, 0x1f, 0xe9, + 0xc3, 0x8d, 0xa7, 0x0a, 0x2a, 0xcb, 0xff, 0xf3, 0x3e, 0x97, 0x35, 0xf4, + 0x7b, 0x91, 0xd3, 0xf2, 0xcb, 0xfe, 0xc1, 0x4b, 0x3d, 0xd3, 0x69, 0x65, + 0xff, 0xe8, 0xfb, 0xa7, 0x84, 0x33, 0xdf, 0x03, 0x59, 0x50, 0x9a, 0x29, + 0xb5, 0x69, 0x60, 0x8e, 0x6e, 0xdd, 0x1a, 0xcb, 0xff, 0xed, 0xb0, 0x23, + 0xe9, 0xe0, 0xb3, 0x85, 0x04, 0x2c, 0xbf, 0xfa, 0x47, 0xee, 0xe6, 0xb5, + 0x9e, 0xe2, 0xcb, 0xfc, 0x27, 0x8f, 0x7c, 0x10, 0x56, 0x5f, 0xa1, 0x87, + 0xd8, 0x59, 0x7f, 0xb3, 0xdd, 0x3f, 0x60, 0x56, 0x54, 0xe4, 0x46, 0xe8, + 0xd4, 0x89, 0xa9, 0xb2, 0x9b, 0x81, 0x8d, 0x4c, 0xa9, 0xd8, 0x68, 0xdf, + 0xfa, 0x5c, 0xf3, 0xec, 0xde, 0x59, 0xf2, 0xcb, 0xfb, 0xb1, 0x20, 0x38, + 0x8b, 0x2f, 0xc3, 0xee, 0x17, 0x96, 0x54, 0x8f, 0x56, 0x62, 0xea, 0xf9, + 0x17, 0x65, 0x09, 0x8b, 0xf1, 0xfc, 0x3f, 0x85, 0x59, 0x50, 0x7a, 0x7a, + 0x28, 0xba, 0x6f, 0xd6, 0x5f, 0xf7, 0x76, 0x3c, 0x2f, 0xa5, 0xc5, 0x97, + 0xfd, 0xf7, 0x70, 0x25, 0x80, 0xdd, 0x59, 0x7f, 0xfc, 0xd6, 0x07, 0x99, + 0xe9, 0xb0, 0x52, 0xcf, 0xd6, 0x5a, 0x50, 0x8c, 0x8c, 0x3a, 0x33, 0xcb, + 0xf8, 0xfe, 0xff, 0x4e, 0x35, 0x97, 0xb3, 0x5f, 0xac, 0xbf, 0x70, 0xf0, + 0xbf, 0x59, 0x6c, 0x33, 0xc4, 0xe0, 0xed, 0xf8, 0xff, 0xff, 0x34, 0xb2, + 0xba, 0x8c, 0x22, 0x73, 0xe1, 0x35, 0xf9, 0xf0, 0x8c, 0x55, 0x97, 0xbd, + 0x9d, 0x59, 0x44, 0x78, 0x4d, 0xe4, 0xd7, 0x1b, 0x16, 0x5f, 0xff, 0xfb, + 0xe9, 0x3f, 0xd3, 0x88, 0x0d, 0xf3, 0xb3, 0xe9, 0x60, 0x0b, 0xfe, 0x2c, + 0xa6, 0x22, 0x35, 0xbc, 0x5a, 0xf6, 0xe1, 0xb6, 0xd6, 0x54, 0xe4, 0xda, + 0xf6, 0x71, 0xc8, 0x58, 0xee, 0x13, 0x5f, 0xff, 0xff, 0x7d, 0xc0, 0x47, + 0xd3, 0xbb, 0x83, 0x9c, 0x58, 0x01, 0x67, 0x73, 0xff, 0xcf, 0xcb, 0x2f, + 0xff, 0xff, 0x34, 0x58, 0x36, 0x32, 0x3d, 0xcc, 0xf7, 0x34, 0x78, 0x12, + 0xc1, 0xac, 0xa8, 0x47, 0xfe, 0x42, 0x26, 0xfd, 0x05, 0xf3, 0xec, 0xb2, + 0xff, 0xff, 0xff, 0xd8, 0x18, 0xec, 0x33, 0xd9, 0xce, 0x46, 0xb5, 0x05, + 0x9b, 0x60, 0x38, 0x09, 0x8a, 0x18, 0xb2, 0xf0, 0x34, 0x2a, 0xca, 0x62, + 0x2d, 0xb7, 0x21, 0x31, 0x7e, 0x7f, 0xc4, 0x7d, 0x96, 0x56, 0x1e, 0xa9, + 0x95, 0xde, 0x3f, 0xe1, 0x65, 0xfe, 0x9c, 0x59, 0xa3, 0x86, 0x2c, 0xbf, + 0x86, 0x59, 0xd7, 0xf2, 0xcb, 0xf7, 0xbe, 0x91, 0xe9, 0x65, 0x61, 0xea, + 0xf0, 0xb2, 0xb6, 0x46, 0x28, 0xc7, 0x3f, 0x84, 0x45, 0xed, 0x38, 0x8b, + 0x2f, 0xd1, 0xe6, 0x1f, 0x96, 0x5b, 0x67, 0x3c, 0x40, 0x0e, 0xdf, 0xfa, + 0x05, 0x6f, 0x06, 0x14, 0xc2, 0x31, 0x65, 0xff, 0xff, 0xfe, 0x14, 0xb2, + 0x71, 0xe1, 0x3f, 0xbb, 0x13, 0x4e, 0x2c, 0xe9, 0xfb, 0x80, 0x08, 0x21, + 0x65, 0x62, 0x3f, 0x3e, 0x28, 0x02, 0x25, 0xff, 0xb3, 0x3f, 0xe4, 0xed, + 0x70, 0x7c, 0x59, 0x7f, 0xb5, 0x81, 0xe9, 0xea, 0x65, 0x96, 0xf0, 0xcf, + 0xdb, 0x10, 0xaf, 0xf6, 0x04, 0xfd, 0xa0, 0x31, 0x65, 0xf7, 0xc5, 0x9b, + 0x8b, 0x2b, 0x0f, 0xfc, 0xc9, 0xdc, 0xce, 0xf1, 0x97, 0x96, 0x5f, 0xd2, + 0xe3, 0xb0, 0x1c, 0x59, 0x5b, 0x1e, 0x4b, 0x8d, 0xdf, 0xb3, 0xbd, 0x79, + 0x2c, 0xbf, 0xbc, 0x7a, 0xdb, 0x02, 0xb2, 0xa1, 0x9d, 0xca, 0x38, 0xdd, + 0xb2, 0x3a, 0xb1, 0x63, 0x55, 0x09, 0x0f, 0xd0, 0xe1, 0x39, 0x4c, 0x1a, + 0x8d, 0x1d, 0x84, 0xdd, 0x8c, 0xcd, 0xe1, 0xca, 0x51, 0xbb, 0xf2, 0x32, + 0x50, 0x3a, 0xee, 0x11, 0x37, 0x93, 0xde, 0x70, 0xe2, 0xca, 0x59, 0x7c, + 0xdf, 0xd3, 0xd2, 0xcb, 0xfe, 0x9d, 0xe2, 0xc6, 0xb0, 0xf8, 0xb2, 0x9b, + 0xb3, 0xea, 0x08, 0x5c, 0xc4, 0xb7, 0xbb, 0x1f, 0xac, 0xa6, 0xca, 0x35, + 0xe2, 0x10, 0xb8, 0x6b, 0x4b, 0x2f, 0xec, 0x64, 0x75, 0xfa, 0xb2, 0xe9, + 0xd3, 0x2c, 0xbd, 0xd3, 0x15, 0x65, 0x4e, 0x3e, 0x31, 0x96, 0x0a, 0x35, + 0x7f, 0xfd, 0xf4, 0x8a, 0x27, 0x30, 0xa0, 0x5f, 0x1e, 0xcb, 0x2a, 0x11, + 0xe7, 0x8d, 0xc6, 0x65, 0x7e, 0xd4, 0xe2, 0xde, 0xd2, 0xcb, 0xee, 0xbf, + 0xf0, 0xb2, 0xf7, 0x73, 0x4b, 0x2a, 0x0f, 0xad, 0xcb, 0x5b, 0xc8, 0xaf, + 0xed, 0xa6, 0x93, 0x67, 0x5b, 0x2c, 0xbf, 0x30, 0xc7, 0x83, 0x59, 0x69, + 0x96, 0x5d, 0x0c, 0x59, 0x6f, 0x2c, 0xad, 0x1a, 0x77, 0x16, 0xa1, 0x9e, + 0xcf, 0x4e, 0x6f, 0xa0, 0x6f, 0x25, 0x97, 0xfe, 0xc7, 0xfb, 0xf9, 0xa5, + 0x1a, 0xd9, 0x65, 0xed, 0x44, 0xcb, 0x2f, 0x71, 0xfe, 0x59, 0x5b, 0x22, + 0x77, 0xa4, 0x2e, 0x85, 0xe1, 0xdb, 0xa6, 0x75, 0x97, 0xff, 0xd9, 0x05, + 0xfc, 0x1f, 0xbb, 0x8c, 0xc1, 0xac, 0xba, 0x05, 0x59, 0x52, 0x3e, 0x4f, + 0x26, 0xdf, 0xce, 0xd4, 0x7b, 0x36, 0x59, 0x7f, 0x1e, 0xbe, 0x91, 0x42, + 0xcb, 0xfc, 0x3e, 0xc7, 0xd2, 0xcf, 0x2c, 0xae, 0x9f, 0x0f, 0x8b, 0x6f, + 0xfd, 0xb9, 0x05, 0xed, 0x1e, 0xfc, 0x1a, 0xcb, 0x8a, 0x65, 0x94, 0xdd, + 0xab, 0x59, 0x83, 0x6c, 0x84, 0x01, 0xc2, 0xfd, 0x87, 0xae, 0xf6, 0x44, + 0x40, 0x84, 0x7e, 0xe1, 0x10, 0x88, 0x57, 0xf9, 0xac, 0x91, 0x01, 0xf8, + 0xb2, 0xfd, 0xf3, 0x4e, 0x5f, 0xac, 0xb8, 0x85, 0x59, 0x6e, 0x19, 0xe0, + 0x80, 0xaa, 0xfc, 0xe3, 0x8c, 0x25, 0x96, 0x15, 0x65, 0x74, 0xdb, 0x91, + 0x2d, 0xff, 0xf9, 0x85, 0x81, 0xfb, 0xc4, 0xfd, 0x64, 0x67, 0x96, 0x5f, + 0xff, 0x66, 0xce, 0x41, 0x9d, 0xc8, 0x63, 0xfd, 0xe5, 0x95, 0x08, 0xa6, + 0xd2, 0xa5, 0xfe, 0xdd, 0xee, 0x6d, 0xad, 0x42, 0xcb, 0xff, 0xec, 0xde, + 0xf2, 0xc2, 0x19, 0x44, 0x87, 0xc5, 0x97, 0xff, 0xff, 0x01, 0x8c, 0x79, + 0x4e, 0x6f, 0x2c, 0x64, 0x06, 0x70, 0x9b, 0x6c, 0xff, 0x2c, 0xbf, 0x02, + 0x42, 0x6b, 0x8b, 0x2c, 0x7d, 0x45, 0x39, 0x3e, 0xdf, 0xff, 0xa3, 0x50, + 0x1c, 0x64, 0x06, 0x47, 0xc0, 0x31, 0x65, 0x42, 0xb6, 0x29, 0x9d, 0x34, + 0xbd, 0xd8, 0x63, 0x39, 0x11, 0x1b, 0xfa, 0x1e, 0xdb, 0x84, 0xf7, 0xf6, + 0xb2, 0x05, 0x82, 0x59, 0x78, 0x9d, 0x8b, 0x2e, 0xfe, 0x16, 0x5f, 0xfd, + 0xd6, 0x67, 0xd2, 0xe3, 0xc7, 0xd2, 0x59, 0x70, 0x9b, 0x2c, 0xa3, 0x3d, + 0xf2, 0x46, 0xa9, 0x23, 0x74, 0xcb, 0x08, 0x6f, 0xce, 0xd4, 0xdd, 0xc2, + 0xbc, 0x11, 0xba, 0x85, 0xdb, 0x62, 0x31, 0x16, 0xe6, 0x12, 0x0d, 0x99, + 0x4b, 0x0d, 0xaa, 0xcd, 0x13, 0xc9, 0x1b, 0x4b, 0x1d, 0x94, 0x76, 0xe3, + 0x9f, 0xe8, 0xca, 0xd6, 0xfc, 0x59, 0x6c, 0x21, 0xa4, 0x97, 0xfd, 0x3c, + 0xf2, 0x73, 0x8a, 0x33, 0x4b, 0xc4, 0xd4, 0xf7, 0x33, 0x27, 0x4f, 0x7b, + 0x5b, 0x7b, 0xbc, 0xe2, 0x47, 0xf2, 0xdb, 0x5b, 0x70, 0xa2, 0x2a, 0xc5, + 0xef, 0x94, 0xbe, 0x0f, 0x56, 0x0d, 0x00, 0x8f, 0xcb, 0x7c, 0x65, 0x4d, + 0x42, 0x63, 0x72, 0x5c, 0x48, 0x93, 0x80, 0x4d, 0xf1, 0xad, 0xdf, 0xff, + 0xc0, 0x0c, 0xff, 0xbd, 0xa8, 0xcf, 0x9b, 0x23, 0x77, 0x15, 0x65, 0x4f, + 0x56, 0x14, 0x72, 0xa9, 0xaf, 0xe7, 0x3f, 0x70, 0xc9, 0x65, 0xe3, 0xd6, + 0x2c, 0xad, 0xd3, 0xc6, 0xe1, 0x5d, 0xfb, 0x41, 0x77, 0x0a, 0xa2, 0x9d, + 0x5d, 0x9f, 0x2c, 0xbf, 0xfc, 0x00, 0x11, 0x94, 0x74, 0xd9, 0x9c, 0x59, + 0x69, 0xf0, 0x8b, 0x7c, 0x25, 0xf8, 0xd1, 0x82, 0xf7, 0xff, 0x1e, 0xa7, + 0xee, 0x3e, 0xde, 0xe3, 0xfe, 0xb2, 0xfd, 0xa0, 0xbb, 0x85, 0x51, 0x51, + 0xaf, 0xfc, 0xf2, 0x9f, 0x9a, 0x0b, 0xb8, 0x55, 0x13, 0x42, 0xff, 0xf1, + 0x64, 0xd2, 0x7d, 0x48, 0xb3, 0x7b, 0xac, 0xbe, 0x28, 0xcf, 0x96, 0x56, + 0x23, 0xad, 0x86, 0x9c, 0x4c, 0xf2, 0x55, 0xfe, 0x11, 0xf7, 0xcf, 0xf1, + 0xec, 0xb2, 0xa7, 0x9f, 0xac, 0x1e, 0x5f, 0xb4, 0x17, 0x70, 0xaa, 0x2a, + 0xf5, 0xfd, 0x9b, 0xe0, 0xba, 0x05, 0x97, 0xf1, 0x8c, 0x71, 0xa8, 0x59, + 0x7f, 0xff, 0x7d, 0xf9, 0x01, 0x82, 0x0c, 0x71, 0xfb, 0x23, 0x3c, 0xb2, + 0xd3, 0xf1, 0x1d, 0xba, 0x34, 0xe9, 0x70, 0x85, 0x97, 0xed, 0x05, 0xdc, + 0x2a, 0x8a, 0xd9, 0x7f, 0xd2, 0x9f, 0x9a, 0x0b, 0xb8, 0x55, 0x12, 0x0a, + 0xfb, 0x19, 0x1b, 0xab, 0x2d, 0x3f, 0x11, 0x3e, 0xe6, 0x9c, 0x47, 0xbe, + 0x61, 0x94, 0x2c, 0xbf, 0x68, 0x2e, 0xe1, 0x54, 0x48, 0x6b, 0xfb, 0x40, + 0xdf, 0x0d, 0x31, 0x65, 0xfc, 0x59, 0xcf, 0x4a, 0x16, 0x5f, 0x4f, 0x79, + 0x4f, 0x84, 0x58, 0xe1, 0x01, 0x9a, 0x6f, 0x31, 0xbf, 0xf7, 0x27, 0xe7, + 0x8c, 0x78, 0x53, 0x2c, 0xbc, 0xee, 0x15, 0xc6, 0x06, 0xa8, 0x3e, 0x80, + 0xa0, 0x5d, 0xdd, 0xd5, 0x97, 0xfe, 0x97, 0x63, 0xdc, 0x6e, 0xb8, 0xdc, + 0x92, 0xcb, 0xef, 0x7b, 0x1b, 0xd6, 0x58, 0x96, 0x58, 0xd6, 0x53, 0x74, + 0x68, 0x1b, 0x80, 0x85, 0xff, 0xe6, 0xe0, 0xdc, 0x1b, 0xae, 0xc3, 0x09, + 0xfa, 0x7a, 0x59, 0x6f, 0x96, 0x5c, 0x64, 0xb2, 0xff, 0x63, 0x30, 0x24, + 0xfb, 0xab, 0x2f, 0xe8, 0x1c, 0x79, 0xc6, 0xb2, 0xf7, 0x73, 0x8b, 0x2c, + 0xeb, 0x28, 0x66, 0xb3, 0xc3, 0x94, 0x34, 0x6a, 0x4c, 0x25, 0xc1, 0x5f, + 0x1a, 0x08, 0xb1, 0x7d, 0xee, 0x1e, 0xf5, 0x97, 0xe1, 0xc1, 0x6d, 0xba, + 0xb2, 0xff, 0x40, 0xa2, 0x7f, 0xfc, 0x7c, 0xb2, 0xa0, 0xf8, 0xf6, 0x2b, + 0xbf, 0x3f, 0x4d, 0x98, 0xb2, 0xc6, 0x47, 0x91, 0xbc, 0x8a, 0xfb, 0x0b, + 0xfe, 0x2c, 0xbc, 0x12, 0xdd, 0x59, 0x7f, 0xe7, 0x6b, 0xa6, 0xf2, 0xf1, + 0xec, 0xb2, 0x9c, 0xf7, 0x88, 0x7e, 0xfb, 0x6e, 0x7c, 0x6b, 0x2f, 0xff, + 0x47, 0xd2, 0x36, 0x35, 0x84, 0x3e, 0xc2, 0xca, 0xc4, 0xc3, 0xb5, 0x08, + 0x0e, 0x10, 0x00, 0x92, 0xfc, 0xe3, 0x12, 0x09, 0x65, 0xfe, 0x30, 0x6e, + 0xf6, 0x33, 0x65, 0x97, 0xfe, 0xd7, 0x84, 0x27, 0x0e, 0x10, 0x56, 0x5f, + 0xf9, 0xa7, 0x96, 0xb0, 0xfb, 0x03, 0x59, 0x7c, 0x17, 0x70, 0xaa, 0x2c, + 0x45, 0xfb, 0x5a, 0x72, 0xf2, 0xcb, 0xe7, 0x1f, 0x40, 0xb2, 0xf1, 0x9b, + 0x4b, 0x2f, 0xe8, 0x8f, 0x98, 0xe3, 0x59, 0x78, 0x05, 0x25, 0x97, 0xf8, + 0x31, 0x9a, 0xff, 0xff, 0x2c, 0xad, 0x93, 0xea, 0x91, 0x3e, 0x1b, 0x19, + 0xf6, 0x8f, 0x98, 0x5d, 0xd2, 0x72, 0x22, 0xe0, 0xe7, 0x8b, 0x40, 0x39, + 0x7e, 0xcd, 0x41, 0x0a, 0xb2, 0xc6, 0xb2, 0xc6, 0xb2, 0xd2, 0x14, 0xd0, + 0x7e, 0x21, 0x7e, 0x13, 0x73, 0x35, 0x0b, 0x2f, 0xde, 0xf4, 0x16, 0xcb, + 0x2f, 0x72, 0x09, 0x65, 0x41, 0xf7, 0x61, 0x59, 0x94, 0x5f, 0xf0, 0x36, + 0x2c, 0x1f, 0x40, 0x2a, 0xca, 0x15, 0x1f, 0xdd, 0x84, 0xb9, 0x16, 0x5f, + 0xfd, 0x19, 0xcc, 0x21, 0x9f, 0xf0, 0x4b, 0x2f, 0x14, 0x6c, 0xb2, 0x88, + 0xf7, 0x40, 0x83, 0x7d, 0x1a, 0x86, 0x2c, 0xa9, 0x1e, 0x17, 0x08, 0x6f, + 0xdf, 0x87, 0xa6, 0xdb, 0x59, 0x7b, 0xb9, 0xfa, 0xcb, 0xfb, 0xee, 0x76, + 0x0f, 0xcb, 0x2e, 0x7f, 0x2c, 0xa3, 0x3c, 0x46, 0x17, 0x5f, 0xff, 0x7b, + 0x3e, 0x91, 0x03, 0xce, 0x65, 0x03, 0x59, 0x71, 0xfe, 0xb2, 0xf3, 0xc7, + 0xcb, 0x2b, 0x13, 0x30, 0x09, 0x6e, 0x98, 0x7c, 0x43, 0xb8, 0x9c, 0xde, + 0x2f, 0x7f, 0xfe, 0x7d, 0x49, 0x85, 0x1a, 0x81, 0xe4, 0xd1, 0xd5, 0x97, + 0xdb, 0xc0, 0xfc, 0x59, 0x63, 0x59, 0x7e, 0x3d, 0x1b, 0x4d, 0xb5, 0x95, + 0x24, 0x5a, 0x1a, 0xa4, 0xc4, 0x9d, 0x10, 0xbf, 0xe1, 0xf7, 0x19, 0x8f, + 0xad, 0x96, 0x5f, 0xbd, 0xe7, 0x97, 0x16, 0x5f, 0xf8, 0x19, 0xf0, 0xf7, + 0xf7, 0x1e, 0x65, 0x95, 0xf1, 0xf5, 0x6f, 0x28, 0xb4, 0x96, 0x5e, 0xfb, + 0x8e, 0xb2, 0xfb, 0x31, 0xae, 0x2c, 0xa8, 0x3d, 0x0c, 0x11, 0xf0, 0xed, + 0xb7, 0xac, 0xb8, 0x04, 0xb2, 0xcd, 0xb5, 0x95, 0x09, 0xc1, 0xe4, 0x28, + 0xf4, 0xeb, 0xf9, 0x6f, 0x04, 0xfc, 0x2d, 0x7f, 0xb8, 0x26, 0x6b, 0x32, + 0x65, 0x97, 0xef, 0xb9, 0x1a, 0xe2, 0xcb, 0xfe, 0x7f, 0x70, 0x60, 0x7d, + 0x49, 0x65, 0xfe, 0xdb, 0xe9, 0x70, 0x8e, 0x65, 0x97, 0xde, 0x20, 0x6c, + 0xb2, 0xa0, 0xf6, 0x48, 0xda, 0xa1, 0x30, 0xfc, 0x34, 0x22, 0x90, 0x42, + 0x4a, 0xfe, 0xd4, 0xbf, 0xcc, 0x99, 0x65, 0xf3, 0xc1, 0xee, 0x2c, 0xac, + 0x3d, 0x2d, 0x17, 0xdf, 0x48, 0x4e, 0xc2, 0xcb, 0xda, 0x89, 0x2c, 0xa7, + 0x37, 0xfb, 0xc8, 0xef, 0xcc, 0xc3, 0xd4, 0xcb, 0x2d, 0xba, 0xb2, 0xa0, + 0xde, 0x39, 0x45, 0xf0, 0x90, 0xdf, 0xc5, 0x97, 0xbb, 0x1d, 0x59, 0x4b, + 0x2d, 0x83, 0x34, 0xec, 0x1c, 0xbe, 0xd1, 0xb5, 0xba, 0xb2, 0x88, 0xf3, + 0x38, 0x4d, 0x7f, 0xfb, 0x46, 0xc8, 0xfb, 0xb0, 0x32, 0x7d, 0xd5, 0x94, + 0x34, 0xc1, 0xb9, 0x09, 0x9f, 0x10, 0xdf, 0xbe, 0x0f, 0x63, 0x4b, 0x2a, + 0x15, 0x21, 0x1b, 0x07, 0x57, 0x9e, 0x32, 0x50, 0x1b, 0x5f, 0xdf, 0x07, + 0xb1, 0xf3, 0x7a, 0xcb, 0xf8, 0xc9, 0xd9, 0x1d, 0x59, 0x7f, 0xfa, 0x19, + 0x12, 0x19, 0x47, 0x5f, 0x34, 0xb2, 0x96, 0x54, 0x8f, 0x4b, 0x71, 0x1e, + 0xfc, 0x51, 0xd8, 0xdd, 0x59, 0x7b, 0xd9, 0xfa, 0xcb, 0xf9, 0x87, 0xce, + 0x18, 0xd6, 0x5e, 0x7d, 0x0a, 0xb2, 0x80, 0x79, 0x4d, 0x16, 0xdf, 0xe0, + 0x96, 0x6f, 0x2c, 0xe2, 0xcb, 0xfd, 0xbb, 0x38, 0x48, 0x27, 0x15, 0x65, + 0xfe, 0x93, 0xe1, 0x67, 0xb8, 0xb2, 0xb0, 0xfa, 0xbe, 0x39, 0xbf, 0xf6, + 0x7d, 0x2e, 0xc7, 0x05, 0xec, 0x2c, 0xa8, 0x55, 0x0f, 0x23, 0x3f, 0x9f, + 0x4c, 0x96, 0x62, 0x9d, 0x33, 0xf4, 0x8c, 0xa1, 0x3a, 0xde, 0x45, 0x7d, + 0xe7, 0x7d, 0x96, 0x5b, 0x71, 0x65, 0xd2, 0xe2, 0xcb, 0x3c, 0x8d, 0x5f, + 0xc2, 0x97, 0xde, 0x32, 0x69, 0x25, 0x80, 0xb2, 0xd1, 0x86, 0xcf, 0xa4, + 0x57, 0x66, 0x96, 0x5f, 0xe2, 0xf7, 0x3e, 0xe3, 0xee, 0xac, 0xbf, 0xb0, + 0x7b, 0xb9, 0xf6, 0xea, 0xca, 0x73, 0xeb, 0x23, 0x7a, 0xdd, 0x4d, 0xb5, + 0xd3, 0x7f, 0x5a, 0x22, 0x50, 0x42, 0x06, 0xff, 0xcc, 0x04, 0xdf, 0x72, + 0x26, 0x3d, 0xeb, 0x2f, 0xf7, 0x61, 0x85, 0x1f, 0x49, 0x65, 0xed, 0x6b, + 0x16, 0x5e, 0xfa, 0x5c, 0x59, 0x77, 0x4f, 0x86, 0xe9, 0xa1, 0xcb, 0xd0, + 0xd4, 0x96, 0x5f, 0xf6, 0x7b, 0x9a, 0xce, 0x47, 0xcb, 0x28, 0x27, 0xac, + 0x63, 0xb7, 0xfe, 0x86, 0x84, 0xdb, 0x98, 0xc8, 0xdd, 0x59, 0x73, 0xb4, + 0xb2, 0x86, 0x9b, 0x60, 0x5b, 0x7b, 0x08, 0x3f, 0x10, 0xef, 0x44, 0xbb, + 0x38, 0xb2, 0xe6, 0xfd, 0x2c, 0xa8, 0x54, 0x65, 0x91, 0xd8, 0x08, 0xa4, + 0xde, 0x2d, 0x7f, 0xf7, 0x5c, 0xfd, 0x2c, 0x14, 0xb3, 0xf5, 0x97, 0xbb, + 0x8d, 0x2c, 0xbf, 0xcc, 0x3e, 0x74, 0xe0, 0xd6, 0x5f, 0x8a, 0x68, 0xec, + 0x2c, 0xa5, 0x97, 0x60, 0xd6, 0x5d, 0xfb, 0xfc, 0x68, 0x77, 0x85, 0xdf, + 0xb3, 0xbf, 0x3e, 0xea, 0xcb, 0xef, 0xf9, 0x04, 0xb2, 0xff, 0x6b, 0xae, + 0x7c, 0x3d, 0xeb, 0x2e, 0x14, 0xd6, 0x54, 0x1f, 0x6e, 0x11, 0x39, 0xa5, + 0xff, 0xdd, 0xc2, 0x27, 0xf4, 0xe9, 0x43, 0x16, 0x5f, 0x9f, 0xc0, 0x71, + 0x16, 0x51, 0xaa, 0x3a, 0xdd, 0x44, 0x60, 0xeb, 0x98, 0xfe, 0x90, 0x46, + 0x1c, 0x84, 0xc7, 0x8b, 0x00, 0x89, 0x7f, 0x35, 0x1a, 0xd3, 0xcc, 0xb2, + 0xff, 0x87, 0x01, 0x13, 0xff, 0xe3, 0xe5, 0x97, 0xfc, 0xfa, 0xc6, 0x1e, + 0xe4, 0x31, 0x65, 0x04, 0xfd, 0xc0, 0x7b, 0x7d, 0x9a, 0xce, 0x2c, 0xbe, + 0xf4, 0x7d, 0x25, 0x97, 0xf1, 0xff, 0xb8, 0x47, 0xfa, 0xca, 0xd8, 0xf5, + 0x34, 0x47, 0x7f, 0xf7, 0x5c, 0xfd, 0x9a, 0xfd, 0x8f, 0x25, 0x97, 0x87, + 0xd3, 0x59, 0x46, 0x7c, 0x00, 0x44, 0xbe, 0x22, 0x8d, 0x96, 0x5e, 0xf6, + 0x08, 0xb2, 0xa1, 0x50, 0xfe, 0x42, 0x9b, 0xa4, 0x4e, 0xeb, 0xc8, 0x41, + 0x80, 0x85, 0xbc, 0x86, 0xfe, 0x28, 0x94, 0x6f, 0x85, 0x97, 0x47, 0xeb, + 0x2f, 0x80, 0x6d, 0xec, 0x59, 0x7f, 0x6f, 0xd3, 0xc1, 0xee, 0x2c, 0xb8, + 0xf6, 0x59, 0x6c, 0x59, 0x46, 0x8c, 0x19, 0x8b, 0x74, 0x2e, 0xc2, 0x57, + 0x31, 0x21, 0x7b, 0xf6, 0x77, 0x79, 0xe9, 0x65, 0xf6, 0xde, 0xc0, 0xac, + 0xbf, 0xce, 0x28, 0x9d, 0xec, 0x49, 0x65, 0x39, 0xec, 0x6e, 0x11, 0xdf, + 0xfb, 0xb8, 0x31, 0x9f, 0xd9, 0xf7, 0x96, 0x5f, 0xd3, 0x86, 0x23, 0xeb, + 0x4b, 0x2b, 0x63, 0xf1, 0x1a, 0x05, 0xfe, 0x1e, 0x7b, 0xb0, 0x41, 0x59, + 0x7c, 0xf0, 0x7b, 0x8b, 0x2f, 0xf8, 0x73, 0xb3, 0x91, 0x9a, 0xfd, 0x65, + 0xee, 0x89, 0xc5, 0x95, 0x87, 0xb2, 0xe7, 0x77, 0xf8, 0xc7, 0xe2, 0x7f, + 0xb8, 0xb2, 0xff, 0x7b, 0x87, 0xf6, 0x7d, 0xe5, 0x97, 0x6d, 0x0b, 0x2a, + 0x0f, 0xfd, 0xcc, 0xc0, 0x6b, 0x50, 0x9c, 0xee, 0xc4, 0x63, 0x32, 0xeb, + 0xe1, 0x42, 0x7e, 0x9b, 0xa7, 0x45, 0x1a, 0xdc, 0x8d, 0x36, 0x52, 0x5b, + 0x55, 0x15, 0xb5, 0x96, 0x44, 0x65, 0xdb, 0x26, 0x4a, 0x19, 0xe3, 0x8c, + 0xdb, 0x25, 0x16, 0x0b, 0x09, 0x70, 0xc6, 0x8b, 0xf4, 0x35, 0x0e, 0x35, + 0x29, 0xa3, 0x11, 0xd4, 0x78, 0x0c, 0x8d, 0xaf, 0xb2, 0xb5, 0x1e, 0x56, + 0xb7, 0xf1, 0xfa, 0x14, 0xa8, 0x4e, 0x4a, 0x81, 0xf4, 0xaa, 0x50, 0x46, + 0x63, 0xbd, 0x57, 0x72, 0x10, 0x22, 0x4a, 0x32, 0xbf, 0x37, 0xb8, 0x63, + 0x4b, 0x2f, 0xfc, 0x71, 0xee, 0xb8, 0xb8, 0x5f, 0xac, 0xbf, 0xfc, 0xfa, + 0x9c, 0xfe, 0x9d, 0xef, 0x82, 0x64, 0xb2, 0xba, 0x88, 0xcd, 0xe7, 0xd7, + 0xde, 0xd6, 0x49, 0x65, 0xfd, 0x9e, 0x83, 0x67, 0x16, 0x5f, 0xe1, 0xc4, + 0xb3, 0x59, 0xc5, 0x97, 0xff, 0xd9, 0xad, 0x02, 0x5a, 0xc8, 0xfa, 0x46, + 0xc5, 0x97, 0xb8, 0x27, 0x16, 0x5f, 0xff, 0x67, 0xd2, 0xf0, 0x36, 0x9f, + 0xd7, 0x61, 0xf1, 0x65, 0xff, 0xbd, 0x0c, 0xe4, 0x1e, 0xcf, 0xe5, 0x97, + 0xf3, 0xee, 0xbe, 0x7d, 0xe5, 0x95, 0xf1, 0xf7, 0x74, 0xfa, 0xff, 0x3e, + 0x0c, 0xfe, 0x27, 0x59, 0x58, 0x7a, 0x80, 0x23, 0xbe, 0x8f, 0x49, 0xd6, + 0x5c, 0xd1, 0x2c, 0xbd, 0xe2, 0x85, 0x97, 0x76, 0x7c, 0x2b, 0x53, 0xc8, + 0x5b, 0x19, 0x2c, 0xc4, 0x4c, 0x2c, 0xe9, 0x93, 0xa8, 0x10, 0xf7, 0x23, + 0x16, 0xde, 0x42, 0xd1, 0x08, 0x82, 0xf5, 0x3d, 0x78, 0x76, 0x27, 0x57, + 0x6f, 0xec, 0xd0, 0x5d, 0xc2, 0xa8, 0xb3, 0x57, 0xe0, 0x4d, 0xd3, 0x1a, + 0xcb, 0xff, 0x60, 0xf3, 0x05, 0x19, 0x1e, 0xcb, 0x2f, 0xb5, 0xd7, 0x9e, + 0xc3, 0xe7, 0x22, 0x9b, 0xfd, 0xee, 0xe1, 0xec, 0xc8, 0x59, 0x7f, 0xe8, + 0xd7, 0xfe, 0xe7, 0x70, 0xc6, 0xb2, 0xdb, 0x2c, 0xbd, 0x28, 0xf9, 0x65, + 0xb2, 0x0d, 0x7c, 0xc2, 0x57, 0xc6, 0x4f, 0xb2, 0xca, 0xc4, 0x74, 0x74, + 0xcc, 0x9b, 0xb8, 0x4d, 0x6e, 0xac, 0xbf, 0x76, 0x39, 0xd3, 0x59, 0x7f, + 0xe3, 0xf4, 0x30, 0x9c, 0x5e, 0x9a, 0xcb, 0xa3, 0xab, 0x2f, 0xe2, 0xcd, + 0xfd, 0x79, 0x2c, 0xb4, 0xfd, 0x91, 0x73, 0x82, 0x33, 0x13, 0xf4, 0xf7, + 0xc2, 0xd5, 0x3d, 0x34, 0x76, 0xf8, 0x7a, 0x5f, 0xff, 0x01, 0xf6, 0xd6, + 0x32, 0x7f, 0x63, 0x62, 0x02, 0xca, 0x9e, 0xae, 0x28, 0xe1, 0x40, 0xf2, + 0x9a, 0x48, 0xba, 0xf8, 0xd8, 0x26, 0x96, 0x5f, 0x70, 0xa1, 0xa5, 0x97, + 0xd0, 0x1c, 0xea, 0xcb, 0xe3, 0x2d, 0x01, 0x65, 0xfd, 0xbc, 0x4f, 0x14, + 0x7e, 0xb2, 0xfd, 0xb0, 0x24, 0x08, 0x59, 0x50, 0x7b, 0x46, 0x63, 0x7c, + 0x21, 0x67, 0x16, 0x5e, 0x10, 0xf7, 0x16, 0x5c, 0xc9, 0xf0, 0x9a, 0x1f, + 0xc4, 0x66, 0x45, 0x31, 0x0f, 0x5e, 0xdc, 0x80, 0x04, 0x57, 0x61, 0xac, + 0xbb, 0x06, 0xb2, 0xff, 0xcf, 0x29, 0xf9, 0xa0, 0xbb, 0x85, 0x51, 0x40, + 0x2f, 0xf1, 0xb2, 0x37, 0x7b, 0x9b, 0x2c, 0xb4, 0xf9, 0x22, 0xb7, 0x05, + 0x58, 0x2d, 0xd4, 0xcb, 0xa4, 0xc5, 0x97, 0xf1, 0xf2, 0x62, 0x81, 0xac, + 0xbd, 0xaf, 0xa4, 0xb2, 0x86, 0x79, 0x6e, 0x5b, 0x7e, 0x8f, 0xbc, 0xfa, + 0x59, 0x7e, 0xf7, 0x24, 0x7f, 0xac, 0xbc, 0x37, 0x35, 0x95, 0x24, 0x77, + 0xe3, 0x11, 0x90, 0xb9, 0x40, 0x0a, 0x6f, 0xd3, 0xf2, 0x68, 0x92, 0xcb, + 0xfe, 0x8f, 0x77, 0x19, 0x9a, 0xc5, 0x97, 0xd3, 0x66, 0x05, 0x65, 0xfb, + 0xc2, 0xbf, 0x27, 0xe8, 0xf6, 0x44, 0x37, 0xa9, 0x23, 0x19, 0xa8, 0x41, + 0xd4, 0xf4, 0xcd, 0xa2, 0x30, 0xdb, 0x42, 0xcb, 0x75, 0x65, 0x30, 0xd0, + 0x80, 0x42, 0xf9, 0xb1, 0xbf, 0xee, 0x2c, 0xbf, 0xff, 0x6f, 0x8e, 0x98, + 0xfb, 0x12, 0xe3, 0xf4, 0xf8, 0xb2, 0xfe, 0xe4, 0x30, 0xa2, 0x65, 0x96, + 0xea, 0xcb, 0xc2, 0x14, 0xcb, 0x2d, 0xec, 0x35, 0xff, 0x88, 0xdd, 0x9b, + 0x2c, 0xac, 0x37, 0xc4, 0x4f, 0x7c, 0x6c, 0x89, 0x96, 0x51, 0xa6, 0x63, + 0xfa, 0xb1, 0x42, 0x6b, 0x70, 0x7e, 0xdc, 0x59, 0x7c, 0x33, 0x2f, 0xd6, + 0x54, 0xe3, 0x66, 0xe2, 0x37, 0xff, 0x67, 0xfc, 0x27, 0x17, 0x37, 0x9e, + 0x96, 0x5e, 0x00, 0xf1, 0x65, 0xfd, 0xaf, 0x14, 0x33, 0x8b, 0x2f, 0xff, + 0xda, 0x1b, 0x90, 0xbd, 0xcd, 0xdd, 0x1b, 0x20, 0x55, 0x95, 0x88, 0x86, + 0x01, 0x6d, 0xb7, 0x16, 0x56, 0x26, 0x3c, 0x68, 0xdd, 0x85, 0x17, 0xe4, + 0x57, 0xc1, 0x77, 0x0a, 0xa2, 0xdf, 0x5e, 0xdc, 0x7f, 0x2c, 0xbf, 0xc6, + 0x50, 0xcf, 0xdf, 0xcb, 0x2f, 0xe1, 0x3c, 0xe1, 0x7d, 0x2c, 0xad, 0x22, + 0xb5, 0x85, 0xdd, 0x1f, 0xfc, 0xca, 0xff, 0x8f, 0xb1, 0xf4, 0x6e, 0xe7, + 0xcb, 0x2f, 0xfe, 0x3f, 0x68, 0x1c, 0xeb, 0xcb, 0xf3, 0x59, 0x7f, 0xb3, + 0x6c, 0xf7, 0x1f, 0xcb, 0x2b, 0xa7, 0xf0, 0x48, 0xb6, 0x69, 0x65, 0xff, + 0x39, 0x07, 0x91, 0xd7, 0xdd, 0x59, 0x42, 0x9e, 0x67, 0x84, 0xaf, 0xb0, + 0x8e, 0x65, 0x97, 0xc7, 0x9a, 0xde, 0xb2, 0xfb, 0xe9, 0x6d, 0x0b, 0x2f, + 0x43, 0x5b, 0x8b, 0x2b, 0x0f, 0x13, 0x44, 0x97, 0xbb, 0x1a, 0x59, 0x7e, + 0xe9, 0xeb, 0xae, 0xb2, 0xff, 0xf7, 0x63, 0x6f, 0x67, 0x4b, 0x3d, 0xd3, + 0x59, 0x79, 0x98, 0x35, 0x96, 0x62, 0xcb, 0xfd, 0x1b, 0x0f, 0x1a, 0xe4, + 0xf8, 0x45, 0xce, 0x0e, 0x4c, 0x4e, 0xe9, 0x22, 0x0e, 0x54, 0x93, 0x4f, + 0xec, 0x36, 0xaf, 0xde, 0x97, 0x04, 0xe2, 0xcb, 0xfd, 0xa7, 0xf8, 0x66, + 0x5b, 0x2c, 0xbd, 0xce, 0x8d, 0x65, 0xf8, 0x4f, 0x14, 0x7e, 0xb2, 0x98, + 0x78, 0xdb, 0xc7, 0x6f, 0xfe, 0xf7, 0x0f, 0x90, 0x59, 0xee, 0x9a, 0xcb, + 0xff, 0x3b, 0x7e, 0x8c, 0x5c, 0xe9, 0xc9, 0x65, 0xe2, 0xce, 0xac, 0xa6, + 0x22, 0x7b, 0xa8, 0x5b, 0xd0, 0x6f, 0xc3, 0x8d, 0xd0, 0x31, 0x65, 0xff, + 0x3f, 0x23, 0x08, 0x7d, 0x85, 0x97, 0xfb, 0xb0, 0x33, 0xdf, 0x03, 0x59, + 0x7f, 0xda, 0xcf, 0xba, 0x4f, 0xbb, 0xb2, 0xcb, 0x60, 0xcf, 0xc5, 0x86, + 0x97, 0x73, 0x9a, 0x46, 0x71, 0x42, 0x9e, 0xa1, 0x51, 0x06, 0x43, 0x08, + 0xcc, 0x9e, 0x1f, 0x37, 0x00, 0x55, 0x97, 0xcc, 0x9a, 0x04, 0x59, 0x4c, + 0x37, 0x8e, 0x31, 0x78, 0xcb, 0xcb, 0x2e, 0x07, 0xcb, 0x2f, 0xf9, 0xe5, + 0xee, 0x63, 0x5d, 0x35, 0x97, 0xbe, 0x7e, 0xac, 0xa7, 0x44, 0x4f, 0xe3, + 0x64, 0x30, 0x03, 0x9b, 0xfd, 0x1c, 0xcf, 0xbc, 0x7a, 0x59, 0x7d, 0xcf, + 0x43, 0x16, 0x56, 0x8f, 0x57, 0xf3, 0x3b, 0xda, 0x8f, 0x2c, 0xbf, 0xa6, + 0x71, 0xf4, 0xd8, 0xb2, 0xfe, 0xf1, 0xe0, 0xe1, 0x8b, 0x2b, 0xc7, 0xb4, + 0xd1, 0x75, 0xf3, 0xec, 0x02, 0x59, 0x77, 0x09, 0x65, 0xfd, 0xf7, 0x20, + 0x38, 0xc5, 0x97, 0xcc, 0x0e, 0x12, 0xca, 0x84, 0xd0, 0xf4, 0x46, 0xee, + 0xc4, 0x47, 0xc2, 0x20, 0x0b, 0x08, 0x5d, 0x7e, 0x9a, 0x08, 0xa1, 0x65, + 0xc1, 0xd2, 0xca, 0x33, 0x7b, 0xe2, 0x6b, 0xf3, 0xed, 0x1d, 0x75, 0x97, + 0xfc, 0x4f, 0xee, 0x66, 0xeb, 0xf5, 0x65, 0xc3, 0x62, 0xcb, 0xf6, 0x4d, + 0x28, 0xf9, 0x65, 0x0a, 0x78, 0x04, 0x2f, 0x41, 0x44, 0xe7, 0x5e, 0xaf, + 0xd8, 0x5e, 0x8e, 0x2c, 0xb4, 0x96, 0x5f, 0xef, 0xff, 0x07, 0x37, 0x73, + 0xe5, 0x95, 0x87, 0x96, 0xe2, 0x37, 0xfe, 0x7f, 0xbe, 0xe1, 0x8f, 0x1a, + 0xe2, 0xca, 0x84, 0xee, 0x32, 0x18, 0x7d, 0x23, 0x27, 0x1e, 0x10, 0x5f, + 0xff, 0x3f, 0xda, 0xcc, 0xf9, 0xae, 0x82, 0x3e, 0xe2, 0xcb, 0xfd, 0xe3, + 0xe3, 0x85, 0xf6, 0x59, 0x7e, 0xff, 0xf3, 0x21, 0x56, 0x53, 0x72, 0xd8, + 0x6e, 0x36, 0xa9, 0x0c, 0x46, 0xb7, 0x27, 0x81, 0xc6, 0x81, 0x90, 0xef, + 0x14, 0xf8, 0x30, 0xb4, 0xf9, 0xb4, 0xc8, 0xf7, 0x48, 0x66, 0x8e, 0xdb, + 0x45, 0x2c, 0x2a, 0xec, 0xa9, 0xa7, 0x84, 0x0f, 0xf0, 0xa9, 0x28, 0xf5, + 0x39, 0x0a, 0x0f, 0x47, 0xb0, 0x04, 0xd1, 0x14, 0xdb, 0xcc, 0xef, 0xe7, + 0xfa, 0x7b, 0x1f, 0xcb, 0x2a, 0x7a, 0x77, 0x25, 0x1c, 0x4d, 0xfc, 0x39, + 0xfc, 0xf7, 0x3e, 0x59, 0x7f, 0xf9, 0x82, 0x06, 0x74, 0x6b, 0x46, 0x4e, + 0x15, 0x97, 0x37, 0x6d, 0xca, 0xcb, 0xcc, 0x7f, 0x96, 0x5e, 0xfd, 0xfa, + 0xb2, 0xed, 0xe6, 0xb2, 0xfb, 0x5a, 0xc1, 0x16, 0x5f, 0xf4, 0x49, 0xa7, + 0xd6, 0xb0, 0x45, 0x97, 0xb1, 0xa9, 0xed, 0xd2, 0x34, 0x20, 0x87, 0x07, + 0x66, 0x1d, 0x71, 0x82, 0x23, 0xb7, 0x27, 0xa7, 0x13, 0xb4, 0x63, 0x95, + 0x09, 0xf7, 0x1c, 0x77, 0x77, 0xff, 0xfc, 0xdb, 0x3f, 0x01, 0xf6, 0x9f, + 0x92, 0xec, 0x6b, 0x30, 0x85, 0x59, 0x7f, 0xff, 0xf0, 0x5f, 0x4f, 0xd9, + 0x67, 0xb0, 0x7c, 0x76, 0x66, 0xb6, 0x8f, 0x96, 0x5f, 0xd8, 0x37, 0x66, + 0x12, 0xca, 0x34, 0x4e, 0xe9, 0xca, 0xfd, 0xa0, 0xbb, 0x85, 0x51, 0x4a, + 0x2f, 0xff, 0x9f, 0xc5, 0x9b, 0x6a, 0x3a, 0x7d, 0xcd, 0x2c, 0xbb, 0x8d, + 0x2c, 0xbf, 0xf7, 0x63, 0xf6, 0x3c, 0xb9, 0xc6, 0x96, 0x5e, 0x79, 0x4f, + 0x84, 0x7e, 0xe1, 0x17, 0xe6, 0x9c, 0x4e, 0x10, 0x62, 0xff, 0xa5, 0x3f, + 0x34, 0x17, 0x70, 0xaa, 0x24, 0xe5, 0x31, 0x14, 0x8e, 0xbb, 0x7f, 0xb5, + 0x3f, 0x3b, 0x13, 0x3a, 0xca, 0x9e, 0x7a, 0xee, 0x45, 0x51, 0x18, 0x7a, + 0x9e, 0xd4, 0x8d, 0x79, 0x4b, 0x2b, 0x1e, 0x2c, 0xaf, 0xf2, 0x32, 0xa1, + 0x51, 0x03, 0x1d, 0x59, 0xc6, 0x21, 0xbb, 0x0e, 0x49, 0xa1, 0xcf, 0xa8, + 0x5f, 0xb2, 0xd4, 0x65, 0xf6, 0x5d, 0xcb, 0xc7, 0x1b, 0xfc, 0x63, 0xe5, + 0x29, 0xa7, 0x95, 0x97, 0x0f, 0xa5, 0x0c, 0x80, 0xa3, 0x7c, 0xb0, 0x1b, + 0xf6, 0x82, 0xee, 0x15, 0x44, 0x3e, 0xbf, 0xf3, 0xca, 0x7e, 0x68, 0x2e, + 0xe1, 0x54, 0x4a, 0x6b, 0x4f, 0xc4, 0x40, 0x30, 0xd2, 0xff, 0x4f, 0xcd, + 0x05, 0xdc, 0x2a, 0x88, 0x9d, 0x7e, 0x3f, 0x70, 0x0c, 0x59, 0x7b, 0xb1, + 0x32, 0xca, 0x98, 0xf1, 0x7a, 0x51, 0x7f, 0x81, 0xf0, 0x83, 0x07, 0xb8, + 0xb2, 0xff, 0xf3, 0x68, 0x2b, 0x5b, 0xbb, 0x0d, 0xb3, 0x3a, 0x77, 0x77, + 0x16, 0x5f, 0xb4, 0x17, 0x70, 0xaa, 0x23, 0x15, 0xfd, 0x28, 0xff, 0xa6, + 0xd2, 0xcb, 0xff, 0xf8, 0x04, 0xe2, 0xce, 0xf0, 0xb0, 0x52, 0xce, 0x9b, + 0x16, 0x5f, 0x43, 0x03, 0xfa, 0xcb, 0xff, 0xe9, 0x6c, 0xda, 0x43, 0x73, + 0xb0, 0x75, 0x3a, 0x77, 0x77, 0x16, 0x57, 0x51, 0x11, 0xf9, 0x1d, 0xfd, + 0x9e, 0x8c, 0xfb, 0xcb, 0x2f, 0xfd, 0xe1, 0x60, 0xa5, 0x9d, 0x36, 0x2c, + 0xbf, 0xe1, 0x60, 0xa5, 0x9d, 0x36, 0x2c, 0xbe, 0x01, 0x38, 0xb3, 0x8f, + 0xdb, 0xc7, 0xd7, 0xed, 0x7e, 0x7d, 0x85, 0x94, 0xc3, 0xe3, 0x01, 0xdd, + 0xf1, 0xfd, 0x26, 0xe5, 0x65, 0xfa, 0x74, 0xc5, 0x03, 0x59, 0x69, 0xf0, + 0xae, 0x8f, 0x62, 0x39, 0x1b, 0xe3, 0x1c, 0xc6, 0x8c, 0x2f, 0xec, 0x39, + 0x48, 0x93, 0x91, 0x83, 0x78, 0x8b, 0x70, 0xa2, 0xff, 0xf4, 0xf6, 0x3c, + 0xa7, 0xe6, 0x82, 0xee, 0x15, 0x44, 0xf2, 0xbe, 0x8d, 0xf1, 0xd5, 0x97, + 0xd0, 0x52, 0xe2, 0xcb, 0xb3, 0x8b, 0x2f, 0x7a, 0x18, 0xb2, 0xfd, 0xd3, + 0x2c, 0xde, 0xb2, 0xb4, 0x89, 0xef, 0xc8, 0xdb, 0x64, 0x3e, 0x16, 0x10, + 0x72, 0xfd, 0xc0, 0x0f, 0x18, 0xb2, 0xe9, 0x08, 0xb2, 0xf8, 0x0f, 0xa9, + 0x2c, 0xbc, 0xc0, 0x6e, 0xac, 0xbf, 0x38, 0xfb, 0x1c, 0x59, 0x7f, 0xb3, + 0xbd, 0x8f, 0x9f, 0x75, 0x65, 0xa7, 0xc2, 0x37, 0xe4, 0x50, 0x31, 0x8f, + 0xc8, 0x88, 0x83, 0x84, 0xf5, 0x3d, 0x38, 0xd6, 0xa3, 0x2f, 0xa8, 0x5f, + 0xb4, 0xd8, 0xaa, 0x53, 0x85, 0x3d, 0x85, 0x7f, 0xa5, 0x42, 0xdf, 0xb4, + 0x17, 0x70, 0xaa, 0x22, 0x05, 0xff, 0x9e, 0x53, 0xf3, 0x41, 0x77, 0x0a, + 0xa2, 0x54, 0x5f, 0xda, 0x07, 0x60, 0x82, 0xb2, 0xfe, 0x09, 0xe3, 0x7f, + 0x61, 0x65, 0x41, 0xee, 0x61, 0x6d, 0xa7, 0xe2, 0x3f, 0x18, 0x68, 0x50, + 0xa8, 0xbf, 0x68, 0x2e, 0xe1, 0x54, 0x45, 0x0b, 0xf7, 0x4d, 0x80, 0x1a, + 0xcb, 0xd1, 0xfe, 0x2c, 0xb4, 0xfc, 0x3f, 0x87, 0x34, 0x10, 0xa2, 0xff, + 0x4f, 0xcd, 0x05, 0xdc, 0x2a, 0x88, 0xc9, 0x7e, 0xd0, 0x5d, 0xc2, 0xa8, + 0x99, 0x57, 0xe9, 0x67, 0x9c, 0x2b, 0x2f, 0xd3, 0xd8, 0xf2, 0x9f, 0x87, + 0xb7, 0xf1, 0xa5, 0xfb, 0x41, 0x77, 0x0a, 0xa2, 0xa4, 0x58, 0x96, 0x5d, + 0x26, 0x2c, 0xb0, 0x8b, 0x2d, 0x3f, 0x0f, 0xb7, 0x74, 0xd3, 0x42, 0x00, + 0x17, 0xbf, 0xd3, 0xf3, 0x41, 0x77, 0x0a, 0xa2, 0xba, 0x5f, 0xe9, 0xf9, + 0xa0, 0xbb, 0x85, 0x51, 0x62, 0xaf, 0xfa, 0x39, 0xc8, 0x67, 0xb0, 0x2b, + 0x2f, 0x82, 0xee, 0x15, 0x44, 0xf4, 0xbf, 0x31, 0xe5, 0x3f, 0x02, 0x7c, + 0xda, 0x38, 0xbc, 0xd3, 0x85, 0x65, 0xfd, 0xd8, 0x3d, 0x1b, 0x6d, 0x65, + 0xfa, 0x0f, 0x70, 0xdb, 0xd6, 0x5c, 0xd4, 0xfc, 0x3f, 0x90, 0x8e, 0xb9, + 0x85, 0xff, 0xff, 0xe1, 0xe3, 0x53, 0xcb, 0x05, 0x15, 0xfd, 0xc3, 0x29, + 0xa0, 0x3a, 0xcf, 0x96, 0x5f, 0xff, 0xd9, 0x9d, 0x30, 0xf7, 0x27, 0x96, + 0x7b, 0xa6, 0xd2, 0xcb, 0xff, 0xf4, 0xc5, 0x0c, 0x9f, 0x9c, 0x36, 0x86, + 0xee, 0x2a, 0xcb, 0xb9, 0xe5, 0x97, 0x67, 0x16, 0x5d, 0xcf, 0xd6, 0x5f, + 0x89, 0xd8, 0x50, 0xb2, 0xfe, 0x07, 0x3a, 0xf2, 0x9e, 0xdc, 0x9f, 0x53, + 0x8b, 0xb4, 0x2c, 0x20, 0xc5, 0xed, 0xa3, 0x75, 0x65, 0xda, 0xf2, 0xcb, + 0xf6, 0x7b, 0x86, 0xc5, 0x97, 0xff, 0xa3, 0xef, 0x64, 0xc7, 0xaf, 0x70, + 0x1b, 0xab, 0x2f, 0x3f, 0xd3, 0xe1, 0x15, 0xae, 0x40, 0x42, 0xfe, 0x27, + 0xac, 0x54, 0x49, 0xa8, 0x61, 0x72, 0x31, 0x4a, 0x1a, 0xb3, 0x72, 0x7c, + 0xf4, 0xa7, 0xfa, 0x9e, 0xb8, 0xc9, 0x10, 0xb9, 0x39, 0x6e, 0x77, 0xff, + 0x87, 0x3f, 0xde, 0x06, 0xc2, 0x4d, 0xc0, 0x7c, 0xb2, 0xfc, 0xdd, 0x1c, + 0x01, 0xb6, 0xb2, 0xfc, 0x7d, 0x27, 0x99, 0x65, 0xfa, 0x58, 0x39, 0xd8, + 0xb2, 0xfc, 0xe7, 0xb6, 0xa1, 0x65, 0x36, 0x0f, 0xde, 0x09, 0xfa, 0x53, + 0x73, 0x3f, 0x59, 0x7e, 0xcf, 0x18, 0x38, 0xb2, 0xe6, 0xe9, 0xb5, 0xac, + 0xa6, 0xe8, 0xf8, 0x5b, 0x58, 0xc3, 0x68, 0x4f, 0x7e, 0x6e, 0x0d, 0xd7, + 0x35, 0xe5, 0x97, 0xf8, 0x42, 0xcd, 0x6a, 0x02, 0xb2, 0x9b, 0xa3, 0xe7, + 0x6c, 0x9a, 0x5f, 0x69, 0x9e, 0xf9, 0x65, 0xf9, 0xbb, 0x6c, 0x44, 0x98, + 0xb2, 0xff, 0xcd, 0xa3, 0x72, 0xd9, 0x6c, 0x36, 0x5b, 0x2d, 0xc5, 0xb2, + 0xdd, 0x2c, 0xbf, 0xf3, 0x71, 0x6d, 0x1b, 0x83, 0x71, 0x6e, 0x0d, 0x86, + 0xd6, 0xdc, 0x1b, 0xa5, 0x97, 0xfd, 0xd1, 0xca, 0x7c, 0xb8, 0x53, 0xdb, + 0x08, 0xdd, 0x6d, 0x6d, 0x54, 0xdd, 0x26, 0xdc, 0xda, 0xe3, 0x0e, 0xbf, + 0x9b, 0xb6, 0xc3, 0x1d, 0xc9, 0x65, 0xe0, 0xe7, 0x52, 0x5e, 0x64, 0x71, + 0x65, 0xef, 0xf5, 0x0b, 0x2f, 0x4c, 0x6d, 0x2c, 0xbb, 0x24, 0xb2, 0xec, + 0xfc, 0xcd, 0xa3, 0x8f, 0x5f, 0xbd, 0xf8, 0x85, 0x32, 0xcb, 0xff, 0x3f, + 0x27, 0x73, 0x99, 0x29, 0x42, 0xcb, 0x71, 0x65, 0xfd, 0x01, 0x3d, 0x9c, + 0x96, 0x5f, 0xff, 0x89, 0xc5, 0x3d, 0x44, 0xa5, 0x9c, 0xff, 0xf8, 0x59, + 0x7f, 0x9f, 0xc0, 0xcc, 0x21, 0x56, 0x50, 0xd3, 0x5b, 0xc2, 0xb1, 0x4a, + 0xe6, 0x40, 0xd0, 0x8f, 0x4b, 0x3f, 0x56, 0xbf, 0xff, 0xb4, 0x6d, 0xee, + 0xc9, 0xf1, 0xad, 0x1b, 0x78, 0x41, 0xb2, 0xcb, 0xe3, 0xe8, 0x8c, 0x59, + 0x7f, 0xf8, 0xc5, 0x9d, 0x84, 0xff, 0x70, 0x51, 0x5d, 0x65, 0x04, 0xfc, + 0x48, 0x8e, 0xff, 0xf3, 0xf0, 0xb3, 0xf9, 0xfd, 0x30, 0xbe, 0x96, 0x5c, + 0x4d, 0x2c, 0xbf, 0xbd, 0x34, 0x9f, 0x42, 0xac, 0xbb, 0x02, 0xb2, 0xf0, + 0xf0, 0x57, 0x3c, 0x6f, 0x18, 0x5f, 0x76, 0x18, 0x15, 0x95, 0x08, 0xb2, + 0x75, 0xdf, 0x19, 0xde, 0x1e, 0x75, 0x65, 0xe9, 0x8d, 0xa5, 0x96, 0x1c, + 0x8d, 0xd1, 0x8e, 0x5f, 0xfd, 0x3a, 0x20, 0xa1, 0x93, 0xa7, 0x77, 0x71, + 0x65, 0x41, 0xf9, 0x11, 0x35, 0xff, 0xbb, 0x93, 0x74, 0xfb, 0x1a, 0x85, + 0x97, 0x3f, 0xcb, 0x2f, 0xf3, 0xf1, 0xfa, 0x02, 0xd9, 0x65, 0x11, 0xe5, + 0x00, 0x5e, 0xb6, 0x5d, 0xc5, 0x90, 0xe1, 0xc7, 0x59, 0xa6, 0x76, 0x43, + 0x57, 0xa4, 0x25, 0x0f, 0xdf, 0x43, 0x68, 0x42, 0x06, 0xf8, 0x44, 0x5d, + 0x1a, 0x59, 0x76, 0x75, 0x65, 0xb4, 0x13, 0x59, 0xb8, 0x2d, 0x78, 0x20, + 0xd2, 0xcb, 0xda, 0x7c, 0x59, 0x78, 0x9f, 0xcb, 0x2f, 0x11, 0xf1, 0x65, + 0x9a, 0x6c, 0x1b, 0x68, 0x1b, 0xba, 0x3a, 0xb2, 0xfb, 0x5b, 0xdd, 0x8b, + 0x2f, 0xc5, 0x9e, 0x86, 0x96, 0x5f, 0xfe, 0x39, 0xdd, 0xc9, 0x8f, 0xee, + 0x77, 0x02, 0xb2, 0xfc, 0xc2, 0x7f, 0x71, 0x65, 0xe8, 0xcd, 0x2c, 0xbf, + 0xfc, 0x17, 0xd3, 0xf8, 0xf9, 0x05, 0x1f, 0xac, 0xb4, 0xba, 0x7c, 0x62, + 0x0d, 0xd7, 0xc8, 0xb3, 0xd4, 0x22, 0xaa, 0x15, 0x26, 0xec, 0x54, 0x31, + 0xdc, 0x51, 0x09, 0x59, 0x8b, 0x70, 0x93, 0xc4, 0xe0, 0x8c, 0x02, 0xf9, + 0xcc, 0x46, 0x2c, 0xbd, 0xc6, 0xf6, 0xf5, 0x97, 0xd3, 0xa5, 0xfb, 0x16, + 0x5e, 0xd6, 0x0d, 0x65, 0xfe, 0x7f, 0x44, 0xdc, 0x36, 0x2c, 0xa1, 0x4f, + 0x3f, 0xa3, 0x97, 0xfa, 0x24, 0x59, 0xf7, 0xb1, 0x65, 0xff, 0xf1, 0xf5, + 0xc3, 0x04, 0x39, 0xa5, 0x1a, 0xd9, 0x65, 0xfc, 0x5a, 0x77, 0x7f, 0x2c, + 0xbf, 0xfe, 0xf7, 0x07, 0xac, 0x31, 0x7a, 0xd3, 0x96, 0xcb, 0x2f, 0x88, + 0x78, 0x2a, 0xcb, 0xdd, 0x03, 0x16, 0x54, 0x95, 0x0d, 0xe1, 0x17, 0xc4, + 0x66, 0xeb, 0xa2, 0x3e, 0x99, 0x3a, 0x87, 0x0a, 0xfc, 0xa4, 0x02, 0x2b, + 0xfb, 0xdc, 0x9a, 0x0b, 0x65, 0x97, 0xe2, 0x14, 0xf3, 0x8b, 0x2f, 0xf6, + 0xa5, 0xd3, 0xe1, 0x8d, 0x65, 0xf3, 0xf9, 0xc2, 0xb2, 0x8c, 0xf5, 0x1a, + 0x33, 0xbe, 0x03, 0x6f, 0x9b, 0x2c, 0xbf, 0xf3, 0x4f, 0xfe, 0x07, 0xaf, + 0xff, 0x16, 0x54, 0x1f, 0x4e, 0x14, 0x5f, 0xfb, 0x8f, 0xf4, 0x13, 0x8f, + 0x05, 0x59, 0x46, 0x9b, 0x27, 0x5e, 0xca, 0x11, 0x7e, 0x20, 0xba, 0x3a, + 0xb2, 0xc3, 0x59, 0x4c, 0x34, 0xe4, 0x2d, 0x61, 0x56, 0x5e, 0x2f, 0xe1, + 0x65, 0xc4, 0x39, 0xc6, 0xbb, 0x82, 0x57, 0xf6, 0x71, 0xa7, 0x2d, 0x96, + 0x56, 0x22, 0xa9, 0xd3, 0x88, 0xba, 0xfd, 0xa0, 0x71, 0xc2, 0xb2, 0xf8, + 0x5e, 0x0e, 0x16, 0x54, 0x1e, 0x58, 0x0a, 0x2d, 0xc5, 0x96, 0xc5, 0x96, + 0x61, 0x9a, 0x16, 0xf1, 0x1b, 0xfe, 0xc2, 0x79, 0x72, 0x4d, 0x6c, 0xb2, + 0xfa, 0x5c, 0x32, 0x59, 0x7f, 0xe0, 0x93, 0xf5, 0xfe, 0xcf, 0xbc, 0xb2, + 0xd1, 0x24, 0x4d, 0x7c, 0x74, 0x02, 0x1b, 0xfc, 0xfa, 0x94, 0x04, 0xc2, + 0xb2, 0xa1, 0x72, 0x2b, 0x23, 0x93, 0x38, 0xc4, 0xba, 0xf0, 0xe8, 0x45, + 0x0c, 0x30, 0x1b, 0x5f, 0xfe, 0x15, 0xf3, 0xef, 0x7a, 0x33, 0x79, 0x85, + 0x65, 0xfe, 0x2c, 0xe7, 0x9d, 0xc9, 0x65, 0x0a, 0x7f, 0x9b, 0xd3, 0x2f, + 0xff, 0xfc, 0x7a, 0xd4, 0x09, 0xe3, 0x20, 0x4b, 0x38, 0x30, 0x3e, 0xa4, + 0xb2, 0xff, 0xfe, 0x2c, 0x17, 0x0a, 0x77, 0x3d, 0xdc, 0x60, 0x91, 0xfa, + 0xca, 0x84, 0x65, 0x63, 0x65, 0xfe, 0x03, 0xf0, 0xe6, 0x36, 0x96, 0x51, + 0xa6, 0x89, 0xd8, 0x77, 0x91, 0x0d, 0xee, 0xc1, 0x2c, 0xbd, 0xf7, 0x98, + 0xb2, 0x82, 0x6e, 0x5c, 0x6e, 0xf8, 0x7a, 0x36, 0x96, 0x5e, 0xc0, 0x0d, + 0x65, 0x6c, 0x6f, 0xf8, 0x47, 0x7f, 0x84, 0x7d, 0xe7, 0x31, 0xb4, 0xb2, + 0xff, 0x03, 0x5b, 0x32, 0x33, 0xcb, 0x2f, 0xfb, 0x90, 0xc1, 0xf6, 0x08, + 0x2b, 0x2e, 0x32, 0xc3, 0xec, 0x14, 0xd2, 0xa1, 0x19, 0xe3, 0x85, 0x1d, + 0xe9, 0x03, 0x8b, 0x2f, 0xe1, 0xbe, 0xbf, 0xdc, 0xc5, 0x97, 0xba, 0x26, + 0xf5, 0x97, 0xfd, 0x0c, 0x2c, 0x0e, 0x8f, 0xf5, 0x96, 0x1a, 0xcb, 0xdc, + 0xe6, 0x2c, 0xb0, 0xe0, 0xd6, 0xb8, 0x8d, 0x49, 0x15, 0x5c, 0x20, 0x03, + 0x2d, 0xfd, 0xd7, 0x30, 0xe1, 0x2c, 0xbf, 0xd2, 0xc3, 0xe7, 0x01, 0x0b, + 0x2f, 0xe1, 0xe1, 0x4b, 0xb8, 0xb2, 0xa0, 0xf7, 0x8c, 0xca, 0xff, 0xde, + 0x86, 0x7c, 0x13, 0xfb, 0x34, 0xb2, 0xfd, 0xdc, 0xd1, 0xf1, 0x65, 0xe2, + 0x39, 0x7c, 0x7c, 0xfe, 0x40, 0xbf, 0xf3, 0xe7, 0xf0, 0x4e, 0x3c, 0x15, + 0x65, 0x42, 0x70, 0x1b, 0x42, 0x26, 0x50, 0x87, 0xfc, 0xce, 0xff, 0xf1, + 0x7b, 0x73, 0x26, 0x93, 0xeb, 0x61, 0xc2, 0xcb, 0xff, 0xf8, 0xa5, 0x1e, + 0x7e, 0xf0, 0xdf, 0xdf, 0x88, 0x52, 0x59, 0x7d, 0xef, 0x66, 0xea, 0xcb, + 0xfe, 0x8c, 0x97, 0x70, 0xe5, 0xc5, 0x95, 0xc3, 0xdc, 0xf1, 0x2d, 0xf8, + 0x73, 0x74, 0x1b, 0xab, 0x2b, 0xe3, 0xcf, 0x22, 0x2a, 0xc4, 0xdd, 0x8d, + 0x39, 0xe3, 0x06, 0xbf, 0x68, 0x8f, 0x05, 0x59, 0x73, 0x24, 0xb2, 0xff, + 0x9f, 0x02, 0x3c, 0xd7, 0xe6, 0xb2, 0xda, 0x19, 0xe7, 0xf4, 0x5e, 0xa1, + 0x13, 0xc6, 0xed, 0x7f, 0xd1, 0x2e, 0x14, 0x7e, 0xec, 0x59, 0x7f, 0x1e, + 0xb6, 0x07, 0xf8, 0xb2, 0xfd, 0xe8, 0xc2, 0x0a, 0xcb, 0xef, 0xbd, 0x0c, + 0x59, 0x42, 0x9e, 0x4f, 0xc4, 0xd7, 0xfd, 0x21, 0x3c, 0x7d, 0x32, 0xf2, + 0xcb, 0xff, 0xd1, 0x9f, 0x7b, 0xb1, 0xe2, 0x8f, 0xf8, 0xb2, 0xe8, 0xfd, + 0x65, 0xdd, 0x62, 0xca, 0x09, 0xae, 0xe0, 0xbd, 0x6c, 0x9b, 0x71, 0xbc, + 0x39, 0x27, 0x8e, 0x40, 0xf1, 0x7f, 0xf8, 0x80, 0xf2, 0x60, 0x3d, 0xd8, + 0x03, 0x6d, 0x65, 0xed, 0x8f, 0x4b, 0x2f, 0xfb, 0x87, 0xf7, 0xa6, 0x94, + 0x7c, 0xb2, 0xfd, 0xcf, 0x73, 0x3c, 0xb2, 0xb8, 0x7c, 0x80, 0x3c, 0xbf, + 0x80, 0xdb, 0x39, 0x8d, 0xa5, 0x97, 0x67, 0x56, 0x5e, 0x69, 0xa6, 0x92, + 0x5f, 0xfe, 0xf1, 0xfb, 0x9d, 0x3d, 0xc1, 0x35, 0x12, 0x49, 0x3c, 0xd0, + 0x50, 0xa9, 0xb6, 0x1c, 0x20, 0x5c, 0x8b, 0xc6, 0x60, 0x36, 0xba, 0x63, + 0x59, 0x7f, 0xff, 0x4a, 0x0b, 0x3d, 0xd3, 0xcf, 0x43, 0x0f, 0x52, 0x59, + 0x63, 0xd1, 0xf7, 0xf8, 0x5e, 0xa4, 0xcb, 0xcd, 0x1b, 0x6e, 0x2f, 0x86, + 0x1e, 0x3f, 0x13, 0x98, 0xec, 0xd0, 0xdb, 0xd4, 0x76, 0x0c, 0x8e, 0xff, + 0xb0, 0xd2, 0xfc, 0x84, 0xa3, 0xa6, 0xe2, 0x57, 0xa3, 0xba, 0xdf, 0x0b, + 0xeb, 0xfe, 0xfa, 0x5c, 0xe6, 0x0d, 0xfc, 0xb2, 0xfe, 0xd7, 0xa0, 0x0d, + 0xbe, 0x2c, 0xb6, 0x2c, 0xbe, 0xd1, 0x3e, 0xf5, 0x97, 0xb1, 0xc9, 0x65, + 0xce, 0xd2, 0xca, 0x84, 0x68, 0x0c, 0xe8, 0x53, 0x23, 0x10, 0xd1, 0x1b, + 0x06, 0xaf, 0x7f, 0xcc, 0x59, 0x67, 0x59, 0x7a, 0x3b, 0xc5, 0x95, 0xf1, + 0xac, 0x31, 0x0b, 0xff, 0x40, 0x67, 0x61, 0x40, 0x1b, 0x7c, 0x59, 0x7f, + 0xff, 0x3f, 0x8f, 0xae, 0xc9, 0xd9, 0xc8, 0xcd, 0x61, 0x2c, 0xbf, 0xfb, + 0x8f, 0xf7, 0x39, 0x85, 0xfe, 0xe6, 0x2c, 0xbf, 0xfc, 0x61, 0xe4, 0x6e, + 0x67, 0xa5, 0x2c, 0xe2, 0xca, 0xd2, 0x6a, 0x2c, 0x21, 0x24, 0x3f, 0x2c, + 0xef, 0x48, 0xbe, 0xd7, 0x70, 0x96, 0x51, 0x9f, 0x6b, 0xa6, 0x5f, 0xc3, + 0x12, 0x47, 0xff, 0x16, 0x5f, 0xc5, 0x38, 0x4e, 0x46, 0x2c, 0xbe, 0xf4, + 0x7c, 0xd2, 0xca, 0x0a, 0xaa, 0xae, 0xca, 0x07, 0x72, 0x0f, 0xcc, 0x1a, + 0x2f, 0xbf, 0xff, 0x78, 0x02, 0x78, 0xa3, 0xf7, 0xf7, 0xe2, 0x14, 0x96, + 0x5f, 0xc7, 0xef, 0x61, 0x31, 0x65, 0xcd, 0x75, 0x65, 0xff, 0xe8, 0x20, + 0x89, 0xa7, 0xfc, 0xfd, 0xd8, 0x59, 0x7f, 0x17, 0xbb, 0x9f, 0xba, 0xcb, + 0xf9, 0x93, 0xbb, 0x9f, 0xba, 0xcb, 0xf9, 0xae, 0x66, 0x16, 0xcb, 0x2a, + 0x11, 0x17, 0x85, 0xa6, 0x61, 0x7d, 0x1c, 0x8d, 0xeb, 0x2f, 0xfe, 0x82, + 0x7f, 0x4a, 0x05, 0x76, 0xbc, 0xb2, 0xba, 0x7c, 0xe0, 0x23, 0xbd, 0x39, + 0xc2, 0xb2, 0xa1, 0x52, 0x34, 0x96, 0x42, 0x59, 0xf8, 0xc7, 0x21, 0xab, + 0xe8, 0x4a, 0x37, 0x91, 0x5f, 0xd2, 0x11, 0x8c, 0x3d, 0xd5, 0x97, 0xf4, + 0xb9, 0xe3, 0x8f, 0x96, 0x5f, 0x30, 0x48, 0x25, 0x97, 0xc6, 0x3c, 0x62, + 0xcb, 0xe7, 0x72, 0xfd, 0x65, 0x9a, 0x83, 0xc2, 0x14, 0x86, 0xe0, 0x31, + 0x65, 0xfe, 0x69, 0xe6, 0xc9, 0x46, 0xea, 0xcb, 0xf3, 0x78, 0x26, 0x39, + 0x96, 0x51, 0xa2, 0x93, 0xa5, 0x3c, 0x17, 0x01, 0xbd, 0xff, 0x1b, 0x3b, + 0xf3, 0xee, 0xfb, 0x8b, 0x2f, 0xe0, 0xbf, 0x7b, 0x83, 0x59, 0x50, 0x7d, + 0x40, 0x3d, 0xbf, 0xd0, 0xfa, 0xeb, 0x4e, 0x34, 0x97, 0x34, 0xd2, 0x4a, + 0x19, 0xe6, 0x34, 0x67, 0x7b, 0xc7, 0xba, 0x92, 0x79, 0xa3, 0xbf, 0xbe, + 0x09, 0xf3, 0xa6, 0xb2, 0xf8, 0x12, 0x07, 0x96, 0x54, 0x2b, 0x20, 0xf8, + 0xc8, 0xcb, 0xa6, 0x8c, 0x21, 0x90, 0xa6, 0xe4, 0x24, 0x3c, 0x63, 0xb8, + 0x5d, 0x7c, 0x43, 0xeb, 0xac, 0xbd, 0x8f, 0xba, 0xb2, 0xb0, 0xdf, 0xe8, + 0x86, 0xe6, 0xb8, 0xb2, 0xd8, 0xb2, 0xdf, 0x61, 0xa8, 0xf0, 0xc5, 0xf7, + 0xd2, 0x6c, 0x7c, 0xb2, 0xff, 0xee, 0x70, 0x65, 0x03, 0xec, 0x7b, 0x8b, + 0x2a, 0x11, 0x29, 0x84, 0xe0, 0x29, 0xbf, 0xdd, 0x37, 0x97, 0x8f, 0x65, + 0x97, 0xfe, 0xf1, 0xe9, 0xff, 0x6f, 0xf6, 0x75, 0x65, 0xff, 0x1b, 0x45, + 0x9e, 0x30, 0x7e, 0xb2, 0xfc, 0x7a, 0x1c, 0x6c, 0xb2, 0xff, 0x3e, 0xbd, + 0xc2, 0x31, 0x56, 0x5f, 0xfe, 0xe6, 0x0b, 0x80, 0xd3, 0x8e, 0x3b, 0x0b, + 0x2a, 0x49, 0xc0, 0x7c, 0x5c, 0x66, 0x7b, 0xa8, 0x5d, 0x39, 0x72, 0x8e, + 0x19, 0xdf, 0xf7, 0xbb, 0x9f, 0x82, 0x3e, 0x11, 0x65, 0xff, 0xff, 0x9c, + 0xfd, 0x1d, 0x2c, 0xf7, 0x4c, 0x49, 0x46, 0xf3, 0x2f, 0xd6, 0x5f, 0x83, + 0x8c, 0x8e, 0x2c, 0xbc, 0x02, 0x1a, 0xca, 0xf9, 0x1d, 0x7d, 0x3c, 0x76, + 0xcf, 0xc9, 0xef, 0x61, 0xe9, 0x65, 0xfe, 0x91, 0xb3, 0xbf, 0x3e, 0xea, + 0xcb, 0xe7, 0xd4, 0x49, 0x65, 0xff, 0x3f, 0xd3, 0xbe, 0xe6, 0x10, 0xab, + 0x2b, 0x64, 0x58, 0x7c, 0x36, 0xc3, 0x7f, 0x10, 0xdf, 0x77, 0x74, 0xd8, + 0xb2, 0xf1, 0x47, 0xeb, 0x2a, 0x71, 0xe0, 0xf0, 0x96, 0xfe, 0xf3, 0xb1, + 0x90, 0xc5, 0x97, 0x43, 0x30, 0xf4, 0x7e, 0x24, 0xbf, 0xf4, 0x7d, 0xd8, + 0x60, 0x7a, 0x73, 0x2c, 0xbf, 0x3f, 0xff, 0xfb, 0xab, 0x2a, 0x15, 0x2b, + 0x64, 0x3b, 0x8e, 0x1a, 0x3a, 0x2d, 0x74, 0x0b, 0xf8, 0x87, 0xce, 0x1b, + 0x16, 0x5f, 0x82, 0xfb, 0x63, 0x4b, 0x2f, 0xd1, 0xa1, 0xe1, 0x2c, 0xac, + 0x3f, 0xc2, 0x2d, 0xf1, 0x4d, 0xfa, 0x37, 0x0f, 0xa0, 0x59, 0x7b, 0x72, + 0x04, 0x59, 0x7f, 0xf4, 0x7f, 0x1d, 0x61, 0x38, 0xbd, 0x35, 0x96, 0x6c, + 0xac, 0xbf, 0xbb, 0x04, 0xd3, 0xfc, 0xb2, 0xff, 0xc5, 0x34, 0x61, 0x6d, + 0x9f, 0x79, 0x65, 0x0c, 0xfb, 0x5c, 0xba, 0xf0, 0xa2, 0x31, 0x65, 0xff, + 0xc6, 0x3e, 0xc0, 0x63, 0xf7, 0x2f, 0xd6, 0x5f, 0x34, 0xf0, 0xc5, 0x97, + 0xe7, 0xe6, 0xc7, 0xa5, 0x97, 0xda, 0x30, 0x6c, 0xb8, 0xbd, 0x57, 0xfe, + 0xc3, 0xdf, 0x85, 0x83, 0x79, 0x2e, 0x2f, 0x55, 0xf9, 0xcb, 0xe9, 0x4f, + 0x19, 0xfd, 0x34, 0x61, 0x43, 0x47, 0x23, 0x21, 0x45, 0x7e, 0x17, 0xce, + 0xe4, 0xb2, 0xf1, 0x03, 0x65, 0x94, 0xe7, 0x89, 0xe2, 0x7a, 0x34, 0x46, + 0x93, 0x65, 0x42, 0xb7, 0x51, 0x96, 0x99, 0x56, 0x88, 0x18, 0x88, 0xf0, + 0x82, 0x22, 0x1e, 0x0f, 0xf9, 0x10, 0x11, 0xc9, 0xdc, 0xdd, 0x37, 0x2b, + 0x2f, 0x1c, 0x69, 0x65, 0x36, 0x4d, 0xe7, 0x48, 0x6f, 0xfe, 0xd1, 0xb2, + 0x37, 0x4b, 0x19, 0xf4, 0x2c, 0xa9, 0x1f, 0x5c, 0xc4, 0xb7, 0xc6, 0x4e, + 0x35, 0x97, 0xb6, 0x61, 0xac, 0xa1, 0x9b, 0xd2, 0x20, 0xbf, 0x4b, 0x37, + 0xc4, 0x96, 0x5e, 0xcd, 0x42, 0xca, 0xf9, 0x18, 0x86, 0xc1, 0xa2, 0x0e, + 0x94, 0xdc, 0x53, 0x2c, 0xbf, 0xba, 0xf3, 0x6a, 0x36, 0x59, 0x7f, 0x1f, + 0xdc, 0xee, 0x05, 0x65, 0xff, 0xf6, 0x7b, 0x99, 0x37, 0x63, 0x7e, 0x77, + 0xb0, 0xb2, 0xff, 0xff, 0xfc, 0x79, 0xf7, 0x0f, 0x1a, 0x9d, 0x9f, 0x4b, + 0x87, 0xee, 0x1f, 0xc3, 0x18, 0x36, 0x59, 0x7f, 0xfe, 0x32, 0x1c, 0xe1, + 0x3c, 0x7c, 0x73, 0x20, 0x49, 0x65, 0xf3, 0xed, 0xd3, 0x59, 0x58, 0x9e, + 0x31, 0x8b, 0xcc, 0x5e, 0x45, 0xde, 0x51, 0xdf, 0x08, 0x9d, 0xc5, 0x6b, + 0xc0, 0xd4, 0x96, 0x5f, 0xf9, 0x8e, 0x3d, 0x47, 0xbb, 0x83, 0x59, 0x7f, + 0x3f, 0xbf, 0x10, 0xa4, 0xb2, 0xff, 0x86, 0xee, 0xd7, 0xef, 0xee, 0x2c, + 0xbf, 0xf0, 0xe3, 0xcf, 0x2c, 0xde, 0xe3, 0x59, 0x7f, 0xa4, 0x24, 0x11, + 0x01, 0x8b, 0x2a, 0x72, 0x66, 0xd0, 0x3b, 0xb1, 0xf0, 0xa5, 0xec, 0x3a, + 0x73, 0xfb, 0xfd, 0x12, 0x39, 0xed, 0x34, 0xd2, 0x4b, 0xb3, 0xab, 0x2f, + 0x0b, 0x83, 0x59, 0x7f, 0x75, 0xf4, 0x18, 0xf2, 0xcb, 0x9c, 0x6b, 0x2f, + 0xed, 0x3f, 0x3a, 0xf2, 0x59, 0x6f, 0x96, 0x5c, 0x6d, 0x2c, 0xb8, 0x4f, + 0xd6, 0x54, 0xc6, 0xc3, 0xf1, 0x7b, 0xd2, 0x71, 0xac, 0xb9, 0xa6, 0x96, + 0x54, 0x91, 0xbb, 0x82, 0xc1, 0x2d, 0x34, 0x2e, 0x11, 0xb4, 0x39, 0x7b, + 0xc2, 0x7e, 0x92, 0x79, 0xeb, 0x5f, 0xec, 0x61, 0x8f, 0x60, 0x71, 0x65, + 0xff, 0xfd, 0xfe, 0xe6, 0x6a, 0x3c, 0x61, 0x31, 0xed, 0x05, 0x0b, 0x2f, + 0x67, 0xde, 0x59, 0x6c, 0x23, 0xfa, 0xe2, 0xed, 0x75, 0x1a, 0x9c, 0x85, + 0x75, 0xff, 0x18, 0xf1, 0x87, 0x31, 0xb4, 0xb2, 0xff, 0xf3, 0x8f, 0x30, + 0x85, 0xe7, 0x30, 0xbf, 0x59, 0x7d, 0xd0, 0x38, 0xb0, 0x88, 0x26, 0x1c, + 0xde, 0x28, 0xea, 0xcb, 0xff, 0xfa, 0x4f, 0xce, 0x46, 0x6c, 0x09, 0x0f, + 0x44, 0xed, 0x2c, 0xb4, 0x0d, 0x16, 0x22, 0x9d, 0x18, 0xdd, 0x71, 0x39, + 0x0f, 0x46, 0xb7, 0x7f, 0x1b, 0x03, 0x84, 0x15, 0x97, 0xcf, 0xb7, 0x3a, + 0xb2, 0xb4, 0x79, 0xfc, 0x2c, 0xa9, 0xcb, 0x98, 0x92, 0x16, 0x18, 0xef, + 0xd1, 0xb0, 0x1c, 0xa9, 0x6f, 0x3c, 0xdf, 0xb7, 0x89, 0xd3, 0xf2, 0xcb, + 0xfe, 0xcf, 0x76, 0x35, 0xec, 0x0a, 0xcb, 0xf7, 0xd8, 0x40, 0x99, 0x65, + 0xda, 0x99, 0x65, 0xda, 0x85, 0x95, 0x06, 0xbb, 0x06, 0x2a, 0x19, 0x47, + 0xd9, 0x28, 0x0c, 0xe3, 0xa3, 0xea, 0xd3, 0xce, 0x7e, 0x7e, 0xd2, 0x45, + 0x60, 0x38, 0xdc, 0x57, 0xbf, 0xee, 0x83, 0xdd, 0xcd, 0x1f, 0x16, 0x5e, + 0xe3, 0xcc, 0xb2, 0xff, 0xd9, 0xbe, 0x06, 0x59, 0xec, 0xfd, 0x65, 0xd8, + 0x4b, 0x2d, 0x9f, 0x1e, 0xa6, 0xf3, 0xfb, 0xf7, 0x7d, 0x12, 0x62, 0xcb, + 0x84, 0xfd, 0x65, 0x68, 0xfa, 0xfa, 0x55, 0xf9, 0x45, 0xff, 0xc6, 0x37, + 0xf1, 0xf3, 0x25, 0x9d, 0x59, 0x73, 0xb7, 0xac, 0xbd, 0x9f, 0x79, 0x65, + 0xb3, 0xa7, 0xf1, 0xe4, 0x26, 0xf1, 0x9b, 0xff, 0xbf, 0x10, 0xa4, 0x59, + 0xef, 0x66, 0xcb, 0x2f, 0xda, 0x7d, 0xed, 0xee, 0xb2, 0x86, 0xa9, 0x9b, + 0xe3, 0x9d, 0x43, 0x70, 0xa1, 0x51, 0xe3, 0x7d, 0xe8, 0xd7, 0xed, 0xf8, + 0x46, 0x2a, 0xcb, 0xc4, 0x16, 0xf5, 0x97, 0xff, 0xf7, 0xdc, 0x27, 0xe7, + 0x72, 0x59, 0xd3, 0xd7, 0x5d, 0x65, 0xf6, 0x7d, 0xb6, 0xf5, 0x97, 0xfc, + 0x43, 0xc2, 0x04, 0xb3, 0x8b, 0x2f, 0xbe, 0xe0, 0x3f, 0x59, 0x71, 0x05, + 0x65, 0x41, 0xbb, 0x72, 0x5b, 0xfc, 0x27, 0x8b, 0x36, 0x3d, 0x2c, 0xbe, + 0xf1, 0xf0, 0xd6, 0x54, 0x27, 0x5d, 0x85, 0x26, 0x3f, 0xa5, 0xa7, 0x26, + 0xfd, 0xc8, 0x87, 0xc0, 0x69, 0x7f, 0xf6, 0xd0, 0x27, 0xe0, 0x94, 0x9f, + 0xa0, 0x59, 0x7f, 0xdd, 0x31, 0x9b, 0x6e, 0x08, 0xd6, 0x5f, 0xe7, 0x96, + 0x0f, 0x5c, 0xe2, 0xcb, 0xe8, 0xc1, 0x06, 0xb2, 0xff, 0xfe, 0x91, 0x46, + 0x73, 0x0b, 0xdd, 0xc1, 0x83, 0xdc, 0x59, 0x7f, 0x85, 0x3f, 0x3f, 0x5a, + 0xdd, 0x59, 0x7f, 0x46, 0xdb, 0x99, 0xa8, 0x59, 0x7f, 0xb2, 0x6e, 0xe7, + 0x1c, 0x96, 0x5f, 0xf8, 0x79, 0xf4, 0xb9, 0xee, 0x3f, 0xeb, 0x2b, 0x47, + 0xe6, 0x03, 0x2b, 0xee, 0x73, 0x1a, 0x59, 0x7f, 0x9a, 0x1f, 0x73, 0x7e, + 0x69, 0x65, 0xff, 0xc6, 0xc9, 0xc1, 0xe9, 0xf4, 0x27, 0xc5, 0x97, 0xfb, + 0x25, 0x80, 0x6d, 0xb9, 0x2c, 0xbf, 0xfa, 0x25, 0xd8, 0xfb, 0xd1, 0xd7, + 0xdd, 0x59, 0x50, 0x8f, 0x8d, 0x1b, 0x75, 0x18, 0x8d, 0x6f, 0xff, 0xf1, + 0x96, 0x7d, 0xe1, 0x5f, 0xdd, 0x8e, 0xe6, 0xf7, 0x92, 0xca, 0x1a, 0xb6, + 0x30, 0x99, 0xfc, 0x44, 0x6b, 0x33, 0x1c, 0x6a, 0x14, 0x7d, 0x22, 0xf4, + 0x63, 0x7b, 0xce, 0xee, 0x28, 0x59, 0x7f, 0xc3, 0x3d, 0x46, 0xff, 0xf9, + 0x25, 0x97, 0x43, 0x16, 0x54, 0x1e, 0x97, 0x4f, 0x2b, 0xa8, 0x88, 0xf3, + 0x3d, 0xff, 0x71, 0xfa, 0x63, 0x09, 0xec, 0xb2, 0xff, 0x3c, 0xb0, 0x7c, + 0xe4, 0x2c, 0xbf, 0xbd, 0xd8, 0x64, 0xc4, 0xb2, 0xa1, 0x13, 0x38, 0x73, + 0xf9, 0x95, 0x42, 0xec, 0xf6, 0x4b, 0x9d, 0x78, 0xc5, 0x81, 0x0b, 0xcb, + 0xd0, 0x5e, 0x59, 0x7f, 0xfd, 0x1a, 0xcd, 0xe7, 0xef, 0xc0, 0x5c, 0x31, + 0xac, 0xbf, 0x1e, 0xa5, 0x34, 0x2c, 0xbf, 0xfb, 0xb8, 0x4e, 0x2f, 0x4f, + 0xd2, 0x35, 0x96, 0x3e, 0x9f, 0x5f, 0x0a, 0x2f, 0xff, 0xc6, 0x00, 0x89, + 0xf7, 0xef, 0xc7, 0xd1, 0xfd, 0xfa, 0xcb, 0xf8, 0x1e, 0xe4, 0x7f, 0xb2, + 0xcb, 0xe7, 0xd4, 0x49, 0x65, 0xff, 0xfc, 0x64, 0xe6, 0x5f, 0xea, 0x3a, + 0xe7, 0xe8, 0xea, 0xca, 0x1a, 0x2a, 0x08, 0xc3, 0xc4, 0x37, 0xe3, 0xf7, + 0x01, 0xb2, 0xcb, 0xff, 0xc4, 0x7f, 0xfb, 0xe0, 0x9e, 0x84, 0x81, 0xac, + 0xbf, 0xee, 0x88, 0x30, 0x7b, 0x9f, 0xc2, 0xca, 0x84, 0x44, 0x3a, 0x65, + 0x0d, 0x50, 0x19, 0xc6, 0x04, 0xc2, 0xff, 0x42, 0xc6, 0xfe, 0x7f, 0xdc, + 0xc6, 0x6b, 0x2f, 0x43, 0x21, 0x65, 0x68, 0xf1, 0xf7, 0x96, 0x5f, 0xb4, + 0x00, 0xf6, 0x16, 0x5f, 0xda, 0x9a, 0x47, 0xee, 0x2c, 0xb1, 0x41, 0xeb, + 0xe1, 0x45, 0xfe, 0x99, 0xe6, 0x7f, 0xa5, 0xc5, 0x97, 0xf3, 0xec, 0x73, + 0x1b, 0x4b, 0x2f, 0xff, 0xf3, 0xb5, 0xec, 0xec, 0xe1, 0xe4, 0xd2, 0x7d, + 0x6d, 0xd0, 0x2c, 0xac, 0x46, 0x5b, 0x9b, 0x11, 0x7d, 0xfb, 0x0b, 0x6c, + 0x69, 0x65, 0xf9, 0xd9, 0xd3, 0x69, 0x65, 0x6c, 0x7a, 0x03, 0x28, 0xbf, + 0xe8, 0xd8, 0x49, 0x74, 0x0f, 0xb2, 0xcb, 0xfe, 0x30, 0xe4, 0xce, 0x5b, + 0x36, 0x16, 0x56, 0x22, 0x73, 0x44, 0x64, 0x79, 0x66, 0xca, 0xcb, 0xf4, + 0x6b, 0x59, 0xd5, 0x97, 0x9e, 0x5e, 0x59, 0x7f, 0xfd, 0x02, 0xb5, 0x87, + 0xbd, 0xa7, 0x1c, 0x63, 0x16, 0x5f, 0xc4, 0xe2, 0xc3, 0x21, 0x65, 0x36, + 0x11, 0xad, 0x21, 0x56, 0x13, 0x90, 0xe0, 0x14, 0xaf, 0x6c, 0x28, 0xab, + 0x2f, 0xe9, 0x00, 0x73, 0xc5, 0xdd, 0x59, 0x7f, 0x31, 0xfe, 0x6e, 0xb3, + 0xab, 0x2f, 0x34, 0xfc, 0x59, 0x7f, 0x32, 0x30, 0xbd, 0xc5, 0x97, 0xe8, + 0xdb, 0x24, 0x6b, 0x2f, 0x08, 0x39, 0xf8, 0x8a, 0x3e, 0x99, 0xf0, 0x77, + 0xc5, 0x95, 0x32, 0x65, 0x3d, 0x86, 0xc5, 0x42, 0x6e, 0x63, 0x8d, 0x26, + 0xff, 0xfc, 0x61, 0x86, 0x71, 0xf5, 0x8c, 0x00, 0x5e, 0x4b, 0x2e, 0x3d, + 0xeb, 0x2f, 0xf4, 0x13, 0xf4, 0x05, 0xb2, 0xcb, 0xff, 0xb0, 0xc5, 0x81, + 0x99, 0x3e, 0x85, 0x59, 0x6e, 0xac, 0xa9, 0x23, 0xcb, 0x75, 0x51, 0x83, + 0x04, 0x64, 0x04, 0x3b, 0xc3, 0x86, 0x2c, 0xbf, 0xbf, 0xc9, 0xa3, 0xee, + 0x2c, 0xbf, 0xff, 0xc4, 0xed, 0x77, 0x18, 0xed, 0x7b, 0x98, 0xd0, 0xcd, + 0x8b, 0x2b, 0x11, 0x25, 0x31, 0x85, 0xfe, 0x14, 0xb3, 0x6d, 0x80, 0x4b, + 0x2a, 0x13, 0x06, 0xc8, 0x57, 0x00, 0x8e, 0xfe, 0xeb, 0xca, 0x39, 0x25, + 0x97, 0xfd, 0x9d, 0x3f, 0xb9, 0xd0, 0x71, 0x65, 0xd8, 0x41, 0x3e, 0x7f, + 0xcb, 0x6f, 0xfd, 0xf4, 0xa3, 0xde, 0x87, 0x66, 0xcb, 0x2f, 0xff, 0x67, + 0x5d, 0xd8, 0x4f, 0xa3, 0x8e, 0x2c, 0xb6, 0x31, 0x10, 0xdb, 0xd0, 0x2f, + 0xcf, 0xf8, 0xf0, 0x96, 0x57, 0x4f, 0x44, 0x8a, 0xaf, 0xc7, 0xb9, 0x9a, + 0x15, 0x65, 0xcf, 0x0b, 0x2e, 0x16, 0x4b, 0x2f, 0xdd, 0x3d, 0xe6, 0x15, + 0x97, 0x67, 0x64, 0x78, 0x21, 0x18, 0xa6, 0x22, 0xbb, 0x85, 0x7b, 0x8a, + 0xd7, 0x9a, 0x69, 0xa4, 0x97, 0xfe, 0xd1, 0x01, 0xc4, 0xc9, 0xa1, 0x8b, + 0x27, 0x9a, 0x0b, 0xf7, 0x4e, 0x63, 0x69, 0x65, 0x82, 0xb2, 0xa1, 0x11, + 0x78, 0xa3, 0xa2, 0x9b, 0xfd, 0x03, 0xc9, 0x41, 0x05, 0x65, 0x43, 0x3b, + 0xc7, 0x61, 0xb9, 0x42, 0xf3, 0x25, 0x15, 0x1c, 0x24, 0x37, 0x5e, 0xe6, + 0x87, 0x86, 0xa3, 0x19, 0x64, 0x60, 0x9d, 0x8f, 0x01, 0xe3, 0x1b, 0x28, + 0xd4, 0xb9, 0x09, 0xbf, 0x46, 0x08, 0x08, 0x67, 0xb5, 0x0d, 0xe1, 0x0b, + 0xaf, 0xcc, 0x3d, 0x3f, 0xeb, 0x2f, 0xb5, 0xac, 0xea, 0xcb, 0xfb, 0xa6, + 0xde, 0xde, 0x01, 0x56, 0x54, 0x1e, 0xb8, 0x48, 0xac, 0xdb, 0x59, 0x63, + 0x59, 0x7f, 0xde, 0x8d, 0x73, 0xb0, 0x5e, 0x59, 0x66, 0xda, 0xcb, 0xfe, + 0xf4, 0x6b, 0x9d, 0x82, 0xf2, 0xcb, 0xb9, 0x0b, 0x2f, 0x30, 0x70, 0xb2, + 0xff, 0x17, 0x9e, 0x6e, 0x47, 0x96, 0x51, 0x9e, 0x7b, 0x8e, 0x5f, 0x1b, + 0xe0, 0x56, 0x5f, 0xfb, 0x37, 0x96, 0x72, 0x62, 0x81, 0xac, 0xbe, 0x08, + 0xe3, 0x65, 0x97, 0x7f, 0x0b, 0x2f, 0x70, 0xf4, 0xb2, 0xb0, 0xf5, 0xbf, + 0x23, 0xf0, 0xbd, 0xfe, 0x96, 0x11, 0x8f, 0x09, 0x65, 0xef, 0x72, 0x7c, + 0x27, 0xcd, 0x82, 0xb3, 0x1c, 0x75, 0x97, 0xf2, 0x02, 0x20, 0xe4, 0x25, + 0x7c, 0x5f, 0x77, 0x21, 0x65, 0xe6, 0x0e, 0x16, 0x5f, 0xe2, 0xf3, 0xcd, + 0xc8, 0xf2, 0xca, 0x33, 0xcf, 0x71, 0xcb, 0xe3, 0x7c, 0x0a, 0xcb, 0xff, + 0x66, 0xf2, 0xce, 0x4c, 0x50, 0x35, 0x97, 0xc1, 0x1c, 0x6c, 0xb2, 0xfe, + 0x9b, 0xf3, 0xdd, 0x79, 0x96, 0x5d, 0xfc, 0x2c, 0xbd, 0xc3, 0xd2, 0xca, + 0xc4, 0x44, 0x84, 0x8f, 0xf3, 0x3f, 0x0b, 0xdf, 0xe9, 0x61, 0x18, 0xf0, + 0x96, 0x5f, 0xc4, 0xe3, 0xc1, 0x67, 0xc2, 0xe5, 0x38, 0xc5, 0x70, 0x40, + 0x32, 0x87, 0xa6, 0x84, 0x57, 0x59, 0x7f, 0x20, 0x22, 0x0e, 0x43, 0x23, + 0xc7, 0xb7, 0xff, 0x6a, 0x3e, 0xe1, 0x43, 0x33, 0xef, 0x2c, 0xbf, 0xff, + 0x38, 0xf3, 0x08, 0x51, 0x0a, 0x0b, 0x63, 0xd2, 0xcb, 0xcf, 0xad, 0x97, + 0x20, 0x92, 0xfa, 0x59, 0xf4, 0x97, 0x20, 0x92, 0xf7, 0x0c, 0x6b, 0x90, + 0x49, 0x73, 0x4d, 0x2e, 0x41, 0x25, 0x05, 0x15, 0x33, 0x15, 0x78, 0xc1, + 0xa2, 0x9b, 0x9f, 0xc9, 0x90, 0x48, 0x9e, 0x6f, 0xef, 0xff, 0xfe, 0x19, + 0x40, 0xfb, 0x1e, 0xe4, 0x7a, 0x07, 0x1e, 0xc6, 0x7e, 0xd2, 0xcb, 0xfb, + 0x3b, 0x98, 0x42, 0xac, 0xbc, 0xe5, 0xfc, 0xe5, 0xfd, 0xf8, 0x9c, 0xc8, + 0xd4, 0x30, 0x98, 0x8a, 0x51, 0x9e, 0x70, 0xdb, 0xce, 0x57, 0xdb, 0x98, + 0xfd, 0x59, 0x6c, 0xdd, 0x45, 0x7f, 0xf0, 0x8b, 0xb4, 0x96, 0x5f, 0xd2, + 0x06, 0xde, 0x3d, 0x92, 0x5f, 0x38, 0xfb, 0x8b, 0x2f, 0x0c, 0xd8, 0xb2, + 0xff, 0xdd, 0x8f, 0x19, 0x43, 0x23, 0x8b, 0x28, 0x53, 0xf9, 0x72, 0x1e, + 0x0e, 0x54, 0xc8, 0xd8, 0xec, 0x2a, 0x6f, 0xfa, 0x0a, 0x45, 0x1f, 0xbb, + 0x16, 0x5f, 0xc1, 0x3e, 0x7b, 0x3a, 0xb2, 0xfd, 0x34, 0x74, 0x1a, 0x59, + 0x68, 0x59, 0x7f, 0x8e, 0x40, 0x7e, 0x74, 0xd6, 0x5f, 0xd9, 0xbd, 0xd9, + 0x9d, 0x59, 0x69, 0x24, 0xbc, 0xfa, 0xd9, 0x25, 0x24, 0xa8, 0x37, 0x21, + 0x11, 0x60, 0xed, 0xe8, 0xfc, 0x29, 0x27, 0x9a, 0xda, 0x62, 0x30, 0xca, + 0x12, 0x97, 0x8a, 0x5d, 0x59, 0x50, 0x99, 0xc6, 0x43, 0xd5, 0x84, 0xf7, + 0xf9, 0xf6, 0xc2, 0xd8, 0xf4, 0xb2, 0xfd, 0xaf, 0xd8, 0x7c, 0x59, 0x7f, + 0x08, 0x52, 0xe7, 0x46, 0xb3, 0x0d, 0x4d, 0xfd, 0xee, 0x7e, 0xef, 0xa5, + 0x97, 0xc0, 0x7d, 0x49, 0x65, 0x98, 0xb2, 0xd2, 0x19, 0xb3, 0x98, 0x8a, + 0xa1, 0x11, 0x38, 0xc3, 0x7f, 0xf6, 0x7d, 0xee, 0x19, 0x47, 0xee, 0xc5, + 0x97, 0xa5, 0x1f, 0x2c, 0xbe, 0xc9, 0x8d, 0x8b, 0x2b, 0x64, 0x41, 0xcc, + 0x88, 0xd0, 0xed, 0xfa, 0x26, 0x94, 0x7e, 0x92, 0xf6, 0x17, 0xeb, 0x2f, + 0xff, 0xdd, 0xc3, 0x97, 0x27, 0x7b, 0xb8, 0x30, 0x7b, 0x8b, 0x28, 0x28, + 0x9d, 0xd1, 0x4f, 0x87, 0x2f, 0xfb, 0xf7, 0x2f, 0x4d, 0x9a, 0xc5, 0x96, + 0x35, 0x97, 0xfd, 0xb0, 0x24, 0x3e, 0x81, 0xc9, 0x65, 0xfc, 0x70, 0xcd, + 0xb1, 0xa5, 0x97, 0xec, 0xd9, 0x98, 0xc5, 0x97, 0xb8, 0x7a, 0x59, 0x44, + 0x78, 0x9e, 0x28, 0xbf, 0x89, 0xff, 0xfc, 0x1c, 0x59, 0x7f, 0x18, 0xa2, + 0x43, 0x27, 0x8d, 0x30, 0xcc, 0x10, 0xd1, 0xd7, 0x1c, 0xbc, 0x43, 0x58, + 0xaa, 0xd4, 0xe1, 0xa0, 0xe6, 0x05, 0x1a, 0x2d, 0xfd, 0xde, 0xe6, 0xde, + 0xe2, 0xcb, 0xd9, 0xb0, 0x16, 0x56, 0x1e, 0x61, 0x17, 0xdf, 0xf6, 0x7a, + 0x71, 0x67, 0xe2, 0x7c, 0xb2, 0xa1, 0xb1, 0xc4, 0x95, 0x24, 0x34, 0x66, + 0x39, 0x0e, 0x91, 0x4a, 0x7e, 0x37, 0x32, 0xdd, 0x14, 0xf6, 0x34, 0x87, + 0x34, 0xfd, 0x70, 0xa1, 0x8f, 0xc9, 0x6b, 0x3e, 0x84, 0x96, 0xe1, 0x05, + 0xff, 0xfb, 0x6d, 0x6b, 0x06, 0xec, 0xeb, 0xf8, 0xa2, 0x65, 0x97, 0xff, + 0xff, 0x81, 0xa0, 0x4c, 0x4f, 0xff, 0x39, 0x82, 0xe0, 0x34, 0xe3, 0x8e, + 0xc2, 0xcb, 0xf8, 0x11, 0xad, 0x1e, 0xcb, 0x2f, 0xe9, 0x47, 0xfd, 0x36, + 0x96, 0x5f, 0xce, 0x3e, 0xc1, 0x01, 0x65, 0xf0, 0x45, 0xd7, 0xeb, 0x2d, + 0x3c, 0x68, 0xae, 0x98, 0xb9, 0x85, 0xe4, 0x59, 0x7d, 0x1b, 0xa3, 0x85, + 0x97, 0xcd, 0xfd, 0x00, 0x8b, 0x2f, 0xfa, 0x26, 0x00, 0x9c, 0x3c, 0x25, + 0x97, 0x9a, 0x69, 0xa4, 0x97, 0x4a, 0x12, 0x4f, 0x34, 0x17, 0xba, 0xd9, + 0x69, 0x65, 0x42, 0xab, 0x0d, 0x95, 0xb2, 0x32, 0x70, 0xa2, 0xfc, 0x49, + 0x31, 0x3e, 0x96, 0x77, 0x94, 0x5f, 0xff, 0x1f, 0xa6, 0xcd, 0x69, 0xe6, + 0xcd, 0x67, 0x96, 0x5f, 0xc2, 0xc6, 0xb5, 0x9d, 0x59, 0x7f, 0x6d, 0x34, + 0x9b, 0x3a, 0xd9, 0x65, 0xff, 0xef, 0xd8, 0xf2, 0x9d, 0x03, 0xd9, 0x91, + 0xa5, 0x97, 0xc7, 0x05, 0xe5, 0x97, 0xb6, 0x72, 0x59, 0x5a, 0x44, 0x57, + 0x53, 0xbc, 0x41, 0x7f, 0xe1, 0x41, 0xc9, 0x1e, 0xb6, 0x07, 0xeb, 0x2e, + 0x2c, 0x59, 0x79, 0xfe, 0x69, 0x65, 0x0a, 0x7e, 0xc6, 0x87, 0xd1, 0x5b, + 0xc7, 0x0c, 0x59, 0x73, 0x8d, 0x65, 0xb6, 0xd1, 0xb1, 0xf0, 0xdd, 0xf7, + 0x47, 0x84, 0xb2, 0xff, 0xfa, 0x04, 0xf1, 0x47, 0xef, 0xef, 0xc4, 0x29, + 0x2c, 0xa6, 0xed, 0x53, 0x0e, 0x43, 0x00, 0xe1, 0x4c, 0xec, 0x1c, 0x28, + 0xf1, 0x0d, 0xf0, 0x83, 0xe9, 0xac, 0xbf, 0xf3, 0xfb, 0x8d, 0x67, 0x7f, + 0x7f, 0x2c, 0xbf, 0xff, 0xf6, 0x7a, 0x02, 0x59, 0x85, 0x12, 0xf7, 0x5d, + 0x85, 0x9b, 0xd6, 0x56, 0xc8, 0xcc, 0x19, 0x1b, 0x48, 0x17, 0x84, 0x1c, + 0xcb, 0x2f, 0x48, 0xc9, 0x65, 0xf6, 0xc2, 0x37, 0xb4, 0xb2, 0xff, 0xa3, + 0xae, 0x7e, 0x98, 0xda, 0x59, 0x7f, 0xef, 0xf3, 0x47, 0xfe, 0x7f, 0xa6, + 0x2c, 0xbf, 0xfc, 0x2c, 0x73, 0x51, 0xd2, 0xcf, 0x43, 0x16, 0x5c, 0x01, + 0x16, 0x5f, 0xe2, 0xcd, 0xe7, 0x31, 0xb4, 0xb2, 0xba, 0x79, 0xbc, 0x18, + 0xbf, 0xff, 0x80, 0xfb, 0x04, 0x1b, 0x7b, 0x3a, 0x59, 0xee, 0x9a, 0xcb, + 0xf4, 0x4c, 0x40, 0xe2, 0xca, 0xc4, 0xcf, 0x0e, 0x12, 0xdd, 0x22, 0xf2, + 0xe5, 0xc6, 0x4b, 0x2f, 0xe7, 0x2f, 0xf3, 0xc2, 0xac, 0xa8, 0x55, 0x9f, + 0xb1, 0x94, 0x87, 0xdc, 0x6c, 0x8a, 0x78, 0x73, 0xe8, 0xdf, 0x77, 0xa0, + 0xee, 0x0a, 0xdf, 0x17, 0xa3, 0x71, 0x65, 0xfb, 0x7c, 0x69, 0xfa, 0xb2, + 0xfb, 0xa0, 0x64, 0x2c, 0xb9, 0xf8, 0xb2, 0xe0, 0x36, 0xd6, 0x53, 0x76, + 0x8a, 0x03, 0x24, 0x72, 0x92, 0x22, 0x00, 0xb5, 0xcf, 0x3d, 0xbb, 0x7f, + 0xf1, 0x76, 0xc4, 0x29, 0xdb, 0x98, 0x49, 0xb6, 0x61, 0x4c, 0xda, 0xa5, + 0x6d, 0xae, 0x39, 0x26, 0xd0, 0xd5, 0xb8, 0x1a, 0xc4, 0xef, 0x0e, 0xd2, + 0xc9, 0x25, 0x2a, 0x7c, 0x73, 0xa2, 0xb9, 0x4e, 0x00, 0x16, 0x3c, 0xe0, + 0xcb, 0x00, 0xfa, 0x54, 0xd1, 0xcb, 0x93, 0xdd, 0x86, 0x2c, 0xd2, 0x97, + 0x35, 0x2e, 0xa1, 0x93, 0x88, 0x7d, 0xa6, 0x1e, 0xbc, 0xaf, 0xcf, 0xe5, + 0x09, 0xb6, 0xdb, 0x8a, 0x77, 0x9b, 0x94, 0xf4, 0x0f, 0x56, 0x5f, 0x20, + 0x97, 0x4f, 0xbd, 0xf1, 0xa5, 0x0d, 0xc9, 0x51, 0xe2, 0x4e, 0x00, 0x37, + 0xc6, 0x53, 0x7e, 0x66, 0x1b, 0xfe, 0xb2, 0xf8, 0x2e, 0xe1, 0x54, 0x51, + 0x4b, 0xff, 0xf3, 0xff, 0x01, 0xe9, 0xf3, 0xa7, 0xee, 0xe1, 0x2c, 0xad, + 0x22, 0x08, 0x8b, 0xaf, 0x3c, 0xa7, 0xc2, 0x32, 0xf2, 0x15, 0x37, 0xff, + 0xe1, 0x9c, 0xc5, 0x1e, 0xe7, 0xbe, 0x09, 0x96, 0xcb, 0x2d, 0x3d, 0x88, + 0x90, 0xe1, 0xcd, 0xfe, 0x9f, 0x9a, 0x0b, 0xb8, 0x55, 0x17, 0x42, 0xff, + 0xe9, 0xef, 0x29, 0xf9, 0xa0, 0xbb, 0x85, 0x51, 0x25, 0xaf, 0xda, 0x0b, + 0xb8, 0x55, 0x17, 0x92, 0xe7, 0xde, 0xb2, 0xd3, 0xf0, 0xf3, 0x37, 0x0d, + 0x2a, 0x21, 0x19, 0xab, 0xb4, 0x2c, 0xe4, 0x6d, 0x90, 0x9c, 0x0c, 0x2c, + 0x26, 0x46, 0x62, 0x0f, 0x67, 0x42, 0xdc, 0xfc, 0xaf, 0xfd, 0xab, 0x93, + 0x85, 0xbe, 0x2b, 0x02, 0x0e, 0xf8, 0x50, 0x5f, 0xfe, 0x9e, 0xc7, 0x94, + 0xfc, 0xd0, 0x5d, 0xc2, 0xa8, 0x96, 0x57, 0xcd, 0xd8, 0xbb, 0x8d, 0xda, + 0xcb, 0x36, 0x56, 0x5b, 0xab, 0x29, 0xbb, 0x34, 0xc0, 0x15, 0xbf, 0xc6, + 0x3e, 0xe1, 0x90, 0xab, 0x2f, 0xba, 0xfe, 0x02, 0xcb, 0xee, 0xc6, 0xeb, + 0x16, 0x5f, 0xfb, 0x3a, 0x72, 0x2c, 0xc0, 0x36, 0xd6, 0x5f, 0xfb, 0x0f, + 0x79, 0x90, 0x25, 0x9c, 0x59, 0x78, 0x01, 0x75, 0x95, 0x24, 0xc4, 0xcc, + 0xcb, 0x74, 0x89, 0x84, 0xa4, 0x80, 0x21, 0xf5, 0xfc, 0x3f, 0x01, 0xe5, + 0xc5, 0x97, 0xc7, 0xbb, 0x1b, 0x2c, 0xbf, 0x99, 0x04, 0x2e, 0x6c, 0xb2, + 0xe7, 0x62, 0xca, 0xc3, 0xc4, 0xf1, 0x75, 0xf8, 0x1e, 0x3e, 0xc2, 0xcb, + 0xff, 0x76, 0x3a, 0x62, 0xfb, 0x8f, 0xfa, 0xcb, 0xfe, 0x79, 0x70, 0x1e, + 0x8f, 0x71, 0x65, 0xfc, 0x5e, 0xd4, 0x38, 0x56, 0x5c, 0xfc, 0x59, 0x7f, + 0xfe, 0x77, 0x93, 0xf6, 0x76, 0x6c, 0x0f, 0x1f, 0x61, 0x65, 0x6c, 0x7d, + 0x93, 0x0b, 0x5e, 0x77, 0x0a, 0xa2, 0x33, 0x5f, 0xff, 0xfd, 0x9e, 0xe7, + 0xbc, 0x7d, 0xfa, 0x5c, 0x20, 0x60, 0xa2, 0x9b, 0xc9, 0x65, 0x05, 0x13, + 0x9a, 0x28, 0xbf, 0x8e, 0x19, 0xb6, 0x34, 0xb2, 0xe2, 0x92, 0xcb, 0x31, + 0x65, 0xf8, 0xf5, 0xd7, 0x9f, 0xa3, 0xd5, 0x61, 0x70, 0x82, 0xd6, 0xea, + 0xcb, 0xa3, 0x4b, 0x2c, 0x61, 0x34, 0xfb, 0xc4, 0x6f, 0x8f, 0x4f, 0xa5, + 0x97, 0x73, 0x75, 0x65, 0x9e, 0x46, 0xef, 0xc4, 0x37, 0xff, 0x70, 0xc1, + 0xcc, 0x20, 0x4b, 0x38, 0xb2, 0xf7, 0x23, 0xe5, 0x97, 0xff, 0xcd, 0xb3, + 0xf7, 0x0f, 0xc5, 0x00, 0x7d, 0x0a, 0xb2, 0xb6, 0x5c, 0x21, 0x91, 0x38, + 0xd0, 0x30, 0xe4, 0xe1, 0x31, 0xa8, 0x60, 0x31, 0xe3, 0xae, 0xa4, 0xc7, + 0xc2, 0x6f, 0x21, 0x80, 0x76, 0xff, 0xb4, 0xed, 0x74, 0xe3, 0x50, 0xb2, + 0xff, 0xff, 0x74, 0xfd, 0xe3, 0xe0, 0x9b, 0x46, 0xc5, 0x9f, 0x83, 0x8b, + 0x2f, 0xfa, 0x5c, 0xc8, 0x9d, 0x1c, 0x62, 0xcb, 0xf7, 0x70, 0x9d, 0x8b, + 0x2f, 0xbe, 0xec, 0x71, 0x65, 0xe9, 0x9c, 0x96, 0x5e, 0x8f, 0x71, 0x65, + 0xff, 0xb0, 0x5e, 0x46, 0x10, 0xfb, 0x0b, 0x2b, 0x87, 0xb2, 0x01, 0xca, + 0x92, 0x38, 0x30, 0x9a, 0x62, 0x3e, 0x3a, 0xdf, 0xfd, 0xe3, 0xd3, 0xff, + 0x3b, 0xe9, 0x43, 0x16, 0x5f, 0x8a, 0x25, 0xc7, 0x59, 0x46, 0x7d, 0xdb, + 0xd2, 0x2d, 0xd5, 0x97, 0xff, 0xff, 0x78, 0xd9, 0xa3, 0xcf, 0x88, 0x1e, + 0x8e, 0xce, 0xde, 0x7e, 0x9a, 0x16, 0x5b, 0x31, 0x10, 0xfe, 0x11, 0xbf, + 0xcf, 0x2e, 0x71, 0xca, 0x4b, 0x2e, 0x71, 0xac, 0xbf, 0x49, 0xc8, 0x01, + 0x59, 0x41, 0x37, 0xbf, 0x0b, 0x5e, 0x6d, 0xc6, 0xea, 0xcb, 0xff, 0x79, + 0xcb, 0xf9, 0xc2, 0x67, 0xcd, 0x2c, 0xbe, 0xf7, 0xa1, 0x8b, 0x2f, 0xa5, + 0xe3, 0xd9, 0x65, 0x62, 0x22, 0x45, 0x44, 0x72, 0x2b, 0xc5, 0x81, 0x59, + 0x7f, 0xfb, 0xd0, 0x13, 0xf1, 0xb2, 0x6e, 0x19, 0x2c, 0xbf, 0xcc, 0xcd, + 0x7e, 0x40, 0xfd, 0x65, 0xa4, 0xb2, 0xb1, 0x15, 0x46, 0x36, 0xe9, 0x22, + 0x1a, 0xdf, 0xbf, 0x8f, 0x40, 0xd6, 0x54, 0x2a, 0x0a, 0xc2, 0x23, 0x85, + 0x63, 0xc3, 0x64, 0x07, 0x77, 0xff, 0xc0, 0xf7, 0x3e, 0x94, 0x17, 0xfc, + 0x9c, 0x02, 0x59, 0x7a, 0x3d, 0x0b, 0x28, 0x67, 0xdf, 0xbd, 0x52, 0xf7, + 0x70, 0x96, 0x51, 0x9b, 0xf0, 0x12, 0x5d, 0xd9, 0x96, 0x5f, 0x64, 0xd9, + 0x32, 0xcb, 0xf6, 0x81, 0xec, 0xd9, 0x65, 0xf6, 0x68, 0x70, 0xb2, 0xef, + 0xb9, 0x38, 0xfb, 0x60, 0x8c, 0x8a, 0x68, 0xd1, 0x82, 0xf0, 0x85, 0xbf, + 0xef, 0x73, 0x35, 0xf9, 0x03, 0xf5, 0x97, 0xff, 0xb5, 0x1e, 0xe7, 0x60, + 0xfd, 0xc8, 0xd9, 0x65, 0xf7, 0x9f, 0xb0, 0xb2, 0xfb, 0xdd, 0x06, 0xe2, + 0xcb, 0xfd, 0x91, 0xa7, 0x91, 0xf5, 0x65, 0xfe, 0x36, 0xb9, 0x1d, 0x7d, + 0xd5, 0x95, 0xa3, 0xe7, 0xf1, 0x8d, 0xfb, 0xdd, 0xfb, 0x1b, 0xd6, 0x50, + 0xd3, 0x46, 0xf9, 0x28, 0xc8, 0x59, 0x08, 0xde, 0x91, 0x5f, 0xb8, 0xe2, + 0xf4, 0xd6, 0x5f, 0xf6, 0xe8, 0xfa, 0x0e, 0x7d, 0x27, 0x59, 0x71, 0xf7, + 0x0f, 0x98, 0x05, 0x15, 0x0a, 0x98, 0xf2, 0x38, 0x17, 0x85, 0xb5, 0xe1, + 0x31, 0xb2, 0xb2, 0xff, 0xf0, 0x3f, 0x61, 0x96, 0x7e, 0x58, 0xf3, 0x2c, + 0xbf, 0xc7, 0xd3, 0x82, 0x98, 0x0b, 0x2f, 0xf1, 0xeb, 0x30, 0xbe, 0xf2, + 0xca, 0x83, 0xe4, 0x73, 0x2b, 0xff, 0x00, 0x7a, 0xc0, 0x76, 0x19, 0x8b, + 0x2b, 0x13, 0x2d, 0xd1, 0x0f, 0x61, 0x5d, 0xc2, 0x0b, 0xff, 0xd2, 0x3d, + 0x0f, 0xa0, 0xd6, 0x07, 0xb8, 0xb2, 0xfb, 0xc0, 0x7f, 0x2c, 0xbd, 0xbf, + 0x34, 0xb2, 0xa0, 0xf0, 0x30, 0x8a, 0xbe, 0x45, 0x51, 0x42, 0x2a, 0xe3, + 0x69, 0x65, 0xcd, 0xf8, 0xb2, 0xb8, 0x6c, 0x3c, 0x2f, 0x7f, 0x72, 0x3d, + 0xce, 0x9a, 0xcb, 0xf1, 0x63, 0x35, 0x8b, 0x2f, 0xb5, 0xbf, 0x06, 0xb2, + 0xb0, 0xfd, 0xd8, 0x5a, 0x02, 0x6b, 0xc3, 0xcf, 0x2c, 0xbf, 0xd8, 0x53, + 0xbb, 0x19, 0xba, 0xb2, 0xff, 0xc7, 0xee, 0x60, 0xe6, 0x28, 0x1a, 0xcb, + 0xef, 0xcf, 0xe9, 0x2c, 0xbf, 0xd0, 0x5e, 0x3d, 0x8a, 0x16, 0x5f, 0xfe, + 0x3d, 0x1e, 0xd0, 0x59, 0xdd, 0x03, 0x7a, 0xca, 0x1a, 0x66, 0x0c, 0x1c, + 0xe9, 0xb7, 0xe7, 0xc4, 0x49, 0xe3, 0x1b, 0xff, 0xd0, 0x41, 0x7f, 0x38, + 0xa2, 0x6d, 0x1b, 0x2c, 0xbf, 0xf1, 0x8c, 0x1e, 0xe3, 0xf9, 0xc5, 0x59, + 0x7f, 0x8f, 0x1a, 0xfa, 0x5c, 0x9c, 0x2a, 0x22, 0xdd, 0x32, 0x9b, 0xb6, + 0xdd, 0x6d, 0xb9, 0x57, 0x88, 0xce, 0x76, 0x5a, 0x91, 0x70, 0xda, 0x72, + 0x71, 0x08, 0x58, 0x58, 0x04, 0xe3, 0xe6, 0x43, 0x8c, 0x6a, 0x68, 0x55, + 0xea, 0x15, 0x4c, 0x27, 0xec, 0xa7, 0x97, 0x8c, 0x03, 0xf8, 0x70, 0x94, + 0xa8, 0x9e, 0x46, 0xcf, 0xe8, 0x76, 0x6f, 0x58, 0xdc, 0x84, 0xc0, 0x91, + 0xaf, 0x37, 0xc3, 0x8e, 0xff, 0xbd, 0x03, 0xd6, 0xa1, 0x9c, 0x59, 0x70, + 0xa1, 0x59, 0x7f, 0x32, 0x51, 0x1c, 0x35, 0x97, 0x3f, 0xeb, 0x2a, 0x0f, + 0x0d, 0xcb, 0x2f, 0xce, 0x37, 0x7f, 0x96, 0x5d, 0xe9, 0xf0, 0x8d, 0xb6, + 0x1c, 0xf5, 0x6d, 0xc8, 0x2f, 0xff, 0xfe, 0x07, 0xd2, 0x9e, 0xe5, 0xec, + 0x67, 0x07, 0xd8, 0xd0, 0xdd, 0xda, 0x59, 0x53, 0xd5, 0xa4, 0xe4, 0xa8, + 0xb2, 0x49, 0xbf, 0xfd, 0x3d, 0x8f, 0x29, 0xf9, 0xa0, 0xbb, 0x85, 0x51, + 0x34, 0xaf, 0xff, 0x4f, 0x63, 0xca, 0x7e, 0x68, 0x2e, 0xe1, 0x54, 0x4e, + 0x2b, 0xf4, 0xb3, 0xd2, 0x92, 0xcb, 0xfd, 0xbe, 0x3b, 0x38, 0xa2, 0x4b, + 0x2f, 0xfc, 0xf2, 0x9f, 0x9a, 0x0b, 0xb8, 0x55, 0x14, 0x0a, 0xff, 0xf1, + 0xc3, 0x1c, 0x7a, 0x8f, 0x77, 0x06, 0xb2, 0xfb, 0x85, 0xf4, 0x96, 0x5a, + 0x7f, 0xc9, 0x8a, 0x99, 0x43, 0x0d, 0xba, 0x99, 0xe4, 0x8b, 0xf6, 0x82, + 0xee, 0x15, 0x45, 0xc0, 0xbf, 0x8b, 0x3c, 0x13, 0xe2, 0xcb, 0xa0, 0xd6, + 0x5f, 0x74, 0x0f, 0x25, 0x97, 0xf8, 0xa5, 0x06, 0x3c, 0x62, 0xca, 0xc4, + 0x64, 0x30, 0xd3, 0xa5, 0x9e, 0x15, 0x01, 0x15, 0xfa, 0x53, 0xc5, 0x6c, + 0x0a, 0xb2, 0xa7, 0x9f, 0xd4, 0x24, 0xdc, 0xff, 0xac, 0xbf, 0x4d, 0x28, + 0x29, 0x2c, 0xa5, 0x95, 0x86, 0xcc, 0x8a, 0x2f, 0xe9, 0x60, 0xa5, 0x9f, + 0xac, 0xbd, 0xfe, 0x34, 0xb2, 0xf8, 0xa3, 0x3a, 0xb2, 0xa0, 0xdf, 0x6c, + 0x3d, 0x71, 0xcf, 0xd2, 0x3d, 0x89, 0x2b, 0xc3, 0xe2, 0x36, 0x5f, 0xf4, + 0xa7, 0xe6, 0x82, 0xee, 0x15, 0x44, 0x92, 0xb4, 0xfe, 0xa2, 0x45, 0xd2, + 0xaf, 0xd8, 0xd7, 0xe0, 0xe2, 0xcb, 0x9a, 0xfd, 0x65, 0xfe, 0x7f, 0x16, + 0x6c, 0xe4, 0xb2, 0xfd, 0x13, 0x14, 0x0d, 0x65, 0xc2, 0xb4, 0xb2, 0xfe, + 0x93, 0xeb, 0x61, 0xc2, 0xcb, 0xfb, 0x09, 0xfe, 0x97, 0x16, 0x5f, 0xff, + 0x80, 0x4e, 0x2f, 0x85, 0x82, 0x96, 0x74, 0xd8, 0xb2, 0xfc, 0xcd, 0x60, + 0xfc, 0xb2, 0xff, 0x47, 0xc2, 0x78, 0xa3, 0xf5, 0x95, 0x07, 0xba, 0x02, + 0x8b, 0xf3, 0x7f, 0x60, 0x85, 0x59, 0x7f, 0x9f, 0x62, 0xcd, 0xe0, 0x85, + 0x97, 0x3c, 0xfd, 0x95, 0x20, 0x8c, 0xa8, 0x51, 0x90, 0x98, 0xfc, 0x4f, + 0x30, 0xce, 0x8b, 0x98, 0x5b, 0xc8, 0x59, 0x78, 0x87, 0x70, 0xae, 0xb6, + 0x74, 0x6b, 0xb2, 0xae, 0xbf, 0x82, 0x73, 0x32, 0xd7, 0xf1, 0xb7, 0xf2, + 0x39, 0x5f, 0x47, 0x55, 0xbe, 0x53, 0x5d, 0xff, 0x85, 0x79, 0xf9, 0xa0, + 0xbb, 0x85, 0x51, 0x6a, 0x2f, 0xfc, 0xf2, 0x9f, 0x9a, 0x0b, 0xb8, 0x55, + 0x12, 0xaa, 0xe3, 0x69, 0x65, 0x2c, 0xb4, 0xf1, 0x51, 0x76, 0xc4, 0xdf, + 0x26, 0x37, 0x8b, 0xdf, 0xd9, 0xa0, 0xbb, 0x85, 0x51, 0x14, 0xaf, 0xfc, + 0xee, 0xcc, 0xd7, 0xe4, 0x0f, 0xd6, 0x5f, 0xfa, 0x3d, 0xcc, 0xd7, 0xe4, + 0x0f, 0xd6, 0x5f, 0x1f, 0x21, 0xd6, 0x5f, 0xe2, 0x7f, 0xf9, 0xec, 0x0a, + 0xcb, 0x99, 0x3f, 0xa8, 0xd2, 0x23, 0xfe, 0x20, 0x78, 0x82, 0xa7, 0xa6, + 0xaa, 0xf1, 0x85, 0xdf, 0xe9, 0xf9, 0xa0, 0xbb, 0x85, 0x51, 0x1a, 0x2f, + 0x37, 0x0d, 0xc6, 0xed, 0x65, 0xf3, 0x74, 0xda, 0xad, 0xc1, 0xb8, 0x2c, + 0xb8, 0x1d, 0x59, 0x7f, 0xe1, 0xe3, 0x0f, 0x59, 0xc9, 0xa1, 0x65, 0xff, + 0xff, 0x38, 0x39, 0xdc, 0x18, 0x82, 0x70, 0xc4, 0xf1, 0xf2, 0x61, 0x16, + 0x5f, 0xfe, 0x98, 0xcf, 0xb3, 0x67, 0xa3, 0xd0, 0x35, 0x97, 0x8d, 0xda, + 0x49, 0x46, 0x98, 0x86, 0xe9, 0xf4, 0xcd, 0x8c, 0x4a, 0xbe, 0x0b, 0xb8, + 0x55, 0x14, 0xfa, 0xef, 0x42, 0xca, 0xd1, 0xe2, 0x78, 0xba, 0xff, 0x1f, + 0x8f, 0xdd, 0x07, 0x96, 0x5f, 0xf4, 0xd1, 0xee, 0xbc, 0xd3, 0xb1, 0x65, + 0x68, 0xfb, 0xfc, 0x67, 0x7f, 0xcf, 0x23, 0x1f, 0x62, 0x5c, 0x59, 0x7f, + 0xff, 0x74, 0xe0, 0xa2, 0x69, 0x8f, 0xf8, 0x9a, 0x6c, 0xfd, 0x65, 0xdd, + 0x02, 0xca, 0xc3, 0xf5, 0x02, 0xf5, 0xff, 0xcc, 0x20, 0x74, 0xf5, 0x9c, + 0x9a, 0x16, 0x5f, 0x3c, 0xc7, 0xd5, 0x94, 0x67, 0xcc, 0xc4, 0x4b, 0xef, + 0xbc, 0x0d, 0x2c, 0xbf, 0xf7, 0xb4, 0x09, 0xb8, 0x17, 0x9b, 0x8b, 0x2b, + 0x0f, 0x98, 0x04, 0x97, 0xf9, 0xca, 0x3c, 0x51, 0xe5, 0x97, 0xff, 0x64, + 0xc0, 0x2d, 0xb8, 0x17, 0x9b, 0x8b, 0x2e, 0x7e, 0x2c, 0xbf, 0xef, 0x47, + 0xcf, 0x36, 0xa3, 0x7a, 0xca, 0xdd, 0x3d, 0x2f, 0x0b, 0x5f, 0x03, 0xa7, + 0xa5, 0x96, 0x9e, 0xdd, 0xae, 0xd8, 0xb7, 0x45, 0x6d, 0xc9, 0xdc, 0x46, + 0x4f, 0x90, 0x85, 0x38, 0x48, 0xb0, 0x8b, 0xb0, 0xad, 0x78, 0x43, 0x94, + 0x21, 0xf8, 0x43, 0xe3, 0x00, 0x42, 0x67, 0x70, 0x96, 0xff, 0xf4, 0xf6, + 0x3c, 0xa7, 0xe6, 0x82, 0xee, 0x15, 0x44, 0xd4, 0xbf, 0xb3, 0x41, 0x77, + 0x0a, 0xa2, 0xbb, 0x5f, 0xfe, 0xc6, 0xf3, 0xf1, 0xca, 0x71, 0x47, 0xb8, + 0xb2, 0x96, 0x5c, 0xd4, 0xfe, 0x9e, 0xc3, 0x49, 0xb5, 0x3d, 0x18, 0x67, + 0x09, 0x1b, 0xbf, 0x35, 0x97, 0xb9, 0x0c, 0x59, 0x73, 0x09, 0x65, 0xf0, + 0x5d, 0xc2, 0xa8, 0xaf, 0x97, 0x9a, 0x69, 0xa4, 0x96, 0x24, 0x93, 0xcd, + 0x05, 0x68, 0xfc, 0x18, 0x9d, 0x7a, 0x51, 0xf2, 0xcb, 0xd3, 0x67, 0x56, + 0x5c, 0xfb, 0xd6, 0x5f, 0xf7, 0x5a, 0x7f, 0x72, 0x33, 0x65, 0x97, 0xc4, + 0xff, 0x71, 0x65, 0x61, 0xee, 0x78, 0xea, 0xde, 0x59, 0x7f, 0xc7, 0xac, + 0xd8, 0xe5, 0x83, 0x59, 0x5a, 0x3c, 0x97, 0x11, 0xbe, 0x6f, 0xe8, 0x04, + 0x59, 0x7a, 0x6c, 0x99, 0x65, 0x7c, 0x78, 0xb3, 0x13, 0xdb, 0x4b, 0x29, + 0x65, 0x19, 0x79, 0xa1, 0x1b, 0xb6, 0x15, 0x65, 0x74, 0xdc, 0x38, 0xfd, + 0xa7, 0xb7, 0x15, 0x5e, 0x30, 0x2f, 0xb0, 0xe6, 0x42, 0x1a, 0x62, 0x27, + 0x1d, 0xfc, 0x74, 0x9d, 0x38, 0xd4, 0x06, 0x6d, 0xc7, 0x8b, 0xff, 0xd3, + 0xd8, 0xf2, 0x9f, 0x9a, 0x0b, 0xb8, 0x55, 0x13, 0xda, 0xcd, 0xb5, 0x97, + 0xfc, 0x37, 0x0c, 0x04, 0x04, 0x35, 0x97, 0xd0, 0xde, 0xff, 0x2c, 0xbc, + 0x65, 0xfa, 0xca, 0xd8, 0xfe, 0x7a, 0x71, 0xbc, 0x96, 0xfc, 0x63, 0x8d, + 0x71, 0x65, 0xfb, 0x41, 0x77, 0x0a, 0xa2, 0xe1, 0x5f, 0xee, 0x9c, 0x81, + 0xfc, 0x4c, 0xb2, 0xd3, 0xdb, 0x09, 0xa8, 0x44, 0x23, 0xa4, 0x65, 0x84, + 0xe6, 0x69, 0x7f, 0xf4, 0xf7, 0x94, 0xfc, 0xd0, 0x5d, 0xc2, 0xa8, 0x93, + 0xd7, 0xfe, 0x39, 0xa7, 0xc0, 0x23, 0xd1, 0xfa, 0xca, 0x86, 0xc0, 0xd3, + 0x68, 0xe7, 0xa4, 0x56, 0x2c, 0xef, 0x90, 0x61, 0xf7, 0x34, 0x63, 0xba, + 0x96, 0x35, 0xd8, 0x57, 0xf2, 0x3a, 0xad, 0xeb, 0x2d, 0x2a, 0x5f, 0xe9, + 0xf9, 0xa0, 0xbb, 0x85, 0x51, 0x15, 0x2f, 0xda, 0x0b, 0xb8, 0x55, 0x14, + 0xca, 0xfe, 0x3e, 0xe3, 0xfd, 0xfa, 0xcb, 0x4f, 0xc3, 0xe2, 0xdc, 0x34, + 0xbf, 0xfd, 0x3d, 0x8f, 0x29, 0xf9, 0xa0, 0xbb, 0x85, 0x51, 0x33, 0xaf, + 0xff, 0x4f, 0x63, 0xca, 0x7e, 0x68, 0x2e, 0xe1, 0x54, 0x51, 0xaa, 0xd9, + 0x38, 0x31, 0xc2, 0x8c, 0x52, 0xcf, 0x2d, 0x5f, 0xf9, 0xe5, 0x3f, 0x34, + 0x17, 0x70, 0xaa, 0x23, 0xa5, 0xff, 0xda, 0xda, 0x7f, 0x0b, 0x3d, 0xc8, + 0x62, 0xcb, 0xff, 0xfd, 0xa9, 0x4f, 0xc2, 0x07, 0x80, 0x2f, 0xbe, 0x09, + 0xeb, 0x8b, 0x2a, 0x7a, 0x3e, 0x61, 0x30, 0xd1, 0xee, 0x07, 0x56, 0x5f, + 0x04, 0x20, 0x0a, 0xcb, 0xf6, 0x10, 0xf3, 0x65, 0x97, 0xfc, 0x7a, 0xe1, + 0x60, 0xfb, 0x0b, 0x2f, 0xf4, 0x40, 0x73, 0x5a, 0xc5, 0x94, 0x68, 0x8f, + 0xe9, 0x39, 0x1b, 0xdf, 0xb3, 0x41, 0x00, 0xab, 0x2f, 0xf8, 0x30, 0xcc, + 0x36, 0x46, 0xea, 0xcb, 0xff, 0x16, 0x0a, 0xf3, 0x73, 0xb0, 0x35, 0x97, + 0xa6, 0x7f, 0x2c, 0xbe, 0x0b, 0xb8, 0x55, 0x14, 0xd2, 0xfd, 0x9f, 0x34, + 0xfd, 0x59, 0x7f, 0xf7, 0x30, 0x87, 0x13, 0x9b, 0x8e, 0xff, 0xcd, 0x65, + 0x0d, 0x36, 0x4c, 0x29, 0x33, 0xa9, 0x8f, 0xf4, 0x3a, 0x45, 0xdc, 0x29, + 0xbf, 0xff, 0xec, 0x2f, 0x70, 0xc3, 0x85, 0xc0, 0xf4, 0xfa, 0x11, 0x36, + 0x59, 0x7f, 0xdc, 0x7f, 0xb2, 0x68, 0xef, 0x16, 0x5d, 0xd3, 0x24, 0x50, + 0xf9, 0x9e, 0xff, 0xe9, 0x74, 0xcb, 0x6e, 0x02, 0x35, 0x32, 0xcb, 0xd2, + 0x64, 0x96, 0x5f, 0x7b, 0x8f, 0xfa, 0xcb, 0xfd, 0x1e, 0xe6, 0x8d, 0x98, + 0xb2, 0xf7, 0xfe, 0x35, 0x97, 0xfb, 0x81, 0x3d, 0x68, 0xf6, 0x59, 0x50, + 0x8a, 0x6f, 0x88, 0xdc, 0xcb, 0x83, 0xb7, 0xff, 0xfb, 0x6d, 0x81, 0xa9, + 0xb9, 0xb4, 0x4d, 0xce, 0xe0, 0xcf, 0x7a, 0xcb, 0xfe, 0xde, 0x1e, 0x9f, + 0xfd, 0x36, 0x2c, 0xac, 0x45, 0x29, 0xb4, 0xdf, 0xe0, 0x39, 0x06, 0x76, + 0xdc, 0x59, 0x7f, 0x41, 0x7b, 0x73, 0x3c, 0xb2, 0xff, 0x3f, 0xef, 0xef, + 0x67, 0x56, 0x54, 0x8f, 0x89, 0xa2, 0xfb, 0xee, 0x9e, 0x69, 0x65, 0xdd, + 0x02, 0xca, 0xc3, 0xdb, 0x32, 0x3f, 0xc8, 0x6f, 0x75, 0xaf, 0xd6, 0x5b, + 0xcb, 0x28, 0xcd, 0x87, 0x47, 0xee, 0x1c, 0x2c, 0xbf, 0xff, 0x7b, 0x82, + 0x73, 0x50, 0x3c, 0xe8, 0x70, 0xb6, 0x59, 0x50, 0x7d, 0xb8, 0x2d, 0x7f, + 0x41, 0xfe, 0xfe, 0x02, 0xca, 0xc4, 0x6d, 0x32, 0x11, 0xbd, 0x20, 0xbd, + 0xe8, 0x92, 0xcb, 0xfe, 0x07, 0xbb, 0x93, 0x4a, 0x3e, 0x59, 0x5d, 0x3d, + 0x72, 0x1c, 0xb4, 0xcb, 0x2f, 0xd9, 0xd7, 0x21, 0xac, 0xad, 0x8d, 0xc7, + 0xe2, 0x57, 0x40, 0xab, 0x2f, 0xe7, 0xff, 0x8d, 0xa3, 0x68, 0xda, 0x2c, + 0xbf, 0x8e, 0x19, 0xb6, 0x34, 0xb2, 0xff, 0xfb, 0x3d, 0xdc, 0x96, 0x9c, + 0xbd, 0xd7, 0x92, 0xcb, 0xa3, 0xf5, 0x97, 0xf9, 0xfe, 0x80, 0x98, 0x67, + 0xe9, 0x12, 0x64, 0x5c, 0x22, 0x75, 0x62, 0x77, 0xc6, 0xb3, 0xd2, 0x32, + 0x17, 0xe4, 0x34, 0x6f, 0x3c, 0xdc, 0x59, 0x70, 0x9a, 0x59, 0x7e, 0xff, + 0xb1, 0x2e, 0x2c, 0xbc, 0x40, 0x15, 0x65, 0xe6, 0x9f, 0x65, 0x97, 0xfd, + 0x1f, 0xbf, 0xbf, 0x10, 0xa4, 0xb2, 0xba, 0x7b, 0x24, 0x3d, 0x50, 0x8c, + 0x02, 0x29, 0xf3, 0xb5, 0xa7, 0xb7, 0x2c, 0xb7, 0xb8, 0x17, 0x1c, 0x2c, + 0xb2, 0x39, 0x20, 0xc6, 0x09, 0xf1, 0x69, 0xa3, 0x6a, 0x18, 0x7d, 0x87, + 0x0f, 0xe4, 0x25, 0x0f, 0x3e, 0x46, 0x71, 0xe9, 0x49, 0x20, 0x4d, 0xdc, + 0x1d, 0x12, 0x1b, 0x17, 0xed, 0x05, 0xdc, 0x2a, 0x8a, 0xa9, 0x7f, 0xe7, + 0x94, 0xfc, 0xd0, 0x5d, 0xc2, 0xa8, 0x9b, 0x56, 0x9f, 0x88, 0x80, 0x61, + 0xa5, 0xfe, 0x9f, 0x9a, 0x0b, 0xb8, 0x55, 0x15, 0xfa, 0xfd, 0xa0, 0xbb, + 0x85, 0x51, 0x63, 0x2e, 0x6f, 0x92, 0xcb, 0x4f, 0xc3, 0xce, 0x98, 0xd2, + 0xfd, 0xc0, 0xf6, 0x05, 0x59, 0x7f, 0x88, 0x12, 0xce, 0x3f, 0x96, 0x5f, + 0xcd, 0xd8, 0xdb, 0x96, 0xe4, 0x85, 0x59, 0x7f, 0xc4, 0x0d, 0xa6, 0x94, + 0x6b, 0x65, 0x97, 0x6b, 0xcb, 0x2f, 0x9e, 0x58, 0x35, 0x97, 0xf7, 0xb3, + 0x43, 0xc2, 0x59, 0x6c, 0x19, 0xe6, 0xf8, 0x86, 0xe9, 0x62, 0xcb, 0xf9, + 0xdf, 0xde, 0xce, 0xac, 0xa1, 0x4f, 0x0b, 0x42, 0xd7, 0xf6, 0x6b, 0xdd, + 0xcd, 0x96, 0x5a, 0x7e, 0x27, 0x94, 0xc3, 0x2e, 0x9f, 0x39, 0xe1, 0x32, + 0x71, 0xa4, 0x42, 0x3b, 0x1c, 0xf5, 0x4b, 0xda, 0x8f, 0xce, 0xfd, 0xa0, + 0xbb, 0x85, 0x51, 0x6a, 0xaf, 0xfc, 0xf2, 0x9f, 0x9a, 0x0b, 0xb8, 0x55, + 0x14, 0x12, 0xfd, 0x0d, 0x6e, 0x66, 0x96, 0x5a, 0x7e, 0x22, 0xad, 0x86, + 0x82, 0x26, 0x5f, 0x7b, 0x4f, 0xd5, 0x97, 0xf6, 0x0f, 0x51, 0xee, 0x2c, + 0xbf, 0xa1, 0x8f, 0xf7, 0xa4, 0xb2, 0xb0, 0xff, 0x48, 0x8b, 0x85, 0xb7, + 0xf6, 0x76, 0x7b, 0xeb, 0xcb, 0x2e, 0x76, 0xa7, 0x9e, 0xe7, 0x8b, 0x6f, + 0xf4, 0x17, 0xf1, 0xba, 0xec, 0x59, 0x7f, 0xfa, 0x68, 0xde, 0xfa, 0xe7, + 0x0f, 0x58, 0x2a, 0xcb, 0xfc, 0x73, 0x46, 0xf7, 0xd7, 0x16, 0x5b, 0x8b, + 0x2a, 0x0f, 0x18, 0x8d, 0x6e, 0xd4, 0x2c, 0xa9, 0x23, 0xf8, 0xcd, 0x7b, + 0x09, 0x36, 0xf2, 0x0b, 0xe0, 0xbb, 0x85, 0x51, 0x71, 0x2f, 0xe0, 0x3f, + 0xc3, 0xcd, 0x2c, 0xad, 0x1e, 0xe7, 0x0b, 0xaf, 0xff, 0xd2, 0x13, 0xb2, + 0x7f, 0x3f, 0xe0, 0x27, 0xde, 0x35, 0x97, 0xb6, 0x12, 0x65, 0x97, 0xc7, + 0x2c, 0x15, 0x65, 0xfb, 0x18, 0x6d, 0xe3, 0x59, 0x74, 0x31, 0x65, 0x6e, + 0x9e, 0x06, 0x8a, 0xaf, 0x9d, 0xbc, 0xf6, 0x59, 0x7e, 0xe8, 0x05, 0xc2, + 0x59, 0x7e, 0x1e, 0x6e, 0xc7, 0x56, 0x5e, 0x6f, 0x30, 0xac, 0xa1, 0x9f, + 0x8e, 0x8a, 0x1b, 0xca, 0xaf, 0xf3, 0x1e, 0x5c, 0x31, 0xe2, 0xcb, 0xe8, + 0x16, 0x38, 0xb2, 0xfc, 0x5e, 0x27, 0x15, 0x65, 0x2c, 0xb7, 0x30, 0xd9, + 0x6e, 0x13, 0xdf, 0xcc, 0x7d, 0xf1, 0xa6, 0xf5, 0x97, 0xfe, 0x31, 0xe6, + 0xf6, 0x64, 0xbe, 0x92, 0xca, 0x83, 0xf3, 0xc3, 0x2b, 0xfb, 0x34, 0xfe, + 0x04, 0x2c, 0xbf, 0xfe, 0x72, 0x83, 0x6f, 0xe1, 0xf3, 0x3b, 0x9b, 0x8b, + 0x28, 0x67, 0xfd, 0xbc, 0xb2, 0xff, 0xe3, 0x20, 0x4b, 0x39, 0xc3, 0x1e, + 0x2c, 0xa9, 0x8f, 0x9b, 0xc4, 0x96, 0x9f, 0x0b, 0x9a, 0x79, 0x0a, 0x0f, + 0x88, 0x8d, 0x66, 0x62, 0x0d, 0x31, 0x74, 0x95, 0xe1, 0x2d, 0xf9, 0x91, + 0x19, 0x71, 0x53, 0xd0, 0x9c, 0x12, 0x30, 0x4b, 0xfc, 0xdd, 0x93, 0x73, + 0xed, 0xc6, 0xe4, 0x6b, 0x2f, 0xcd, 0x96, 0xd5, 0xfc, 0x58, 0x59, 0x7f, + 0xe3, 0xf9, 0xb4, 0xe6, 0xa7, 0x4e, 0xee, 0xe2, 0xcb, 0xee, 0xc7, 0x82, + 0xb2, 0x9b, 0x59, 0xf7, 0x8d, 0x36, 0xff, 0xf3, 0x68, 0x2b, 0x5b, 0xbb, + 0x0d, 0xb3, 0x3a, 0x77, 0x77, 0x16, 0x5f, 0xb9, 0xc7, 0xdf, 0x8b, 0x2f, + 0x82, 0xee, 0x15, 0x45, 0xd2, 0xbf, 0x10, 0x3d, 0x1c, 0x59, 0x5a, 0x3d, + 0x5e, 0x97, 0x5f, 0xa0, 0x9c, 0x70, 0xb2, 0xfe, 0x94, 0x7c, 0xfc, 0x92, + 0xcb, 0xe9, 0x37, 0xe7, 0x96, 0x5f, 0x72, 0x1b, 0xf8, 0xb2, 0xa0, 0xf2, + 0x9b, 0xc9, 0x6f, 0x47, 0x9b, 0xd6, 0x5f, 0x60, 0xf0, 0x6b, 0x2f, 0xf9, + 0xf7, 0xc7, 0xb8, 0x00, 0xb6, 0xd6, 0x5f, 0x73, 0x67, 0x11, 0x65, 0xa7, + 0xb7, 0x4a, 0xde, 0x5b, 0x44, 0x68, 0x85, 0x24, 0x8a, 0x06, 0xc7, 0x8f, + 0xc6, 0x45, 0x31, 0x2b, 0x1e, 0x3a, 0x48, 0xe3, 0xe4, 0x43, 0xe3, 0xfb, + 0xff, 0xc5, 0xe3, 0x67, 0x60, 0xc9, 0xf4, 0x2a, 0xcb, 0xf9, 0xfd, 0x0c, + 0x82, 0x59, 0x58, 0x7e, 0x7a, 0x48, 0xbf, 0xf3, 0x38, 0x0f, 0x48, 0xf7, + 0xf4, 0xd6, 0x5f, 0xd9, 0x9c, 0x0f, 0xa1, 0x65, 0xfd, 0xb4, 0x79, 0xc5, + 0x02, 0xca, 0x59, 0x7f, 0xf4, 0x6b, 0xf9, 0xdc, 0xec, 0x31, 0xc9, 0x65, + 0xfe, 0x8d, 0x09, 0xde, 0xe7, 0xeb, 0x2a, 0x47, 0xf7, 0xd4, 0x6b, 0xfa, + 0x4f, 0x27, 0x20, 0xac, 0xbf, 0xfd, 0x9e, 0x86, 0x84, 0xdb, 0x98, 0xc8, + 0xdd, 0x59, 0x66, 0x2c, 0xb4, 0xf6, 0xed, 0x33, 0x4c, 0x84, 0x34, 0xc4, + 0x44, 0x59, 0xe4, 0xfa, 0xd2, 0x77, 0xec, 0x8d, 0x8e, 0xfb, 0x1a, 0x6e, + 0xd8, 0xb2, 0xfe, 0x28, 0xf9, 0x8f, 0xe5, 0x97, 0xff, 0x9a, 0x71, 0xf6, + 0x3e, 0xf4, 0x75, 0xf7, 0x56, 0x58, 0xf4, 0x7f, 0x7d, 0x2d, 0xbf, 0xff, + 0xe0, 0x6a, 0x5c, 0xeb, 0x9e, 0xb5, 0xa0, 0x7c, 0x7a, 0x7e, 0x2c, 0xbf, + 0xf1, 0x3b, 0x5e, 0xce, 0xbc, 0xce, 0xb2, 0xff, 0xfe, 0xe9, 0x01, 0xf7, + 0x72, 0x5d, 0xc1, 0x70, 0x73, 0x01, 0x65, 0xc1, 0xc5, 0x95, 0x07, 0xea, + 0x2a, 0xfd, 0xfe, 0x7f, 0x72, 0x3a, 0x24, 0xcb, 0x2f, 0x4a, 0x18, 0xb2, + 0xf0, 0xbc, 0x92, 0xcb, 0xfd, 0xad, 0x3c, 0xb6, 0xc6, 0x96, 0x5d, 0x30, + 0x16, 0x5a, 0x58, 0x79, 0xad, 0x1a, 0xdf, 0xfd, 0x83, 0x89, 0x46, 0xa0, + 0x47, 0x25, 0x97, 0xfe, 0xdf, 0x92, 0x60, 0xcf, 0x7c, 0x0d, 0x65, 0x31, + 0x10, 0x8e, 0x85, 0x73, 0xcf, 0xd9, 0x56, 0x3c, 0xcd, 0x1a, 0x85, 0x9f, + 0x48, 0x9c, 0xd7, 0x83, 0x9e, 0x6b, 0x12, 0x15, 0x95, 0xd5, 0x6f, 0x45, + 0x2b, 0xba, 0xff, 0x4b, 0x3d, 0xd8, 0x10, 0x96, 0x5f, 0xfb, 0xc6, 0x13, + 0x1b, 0x90, 0xb0, 0xb2, 0xff, 0xa3, 0xee, 0xbf, 0x3d, 0x0d, 0x2c, 0xa8, + 0x3f, 0x7d, 0x1e, 0xdf, 0xe7, 0xf1, 0x03, 0x6f, 0xb7, 0x56, 0x5c, 0x0e, + 0xac, 0xbf, 0x16, 0x75, 0xfc, 0xb2, 0xfe, 0x93, 0xe6, 0xf8, 0x1a, 0xca, + 0x6c, 0x1e, 0xa3, 0x71, 0x26, 0xbe, 0x30, 0x4a, 0x16, 0x5f, 0x67, 0xd0, + 0xc5, 0x97, 0xc6, 0x51, 0xfa, 0xcb, 0xf3, 0xcd, 0x23, 0xf2, 0xcb, 0xff, + 0x40, 0xf5, 0x12, 0x3f, 0xbd, 0x8b, 0x2a, 0x48, 0xca, 0x14, 0x84, 0x24, + 0x5f, 0x90, 0xf8, 0xa2, 0xff, 0xb5, 0xce, 0x98, 0x42, 0x0d, 0x96, 0x5f, + 0xff, 0xfd, 0xa9, 0x07, 0xa6, 0xc6, 0x1b, 0x5c, 0xf8, 0x27, 0x9a, 0x1c, + 0x7c, 0xb2, 0xa1, 0x16, 0x00, 0x3b, 0xbf, 0xff, 0xe8, 0x1f, 0x73, 0xef, + 0x13, 0xf7, 0xf7, 0xe7, 0x1f, 0x41, 0x59, 0x7f, 0xb3, 0x30, 0x51, 0x5e, + 0x4b, 0x28, 0x54, 0x4d, 0x79, 0x9e, 0xfd, 0x9c, 0x0f, 0xa1, 0x65, 0xff, + 0xe3, 0x6b, 0x81, 0xe9, 0xfd, 0xed, 0x6a, 0x16, 0x5f, 0xfd, 0x1a, 0xf3, + 0xcb, 0x9b, 0xc1, 0xa3, 0x59, 0x7f, 0xff, 0xce, 0xd0, 0x99, 0xa2, 0x7f, + 0xa4, 0x18, 0xf7, 0x33, 0xef, 0x2c, 0xbf, 0xf4, 0x4d, 0x23, 0x29, 0xa4, + 0x7d, 0x59, 0x58, 0x9b, 0x0e, 0x89, 0xfa, 0x98, 0xe8, 0xc4, 0xd3, 0x7e, + 0xde, 0x7a, 0xc1, 0xac, 0xbf, 0xfe, 0xe7, 0x4f, 0x9e, 0xee, 0x0c, 0xf9, + 0x84, 0xb2, 0xf7, 0x60, 0xb0, 0xfd, 0xc0, 0x53, 0x7e, 0x7e, 0xc8, 0x82, + 0xb2, 0xff, 0x43, 0x30, 0xd9, 0x1b, 0xab, 0x2f, 0xf4, 0x99, 0xc3, 0x2f, + 0xa4, 0xb2, 0x82, 0x7d, 0x13, 0x1a, 0x5f, 0xfe, 0xcd, 0x69, 0xe5, 0xc2, + 0xc6, 0x09, 0xf2, 0xcb, 0xff, 0x11, 0xc8, 0xb3, 0xa4, 0xf2, 0x59, 0x79, + 0xdc, 0x2a, 0x89, 0x31, 0x79, 0xbc, 0xf8, 0xb2, 0xa4, 0x88, 0x20, 0x9d, + 0xb7, 0x94, 0x5f, 0x82, 0xda, 0x36, 0x5b, 0xb6, 0xc2, 0xcb, 0xff, 0xdf, + 0x4b, 0x99, 0xbd, 0xd9, 0x82, 0xc7, 0x16, 0x5f, 0xec, 0xfb, 0xde, 0x79, + 0x71, 0x65, 0x42, 0x2f, 0x30, 0xef, 0x49, 0xb7, 0xf8, 0x9f, 0xdc, 0x08, + 0x09, 0x65, 0xff, 0xf7, 0xe7, 0xfb, 0x58, 0x7b, 0xcb, 0x3d, 0xd3, 0x59, + 0x7f, 0x9f, 0xee, 0x3b, 0xcb, 0x8b, 0x2d, 0xac, 0x44, 0x2f, 0x54, 0xab, + 0x11, 0xbe, 0x70, 0xb7, 0xbf, 0xf3, 0x58, 0x37, 0x97, 0xb8, 0xff, 0xac, + 0xbf, 0xff, 0x9f, 0xec, 0x28, 0x68, 0x4f, 0x14, 0x7f, 0x9f, 0x79, 0x65, + 0x1a, 0x27, 0x40, 0x81, 0x7f, 0xf1, 0xfc, 0xd7, 0xba, 0x70, 0x58, 0x15, + 0x97, 0xfc, 0x62, 0xc0, 0xf6, 0x64, 0x69, 0x65, 0x49, 0x74, 0x3c, 0x66, + 0x39, 0x08, 0xf0, 0x91, 0xea, 0x19, 0xac, 0x87, 0x7f, 0x63, 0x0d, 0xe4, + 0x30, 0xfc, 0x45, 0xbd, 0x12, 0xfe, 0x1f, 0xed, 0x8e, 0x7f, 0xb8, 0xb2, + 0xf7, 0x0c, 0x6b, 0x2f, 0xe2, 0x8f, 0x98, 0xfe, 0x59, 0x7f, 0xd0, 0x1f, + 0x03, 0xba, 0x86, 0x96, 0x5f, 0xf1, 0xe3, 0x41, 0xec, 0x1e, 0xe2, 0xcb, + 0xfc, 0x13, 0xd7, 0x26, 0x87, 0x59, 0x7f, 0xf0, 0x39, 0xd7, 0x97, 0x5e, + 0x50, 0x4b, 0x2b, 0xe3, 0xf6, 0xd1, 0x9d, 0xdd, 0x39, 0x93, 0x57, 0xd0, + 0xe3, 0x0b, 0x5b, 0x67, 0x5e, 0x85, 0x8d, 0xf7, 0x8d, 0x8e, 0xb2, 0xc2, + 0xac, 0xbf, 0xbb, 0xc8, 0xf4, 0x0d, 0x65, 0x61, 0xbf, 0x31, 0x2a, 0xc3, + 0xff, 0xf3, 0x05, 0xff, 0x47, 0x7c, 0x7b, 0x32, 0x02, 0xb2, 0xff, 0xfc, + 0xe1, 0xd4, 0x74, 0xb3, 0xd9, 0x3d, 0xa6, 0x9a, 0x49, 0x52, 0x45, 0x9f, + 0x08, 0x7c, 0x73, 0x7f, 0x04, 0x20, 0x09, 0x42, 0xcb, 0xff, 0xbe, 0x91, + 0x44, 0xb5, 0x1e, 0x7f, 0x2c, 0xbf, 0xe1, 0x89, 0x1f, 0x6e, 0x66, 0xa1, + 0x65, 0xd1, 0x25, 0x95, 0x88, 0x97, 0x74, 0x42, 0x3d, 0xbf, 0xf3, 0xfa, + 0x35, 0xce, 0xc1, 0x79, 0x65, 0xfb, 0x24, 0x6f, 0xbd, 0x65, 0x11, 0xf2, + 0xf0, 0xf6, 0xa4, 0x8b, 0x30, 0x42, 0x4a, 0xf3, 0x1f, 0xab, 0x2f, 0xff, + 0x14, 0x4b, 0x5a, 0x07, 0xc7, 0xa7, 0xe2, 0xcb, 0xff, 0xee, 0x60, 0xa5, + 0x9e, 0xe6, 0x48, 0x9d, 0xa5, 0x96, 0x3e, 0xa2, 0x67, 0xc9, 0x54, 0x68, + 0xdd, 0xdf, 0x0b, 0x5b, 0xe6, 0xf8, 0xef, 0x16, 0x5f, 0xed, 0xbc, 0x50, + 0x0f, 0x71, 0x65, 0xfe, 0x67, 0xb2, 0x69, 0x39, 0x2c, 0xac, 0x3e, 0x73, + 0x34, 0xa8, 0x46, 0xae, 0x14, 0xea, 0x11, 0x97, 0x89, 0xdb, 0x6b, 0x2f, + 0x7f, 0xfc, 0x2c, 0xbf, 0x10, 0x36, 0xfb, 0x75, 0x65, 0x70, 0xf2, 0xfc, + 0x3d, 0x7f, 0xfa, 0x36, 0x2c, 0xcd, 0xbc, 0x2c, 0x14, 0x96, 0x5f, 0xf9, + 0xcb, 0x6e, 0xbb, 0x0f, 0x86, 0xb2, 0x9d, 0x15, 0x24, 0x44, 0xd2, 0x55, + 0xe6, 0x9a, 0x69, 0x25, 0xf6, 0xcc, 0x3e, 0x24, 0x9e, 0x68, 0x2e, 0x81, + 0xac, 0xb6, 0x9c, 0xf2, 0xc8, 0xd6, 0xfd, 0x18, 0x4e, 0xc5, 0x97, 0xfe, + 0x79, 0x74, 0xfe, 0xff, 0x4e, 0x35, 0x97, 0x0d, 0xa5, 0x97, 0xff, 0xec, + 0xdf, 0x05, 0xe6, 0x46, 0x10, 0xf3, 0xef, 0x2c, 0xbc, 0xe4, 0x1d, 0x8f, + 0xb7, 0x43, 0x15, 0xfa, 0x60, 0xa4, 0x4a, 0x08, 0x56, 0xdf, 0xe9, 0x46, + 0xb6, 0x8d, 0x6c, 0xb2, 0xfe, 0xe7, 0x0f, 0x0b, 0xf5, 0x97, 0xb5, 0x9b, + 0xab, 0x2f, 0xf9, 0xa1, 0x36, 0xe6, 0x32, 0x37, 0x56, 0x5f, 0xfe, 0x30, + 0xe1, 0x0f, 0x4e, 0x1c, 0xfb, 0xcb, 0x2a, 0x11, 0x11, 0xc3, 0xfa, 0xd2, + 0x3d, 0x98, 0x5b, 0xe8, 0x53, 0xdf, 0xdd, 0xcf, 0xbd, 0xd8, 0x59, 0x50, + 0x9c, 0x76, 0x46, 0x56, 0xe6, 0xb7, 0xff, 0xc7, 0x31, 0x47, 0xb9, 0xef, + 0x82, 0x65, 0xb2, 0xcb, 0xff, 0xff, 0xc6, 0x5f, 0x88, 0x59, 0xad, 0x63, + 0x59, 0xbb, 0x85, 0x1f, 0xb1, 0xe4, 0xb2, 0xff, 0xfe, 0xf7, 0x00, 0x3e, + 0x9e, 0x4c, 0xe7, 0xba, 0x7f, 0x49, 0x65, 0xff, 0xfc, 0x59, 0xfb, 0x97, + 0xfa, 0xd6, 0x35, 0x9f, 0xbf, 0xcb, 0x28, 0x91, 0x79, 0xe5, 0xfb, 0xf1, + 0xfb, 0x6c, 0x69, 0x65, 0xff, 0x40, 0x7a, 0x40, 0xf4, 0x71, 0x65, 0xff, + 0xc6, 0xdf, 0x01, 0x86, 0x60, 0xdd, 0x8b, 0x2f, 0xff, 0x44, 0xb9, 0x90, + 0x33, 0x27, 0xd0, 0xab, 0x2f, 0xff, 0xde, 0xee, 0x4a, 0x70, 0x7a, 0x7e, + 0xf8, 0x27, 0xa5, 0x95, 0x25, 0x53, 0xe7, 0x19, 0xb6, 0x88, 0x98, 0x53, + 0xd3, 0x8f, 0xd1, 0x49, 0x22, 0xff, 0xf7, 0xa1, 0x81, 0x71, 0xe3, 0x42, + 0x6a, 0x4b, 0x2f, 0x8b, 0x6d, 0xe3, 0x59, 0x7f, 0xff, 0xba, 0x64, 0x3d, + 0x60, 0x7b, 0x1d, 0xcd, 0x6a, 0x05, 0x59, 0x7f, 0xe0, 0x84, 0x1b, 0xbc, + 0x36, 0xb3, 0x4b, 0x2f, 0xff, 0xfb, 0xc0, 0xd3, 0xf0, 0x3d, 0x39, 0x89, + 0xda, 0xf6, 0x75, 0x8b, 0x2f, 0xff, 0x73, 0x35, 0x38, 0x3d, 0x3d, 0xe6, + 0x43, 0x59, 0x46, 0x8b, 0x5e, 0x34, 0x51, 0xa6, 0x34, 0xf0, 0xf8, 0xbf, + 0xe6, 0x46, 0xb7, 0xe6, 0xa2, 0x65, 0x97, 0xfe, 0xd0, 0x59, 0x1f, 0x73, + 0x37, 0xe2, 0xcb, 0x9f, 0x75, 0x65, 0x85, 0x59, 0x7f, 0xff, 0x4c, 0x50, + 0x3c, 0xfb, 0xd9, 0x28, 0x2d, 0x99, 0x8b, 0x2f, 0xef, 0xf7, 0x30, 0x78, + 0xc5, 0x95, 0xa4, 0x4f, 0x74, 0x48, 0x96, 0xef, 0xe2, 0x9d, 0xb9, 0x9a, + 0x85, 0x95, 0x09, 0xac, 0x6c, 0x83, 0x90, 0xb7, 0x72, 0xfb, 0xfc, 0xff, + 0xce, 0xc1, 0xbc, 0x96, 0x58, 0x55, 0x97, 0xff, 0x60, 0x7b, 0x1d, 0xcd, + 0x6a, 0x05, 0x59, 0x7e, 0xcd, 0x6a, 0x05, 0x59, 0x7c, 0x47, 0xff, 0x20, + 0xff, 0xb4, 0x25, 0xd4, 0x4b, 0xfe, 0xeb, 0xfe, 0xc7, 0x93, 0xf1, 0x65, + 0xfe, 0x79, 0x4a, 0x24, 0x1e, 0x2c, 0xac, 0x3e, 0xc0, 0x1c, 0xd6, 0x27, + 0x0a, 0x70, 0xb3, 0xec, 0x2c, 0x6f, 0xff, 0x3e, 0xdd, 0x38, 0x2c, 0x98, + 0xf4, 0x6b, 0x28, 0x6c, 0x94, 0x7c, 0x95, 0xe1, 0xf3, 0x59, 0xa6, 0x4c, + 0x4b, 0xd8, 0xde, 0xbf, 0x27, 0xe4, 0x72, 0x7e, 0x8f, 0x19, 0xa3, 0x9b, + 0xf1, 0x67, 0x5f, 0xcb, 0x2f, 0xfd, 0x28, 0x2d, 0x84, 0xd1, 0x02, 0x4b, + 0x2f, 0xe2, 0x71, 0xff, 0xf7, 0xeb, 0x2b, 0x75, 0x12, 0xd3, 0x13, 0x71, + 0x02, 0xfb, 0xdb, 0x60, 0xd6, 0x5f, 0xf1, 0x8a, 0x26, 0xbf, 0x61, 0xf1, + 0x65, 0x4c, 0x7b, 0xfb, 0x84, 0x77, 0x9a, 0x69, 0xa5, 0x97, 0xff, 0xec, + 0x67, 0x8a, 0x3f, 0xc1, 0xf3, 0x19, 0x01, 0x49, 0x3c, 0xd0, 0x5f, 0xda, + 0xc6, 0xfe, 0xb8, 0xd6, 0x5f, 0xfb, 0x3e, 0x9c, 0x59, 0xbf, 0x47, 0xc5, + 0x97, 0xf0, 0x7a, 0x70, 0x41, 0x59, 0x50, 0x7d, 0xd8, 0x85, 0x7f, 0xb5, + 0x1e, 0x30, 0x98, 0xd6, 0x5f, 0xa5, 0x36, 0x60, 0x56, 0x5b, 0x4b, 0x29, + 0xba, 0x3e, 0xb8, 0x32, 0x10, 0xa2, 0xfc, 0x7f, 0xe3, 0xee, 0xac, 0xac, + 0x55, 0x8c, 0x70, 0x93, 0xea, 0x33, 0xb3, 0x14, 0x27, 0xb9, 0x08, 0xbf, + 0x1a, 0x5e, 0xf9, 0xa6, 0xe9, 0x65, 0xef, 0x4b, 0xab, 0x2c, 0x6b, 0x2f, + 0xff, 0xf3, 0x50, 0x50, 0x29, 0x40, 0xa2, 0x6e, 0x46, 0xa0, 0x30, 0xb2, + 0xfe, 0xec, 0x4e, 0x09, 0xec, 0xb2, 0xff, 0xf4, 0xdd, 0x76, 0x66, 0x85, + 0x14, 0x05, 0xe5, 0x97, 0xff, 0x3e, 0x9e, 0x59, 0xc7, 0xf6, 0x4c, 0xb2, + 0xfe, 0xd3, 0xe8, 0xa2, 0x4b, 0x2f, 0xff, 0x9f, 0xdd, 0xcd, 0xfd, 0x39, + 0xdc, 0xe1, 0xb1, 0x65, 0xff, 0x8e, 0x47, 0xaf, 0xa0, 0xa3, 0x8b, 0x29, + 0xb5, 0x53, 0xf0, 0x81, 0x01, 0xb2, 0x61, 0x80, 0x53, 0x74, 0x86, 0x45, + 0x9e, 0x53, 0xb4, 0xf6, 0xe5, 0xd3, 0x8f, 0xb6, 0x5a, 0xe2, 0x1e, 0xdb, + 0x43, 0xf2, 0x50, 0xbc, 0x1c, 0x70, 0xb9, 0x3b, 0x9c, 0x2c, 0x2a, 0x43, + 0x1c, 0x7f, 0xd1, 0xc9, 0x19, 0x84, 0xd1, 0xbb, 0xea, 0x3d, 0xa6, 0x19, + 0xf6, 0x31, 0x37, 0x84, 0xd7, 0xf1, 0x95, 0x94, 0x78, 0x9c, 0xa4, 0xbd, + 0xfa, 0x70, 0x19, 0xa7, 0x1d, 0xc2, 0x41, 0x25, 0x06, 0xdf, 0xa5, 0xf4, + 0x10, 0xd6, 0x54, 0x93, 0xe1, 0x28, 0xee, 0x6f, 0xff, 0x6b, 0x1a, 0x1f, + 0x72, 0x62, 0xcd, 0x49, 0x65, 0xed, 0x66, 0xea, 0xcb, 0xff, 0x43, 0x42, + 0x6d, 0xcc, 0x64, 0x6e, 0xac, 0xad, 0x22, 0xb9, 0x89, 0x7e, 0x1f, 0xbf, + 0xfe, 0x76, 0x46, 0x83, 0xa0, 0x0b, 0xa0, 0x3f, 0x16, 0x56, 0x22, 0x04, + 0x06, 0x17, 0xfb, 0x41, 0x03, 0x8d, 0x90, 0xb2, 0xff, 0xe8, 0xd0, 0x9e, + 0x3f, 0x77, 0x06, 0x6b, 0x2f, 0xf1, 0x7d, 0xfe, 0x71, 0xf7, 0x56, 0x5f, + 0xf1, 0x46, 0xc2, 0x77, 0xaf, 0xba, 0xb2, 0xfa, 0x30, 0x7f, 0x2c, 0xac, + 0x44, 0xb7, 0x4d, 0xf7, 0x9e, 0xdf, 0xff, 0xf1, 0x91, 0xff, 0xcd, 0x60, + 0x7b, 0x1d, 0xcd, 0x6a, 0x05, 0x59, 0x50, 0x9d, 0x26, 0xc6, 0x79, 0x0d, + 0xaf, 0x18, 0xde, 0x6e, 0x2d, 0xd4, 0x96, 0x5e, 0x7d, 0x6c, 0xb2, 0xe6, + 0x9a, 0x59, 0x79, 0xc3, 0x3c, 0x26, 0xd9, 0xa1, 0xdb, 0xfa, 0x34, 0xf2, + 0x3e, 0xac, 0xbf, 0x63, 0x3a, 0xe3, 0x59, 0x69, 0xf0, 0xed, 0x42, 0x24, + 0x42, 0x34, 0x1c, 0x8f, 0xac, 0x52, 0xa0, 0xce, 0x0e, 0xcc, 0x57, 0xa8, + 0x55, 0x74, 0x85, 0xed, 0x49, 0xc1, 0x46, 0xb1, 0xc8, 0xf1, 0xbc, 0x85, + 0xbd, 0x79, 0xa3, 0x56, 0xf2, 0xca, 0x93, 0xea, 0x0d, 0x0e, 0x97, 0x57, + 0xf4, 0x73, 0xda, 0x2a, 0x64, 0x23, 0xfb, 0x2a, 0x23, 0xf8, 0x6e, 0x94, + 0x62, 0x3c, 0x9e, 0x01, 0xf4, 0xe2, 0x50, 0x2d, 0xb2, 0x15, 0xfb, 0x07, + 0xd8, 0x69, 0x65, 0xfd, 0xc8, 0x9a, 0x47, 0x32, 0xcb, 0xfe, 0xf4, 0x11, + 0xff, 0x9f, 0x79, 0x65, 0xf6, 0xe3, 0x97, 0xeb, 0x2e, 0x8d, 0xb0, 0xf7, + 0x84, 0x39, 0xa2, 0x47, 0x1f, 0x0a, 0x04, 0x84, 0x6d, 0xfe, 0x7d, 0x06, + 0x7c, 0xb3, 0xe5, 0x97, 0xff, 0xa4, 0xfc, 0x9e, 0x51, 0x9e, 0x8f, 0xa4, + 0xb2, 0xe8, 0xfd, 0x65, 0xf7, 0xbd, 0x0c, 0x59, 0x7e, 0x30, 0x98, 0xe7, + 0xf4, 0xdc, 0x88, 0x2f, 0x53, 0xd3, 0x2f, 0xd8, 0xd4, 0xcd, 0xbd, 0x08, + 0x4b, 0xff, 0x38, 0x67, 0x83, 0xf3, 0x96, 0x49, 0x65, 0xfb, 0x41, 0x77, + 0x0a, 0xa2, 0x35, 0x5e, 0x17, 0xee, 0x2c, 0xb4, 0xfd, 0x91, 0x29, 0x88, + 0x3e, 0x34, 0xbf, 0xff, 0xdb, 0xe0, 0xbd, 0x3d, 0xf7, 0xb8, 0xf0, 0x6e, + 0xc7, 0x1a, 0xcb, 0xf6, 0x82, 0xee, 0x15, 0x45, 0x4a, 0xb0, 0x55, 0x10, + 0xd2, 0x96, 0x53, 0x9a, 0x9f, 0xc7, 0xad, 0x3f, 0x0f, 0xf9, 0xd7, 0x6f, + 0xda, 0x0b, 0xb8, 0x55, 0x11, 0xf2, 0xff, 0xe0, 0x6b, 0xf0, 0xf4, 0xe6, + 0x28, 0xfd, 0x65, 0xff, 0xf1, 0x3f, 0xa5, 0x02, 0xce, 0x8f, 0x72, 0x3f, + 0x59, 0x79, 0xe5, 0x3f, 0x11, 0x9b, 0xc3, 0x41, 0x11, 0xef, 0xe9, 0xfc, + 0x78, 0xfa, 0x4b, 0x2f, 0xfc, 0xfb, 0x47, 0x4f, 0x47, 0x0c, 0x59, 0x7f, + 0xa3, 0x58, 0x5e, 0xce, 0xac, 0xbb, 0x27, 0xee, 0x1f, 0x70, 0x87, 0xb4, + 0x2a, 0x34, 0x59, 0x09, 0xea, 0x9e, 0x99, 0xec, 0x46, 0x29, 0x7f, 0xff, + 0xd2, 0x06, 0x85, 0x7e, 0x60, 0xe3, 0xee, 0x09, 0xe1, 0x4c, 0x55, 0x97, + 0x9a, 0x14, 0x2b, 0x2f, 0xdf, 0x7d, 0x2c, 0xf2, 0xca, 0xe1, 0xe4, 0x80, + 0x7e, 0xff, 0xf3, 0x68, 0x2b, 0x5b, 0xbb, 0x0d, 0xb3, 0x3a, 0x77, 0x77, + 0x16, 0x5f, 0x05, 0xdc, 0x2a, 0x8b, 0x1d, 0x7e, 0x8e, 0x93, 0x88, 0xb2, + 0xb4, 0x7a, 0xac, 0x2e, 0xbf, 0xd8, 0x65, 0xb7, 0xb3, 0xab, 0x2e, 0x7e, + 0x2c, 0xbf, 0xb6, 0x13, 0x5a, 0xcd, 0x2c, 0xa9, 0x1e, 0x33, 0x8b, 0x5f, + 0xf1, 0x38, 0xbd, 0x38, 0x2d, 0x96, 0x5f, 0xc5, 0xed, 0x02, 0x18, 0xb2, + 0xff, 0xfc, 0x4e, 0x2c, 0xef, 0x0b, 0x05, 0x2c, 0xe9, 0xb1, 0x65, 0x3a, + 0x21, 0x00, 0x5b, 0x7f, 0x7e, 0xfe, 0xe4, 0x0a, 0xb2, 0xff, 0xfa, 0x5b, + 0x36, 0x90, 0xdc, 0xec, 0x1d, 0x4e, 0x9d, 0xdd, 0xc5, 0x97, 0xfd, 0x9b, + 0xe2, 0x5f, 0x4b, 0x3c, 0xb2, 0xb1, 0x19, 0xff, 0x97, 0x93, 0x2d, 0xc7, + 0x25, 0x97, 0xfb, 0xc5, 0x9b, 0xfa, 0xf2, 0x59, 0x43, 0x3c, 0xac, 0x16, + 0xbf, 0x1f, 0xbc, 0x7e, 0x59, 0x7f, 0xfe, 0x01, 0x38, 0xbe, 0x16, 0x0a, + 0x59, 0xd3, 0x62, 0xcb, 0xed, 0x6b, 0x37, 0x16, 0x56, 0x22, 0x85, 0x84, + 0xee, 0xab, 0x7e, 0xcd, 0x66, 0x4c, 0xb2, 0xd3, 0xe1, 0x76, 0x1f, 0x68, + 0x5a, 0xc8, 0x8b, 0x21, 0x70, 0x29, 0x11, 0xbc, 0x4c, 0x42, 0xc8, 0x5e, + 0x76, 0x1e, 0x24, 0xf3, 0xc8, 0x61, 0x08, 0x5d, 0x7c, 0x29, 0xea, 0x65, + 0x97, 0x9b, 0x46, 0x0a, 0xb2, 0xfc, 0x59, 0xd7, 0xf2, 0xcb, 0xcd, 0xc1, + 0xba, 0xfd, 0x65, 0x36, 0x0f, 0x3d, 0xb4, 0x26, 0xbf, 0xe8, 0x98, 0xfd, + 0xc3, 0x29, 0x96, 0x5f, 0xe7, 0xff, 0x8f, 0xef, 0x3a, 0xcb, 0x98, 0x15, + 0x97, 0xfc, 0xe3, 0x3f, 0xa5, 0xe3, 0xd2, 0xca, 0xd2, 0x2f, 0x08, 0xe7, + 0xc6, 0x7b, 0xc5, 0xef, 0xfd, 0x8d, 0x6b, 0x09, 0xfe, 0x97, 0x16, 0x5f, + 0xba, 0xec, 0x82, 0x59, 0x7d, 0xce, 0x9b, 0x4b, 0x2f, 0xd0, 0xd7, 0xb3, + 0xab, 0x2f, 0x40, 0x98, 0xb2, 0xa7, 0x22, 0x37, 0x09, 0x88, 0x8f, 0x85, + 0x17, 0xed, 0x73, 0xf6, 0xef, 0xab, 0x2f, 0xff, 0x63, 0x7e, 0x07, 0xdf, + 0x4b, 0x0b, 0xf7, 0x59, 0x7f, 0xff, 0xf1, 0x96, 0xfc, 0x19, 0x3b, 0xef, + 0xcd, 0xdf, 0x6e, 0x9f, 0x8a, 0x3f, 0x59, 0x78, 0xc1, 0xfa, 0xcb, 0x7d, + 0xba, 0x89, 0x59, 0x9e, 0x2f, 0x30, 0xf4, 0xb2, 0xb0, 0xf2, 0xbf, 0x2e, + 0xbd, 0x8e, 0x4b, 0x2f, 0x76, 0x26, 0x59, 0x71, 0xf8, 0xcd, 0xbb, 0x8d, + 0x5f, 0xff, 0xf4, 0x68, 0xb0, 0x79, 0xde, 0x98, 0x7a, 0x7e, 0xe3, 0xfc, + 0xb2, 0xff, 0xfd, 0x93, 0x63, 0x79, 0x66, 0xf2, 0xcf, 0xd9, 0x12, 0x59, + 0x7f, 0xcf, 0xf1, 0x67, 0xb9, 0x8d, 0x2c, 0xac, 0x55, 0xaa, 0x12, 0xf3, + 0x8c, 0xb3, 0x75, 0x67, 0xa5, 0x44, 0xca, 0x05, 0x9b, 0xf7, 0x4f, 0x40, + 0x92, 0xcb, 0xfe, 0xd8, 0xfb, 0x33, 0xc8, 0xfa, 0xb2, 0xfe, 0x8d, 0x7f, + 0xb8, 0x0f, 0x2c, 0xbf, 0xc5, 0xe6, 0xcb, 0xf8, 0x10, 0xb2, 0xfe, 0x91, + 0x67, 0xde, 0x75, 0x95, 0x07, 0xc6, 0xe6, 0xd7, 0xff, 0x76, 0x18, 0x1e, + 0x9f, 0xb3, 0x18, 0xb2, 0xff, 0x38, 0xb9, 0xad, 0xa0, 0x55, 0x95, 0x07, + 0xf0, 0x48, 0x77, 0xdf, 0xfe, 0x62, 0x2c, 0xbf, 0xe7, 0xd6, 0xdd, 0x3c, + 0xd4, 0xcb, 0x2f, 0xfe, 0x77, 0x2f, 0xf9, 0x9b, 0xb3, 0x3b, 0xac, 0xa0, + 0xa2, 0x02, 0x63, 0xab, 0xf4, 0xb9, 0xb6, 0x34, 0xb2, 0xfb, 0xb9, 0xad, + 0x96, 0x5e, 0x77, 0x0a, 0xa2, 0xd0, 0x5f, 0xf9, 0xda, 0x6f, 0x0b, 0xeb, + 0x6c, 0x69, 0x65, 0xfd, 0xfc, 0x14, 0x7b, 0x8b, 0x2a, 0x11, 0xcc, 0x32, + 0xa0, 0x91, 0xe8, 0xa3, 0xf4, 0x4b, 0xc0, 0x06, 0x96, 0x5e, 0x28, 0xd2, + 0xcb, 0xb5, 0x34, 0xc6, 0xe3, 0x83, 0xb7, 0xff, 0xff, 0xb5, 0xd7, 0x23, + 0x8f, 0x1f, 0x63, 0x9d, 0xce, 0x6b, 0x03, 0x9e, 0x59, 0x58, 0x8a, 0x33, + 0x2f, 0xbf, 0x0f, 0x3f, 0x78, 0x59, 0x7f, 0xff, 0xe7, 0xd4, 0xb8, 0x63, + 0xcd, 0x6c, 0x7c, 0xeb, 0xff, 0xcc, 0x25, 0x96, 0x06, 0x22, 0x4f, 0x84, + 0xf7, 0xed, 0x98, 0xee, 0x4b, 0x2f, 0xf9, 0xff, 0xc3, 0xe7, 0x23, 0xf5, + 0x95, 0x07, 0xc1, 0xc2, 0x7b, 0xff, 0xf7, 0x71, 0xaf, 0x32, 0x33, 0xdd, + 0xcc, 0x20, 0xac, 0xbf, 0xff, 0x1f, 0xa5, 0x9a, 0xd3, 0xc8, 0x42, 0x7f, + 0x71, 0x65, 0xfe, 0x9b, 0xb1, 0xee, 0xc4, 0xcb, 0x2a, 0x17, 0xaf, 0xb6, + 0x28, 0x91, 0xd0, 0xe1, 0x2a, 0x18, 0x4c, 0x19, 0x06, 0xec, 0x29, 0x75, + 0x18, 0x57, 0x63, 0x25, 0x28, 0x5a, 0x72, 0x11, 0x1e, 0x21, 0xde, 0xa8, + 0x22, 0xad, 0xff, 0x03, 0xdc, 0x2c, 0xfb, 0xce, 0xb2, 0xd8, 0xb2, 0xff, + 0xf0, 0xfb, 0x10, 0x7e, 0xe1, 0x97, 0xd2, 0x59, 0x60, 0x0c, 0xf6, 0x48, + 0x42, 0xec, 0x62, 0xcb, 0xff, 0x9f, 0xed, 0xfd, 0xdd, 0x3f, 0x14, 0x31, + 0x65, 0x0a, 0x98, 0xc1, 0xc2, 0x4b, 0x44, 0xee, 0x2d, 0x7f, 0x41, 0x7a, + 0x73, 0x36, 0x59, 0x7f, 0xd3, 0x14, 0x33, 0xb1, 0xbd, 0x8b, 0x2f, 0xfe, + 0x7f, 0xb9, 0xcc, 0xe9, 0xf0, 0x1b, 0x2c, 0xac, 0x44, 0x0f, 0x0e, 0xec, + 0x63, 0x46, 0x9f, 0xa1, 0x63, 0x7f, 0x6b, 0x61, 0x06, 0xfb, 0x2c, 0xbf, + 0xfe, 0x06, 0xda, 0x3f, 0x6c, 0x0d, 0x4b, 0x9b, 0xa6, 0xb2, 0xba, 0x8b, + 0x47, 0x2d, 0x23, 0x1b, 0xfe, 0x03, 0xf9, 0xe4, 0xff, 0x49, 0x65, 0xf9, + 0xc4, 0xcf, 0xbc, 0xb2, 0x82, 0x7c, 0x5c, 0x39, 0xbf, 0xc6, 0x3c, 0x64, + 0xec, 0x1a, 0xcb, 0x9f, 0x8b, 0x2f, 0xff, 0x81, 0xad, 0x41, 0x60, 0xa7, + 0xde, 0xe0, 0x8b, 0x2c, 0xdb, 0x59, 0x5a, 0x3e, 0x50, 0x28, 0x5f, 0x46, + 0xa2, 0x65, 0x97, 0xf9, 0x80, 0x2f, 0x70, 0x1a, 0x59, 0x52, 0x4c, 0x9c, + 0x66, 0x9a, 0x7b, 0x61, 0x16, 0xe1, 0x15, 0xe8, 0x21, 0x56, 0x5f, 0xc5, + 0xf4, 0xbc, 0x01, 0xac, 0xbf, 0x6e, 0xe1, 0x30, 0xd6, 0x54, 0x1e, 0xc3, + 0x97, 0xde, 0x2c, 0xfd, 0x65, 0xfe, 0xce, 0xf2, 0x6c, 0xcd, 0x96, 0x59, + 0xad, 0x1e, 0x87, 0x87, 0x2f, 0xe6, 0xbc, 0x50, 0xce, 0x2c, 0xa7, 0x3d, + 0x70, 0x14, 0xdf, 0xa6, 0xee, 0x7e, 0xeb, 0x2a, 0x49, 0xc2, 0xf5, 0xd0, + 0xa1, 0x8f, 0xbc, 0x86, 0xff, 0xff, 0xe8, 0x1f, 0x73, 0xde, 0x7d, 0xb3, + 0xcc, 0x30, 0x14, 0xc5, 0x8d, 0x2c, 0xbf, 0xff, 0x7b, 0x91, 0x37, 0x63, + 0x79, 0x60, 0xfb, 0x1c, 0x59, 0x7f, 0xf9, 0x87, 0xf4, 0xb8, 0x58, 0x1f, + 0x00, 0x96, 0x5f, 0xee, 0x66, 0xef, 0xee, 0xf3, 0x2c, 0xac, 0x46, 0xc3, + 0x15, 0xfa, 0x95, 0x50, 0x9b, 0xce, 0x46, 0x95, 0x7e, 0x20, 0xbf, 0x0d, + 0x65, 0xff, 0xfd, 0xa2, 0x88, 0xfa, 0x77, 0x3c, 0x50, 0x3e, 0xc7, 0x96, + 0x5c, 0x7d, 0x59, 0x7d, 0x22, 0x71, 0x16, 0x5f, 0xe1, 0xbf, 0xfa, 0xd3, + 0xfe, 0xb2, 0xfb, 0x41, 0xdd, 0x69, 0x65, 0xf0, 0xad, 0x87, 0x69, 0x65, + 0x61, 0xe7, 0xb9, 0x3d, 0x1a, 0x29, 0x0a, 0x10, 0x95, 0x09, 0xc2, 0x61, + 0x36, 0xea, 0xe3, 0x8b, 0x02, 0x18, 0xd7, 0xff, 0x68, 0xb3, 0x7e, 0xb0, + 0xfb, 0x03, 0x59, 0x79, 0xf7, 0x4d, 0x65, 0xff, 0x84, 0xf0, 0xa6, 0x2c, + 0x61, 0x42, 0xcb, 0x7c, 0xb2, 0xff, 0xf1, 0xbb, 0xcd, 0xee, 0xe4, 0xba, + 0x7b, 0xd6, 0x54, 0x1e, 0xee, 0xe8, 0x95, 0xf8, 0x4f, 0x14, 0x7e, 0xb2, + 0xa1, 0x34, 0xbf, 0x91, 0x34, 0x3c, 0xc8, 0x4e, 0x6f, 0x24, 0xbf, 0x47, + 0xb3, 0xb0, 0xb2, 0xfd, 0xfc, 0x7b, 0x18, 0xb2, 0xff, 0xff, 0xff, 0x33, + 0x74, 0xfb, 0xfe, 0x39, 0x07, 0x3e, 0x97, 0x0f, 0xdc, 0x3f, 0xa4, 0x51, + 0xd8, 0x59, 0x7f, 0xec, 0xfa, 0x5c, 0x3f, 0x39, 0x62, 0xcb, 0xfd, 0x8c, + 0xee, 0x4c, 0xf3, 0x2c, 0xbf, 0xe3, 0x1e, 0x1e, 0xdd, 0x88, 0x9c, 0x7e, + 0x3e, 0x3d, 0xac, 0x4d, 0x4b, 0xb1, 0x81, 0x5f, 0xff, 0xfd, 0x06, 0x59, + 0xe8, 0x63, 0x40, 0x7d, 0xa7, 0x67, 0x4f, 0x5d, 0x75, 0x97, 0xfe, 0xcf, + 0xa5, 0xc9, 0xb4, 0xfe, 0xe2, 0xcb, 0xf1, 0x40, 0x64, 0xc5, 0x97, 0xff, + 0xb3, 0x77, 0xa0, 0x9b, 0xb9, 0x34, 0xa3, 0xe5, 0x97, 0xff, 0x73, 0x26, + 0xec, 0x6f, 0xce, 0xf6, 0x16, 0x50, 0xd1, 0x7b, 0xa2, 0x7f, 0x28, 0x5f, + 0xe7, 0xff, 0x8c, 0x7f, 0xbc, 0xb2, 0xb0, 0xf9, 0x5c, 0xc2, 0xff, 0xe2, + 0xcd, 0xb5, 0x11, 0xe3, 0xec, 0x2c, 0xbf, 0xd1, 0x13, 0x66, 0xf3, 0xd2, + 0xcb, 0xe3, 0xd6, 0x12, 0xca, 0x23, 0xd4, 0xe1, 0xa5, 0xff, 0xf8, 0xc1, + 0xf7, 0x71, 0xa0, 0x61, 0xf7, 0x91, 0xb2, 0xca, 0xd9, 0x73, 0x33, 0x09, + 0x83, 0x1b, 0xd6, 0x8a, 0x7f, 0x72, 0x28, 0xd8, 0xf8, 0x41, 0xe8, 0x4b, + 0x37, 0x90, 0xdf, 0x4d, 0x23, 0x99, 0x65, 0xc5, 0xb2, 0xca, 0x9c, 0x6e, + 0xdb, 0x92, 0x4b, 0x37, 0xac, 0xbb, 0xad, 0xeb, 0x2f, 0xff, 0x66, 0xfe, + 0xbc, 0xbf, 0x7f, 0xbf, 0x3f, 0x96, 0x5b, 0xd0, 0x7d, 0x3d, 0x1a, 0xa9, + 0x22, 0x90, 0xdf, 0x6a, 0x17, 0xb7, 0x32, 0x74, 0x78, 0xe1, 0xa0, 0xf0, + 0xcc, 0xbf, 0xfb, 0xa7, 0x3b, 0x0b, 0x0f, 0x4f, 0xbd, 0x65, 0xff, 0xc6, + 0x4e, 0x32, 0xc1, 0xf6, 0x38, 0xb2, 0xf0, 0x91, 0xa5, 0x97, 0xfd, 0xb3, + 0x23, 0x5e, 0x28, 0xd9, 0x65, 0xf6, 0xf8, 0x20, 0xac, 0xbf, 0xff, 0xa0, + 0xb3, 0xfe, 0x60, 0xfb, 0x1b, 0x30, 0x04, 0x35, 0x94, 0x67, 0xfd, 0xd2, + 0x3b, 0xf1, 0xfb, 0xd1, 0x25, 0x94, 0x2a, 0x74, 0x61, 0x45, 0xd2, 0x0b, + 0x8e, 0xfa, 0x17, 0x1b, 0xc8, 0x6f, 0xe2, 0xf4, 0x73, 0xc6, 0xb2, 0xff, + 0xfe, 0x89, 0xb0, 0x7d, 0x8d, 0xfd, 0xcf, 0x14, 0x43, 0x16, 0x5f, 0xdf, + 0x70, 0x4d, 0x80, 0x4b, 0x2f, 0xfa, 0x03, 0xd3, 0x99, 0xdf, 0x65, 0x95, + 0x08, 0xf1, 0x61, 0x63, 0xad, 0xfe, 0x63, 0x7f, 0xa5, 0x1a, 0xda, 0x35, + 0xb2, 0xcb, 0xff, 0x1e, 0xf7, 0x2f, 0xfb, 0x9f, 0xba, 0xcb, 0xe7, 0xe9, + 0x92, 0xcb, 0xec, 0xfe, 0x09, 0x65, 0x8b, 0x63, 0xc1, 0xe9, 0x05, 0xff, + 0x18, 0x0a, 0x5a, 0x8c, 0x1a, 0xcb, 0xff, 0xfe, 0xee, 0x48, 0x3d, 0x3e, + 0xc6, 0x6a, 0x5e, 0x28, 0x67, 0x16, 0x5f, 0xf0, 0x3d, 0xbb, 0xcc, 0x32, + 0x1a, 0xcb, 0xe0, 0x47, 0xc3, 0x59, 0x43, 0x4e, 0x8d, 0xe1, 0x03, 0xc2, + 0x8f, 0x1b, 0xef, 0x65, 0x68, 0xee, 0xf9, 0xbe, 0x35, 0xb2, 0xca, 0x85, + 0x4b, 0xb9, 0x1e, 0xc3, 0xaf, 0xdf, 0xed, 0x06, 0x6c, 0x3e, 0x81, 0x65, + 0xff, 0xff, 0xba, 0xe2, 0xf0, 0x67, 0x9f, 0x04, 0xc9, 0xfe, 0x64, 0x47, + 0x16, 0x5f, 0xf8, 0xf7, 0x96, 0x73, 0xc2, 0x98, 0x56, 0x5f, 0xef, 0x77, + 0x74, 0xfa, 0xf3, 0x2c, 0xbf, 0xa0, 0x24, 0xff, 0x79, 0x65, 0x49, 0x14, + 0x9b, 0xa8, 0x0c, 0x37, 0xbf, 0x47, 0xb6, 0xc6, 0x96, 0x5f, 0xfb, 0xe0, + 0x93, 0xec, 0xf2, 0x3e, 0xac, 0xad, 0x1f, 0x40, 0x0a, 0x6f, 0xc3, 0x08, + 0x33, 0x75, 0x65, 0xff, 0x8a, 0x3e, 0xec, 0x19, 0x38, 0xd6, 0x5a, 0x26, + 0x3e, 0x76, 0x15, 0xdf, 0xa3, 0xdd, 0x8f, 0x2c, 0xb8, 0xbf, 0x59, 0x5a, + 0x37, 0xce, 0x4f, 0x7f, 0xff, 0xf8, 0x1a, 0xee, 0x4d, 0x33, 0xea, 0x6f, + 0x74, 0x1f, 0xf3, 0x0f, 0x78, 0xe1, 0x65, 0xff, 0x1f, 0x79, 0xa3, 0x28, + 0x62, 0xcb, 0xfa, 0x39, 0xba, 0x7f, 0x79, 0x65, 0x1a, 0x39, 0xb7, 0x5f, + 0xb4, 0x6f, 0x7e, 0xf7, 0x5c, 0x85, 0x59, 0x7f, 0x9b, 0xc8, 0x00, 0x09, + 0x8a, 0xb2, 0xff, 0x03, 0x61, 0xf7, 0x0a, 0x16, 0x54, 0x1f, 0x51, 0x1b, + 0xdf, 0xfd, 0x83, 0xec, 0x35, 0xf4, 0xbc, 0x01, 0xac, 0xbb, 0x38, 0xb2, + 0xe7, 0xf2, 0xcb, 0xdc, 0x04, 0xb4, 0x6b, 0x3a, 0x2d, 0x6c, 0x1a, 0x71, + 0x58, 0x64, 0x18, 0x49, 0x11, 0x07, 0x9c, 0xef, 0xff, 0x64, 0x16, 0x04, + 0xb3, 0xc0, 0x76, 0x96, 0x5f, 0xfc, 0x7e, 0xee, 0x1c, 0xb9, 0x9f, 0x79, + 0x65, 0x0d, 0x11, 0x7c, 0x47, 0xbf, 0xfb, 0xf0, 0xfe, 0x59, 0xee, 0x3b, + 0x92, 0xcb, 0xcc, 0x7f, 0x96, 0x56, 0x8f, 0x87, 0xf4, 0x4a, 0x85, 0xee, + 0x31, 0x9a, 0x64, 0x62, 0x07, 0x09, 0xbe, 0xc2, 0x25, 0xd9, 0x8a, 0x54, + 0x87, 0xa1, 0xbc, 0x08, 0x42, 0x5f, 0xec, 0xec, 0xc7, 0xd3, 0x62, 0xcb, + 0xfd, 0x2c, 0xd7, 0x0a, 0x36, 0x59, 0x7c, 0x2e, 0xa1, 0x8b, 0x2e, 0xcd, + 0x96, 0x54, 0x1b, 0xad, 0xc2, 0x3b, 0xfc, 0x65, 0xe9, 0x66, 0xb1, 0x65, + 0xfd, 0x01, 0xd1, 0xc3, 0x16, 0x54, 0x8f, 0x74, 0x8c, 0x6f, 0xff, 0x33, + 0xf7, 0xd6, 0x6f, 0xc3, 0x1f, 0x4d, 0x65, 0x41, 0xf6, 0x61, 0x0d, 0xec, + 0xeb, 0xac, 0xbc, 0x00, 0x12, 0xcb, 0xf1, 0xf7, 0xb8, 0x35, 0x96, 0x99, + 0x60, 0xcf, 0x0f, 0x83, 0x94, 0x34, 0x47, 0x3a, 0xf5, 0xfd, 0xb1, 0x67, + 0xe0, 0xe2, 0xcb, 0xdb, 0xa6, 0xc5, 0x97, 0xff, 0xcf, 0xff, 0x23, 0xff, + 0x61, 0x8f, 0x0a, 0x65, 0x9d, 0x2f, 0xea, 0x11, 0x5a, 0xe9, 0xd7, 0xf3, + 0x58, 0x10, 0xe3, 0x4b, 0x2f, 0x40, 0x77, 0xac, 0xac, 0x3c, 0xdf, 0x17, + 0xdf, 0xfe, 0xc6, 0xff, 0xd9, 0x13, 0x78, 0xc1, 0xae, 0x2c, 0xbf, 0xcc, + 0xcc, 0x2f, 0x6e, 0x62, 0xcb, 0xff, 0xb9, 0xe8, 0x8d, 0x7f, 0x31, 0x63, + 0x4b, 0x2b, 0xe3, 0xfa, 0x73, 0x4b, 0xc2, 0xc8, 0x0b, 0x2f, 0xdd, 0x8d, + 0x6c, 0xc5, 0x97, 0xf8, 0x0e, 0x5d, 0xc7, 0x99, 0x65, 0xbe, 0x98, 0xf6, + 0xda, 0x29, 0xa3, 0x45, 0x23, 0xbc, 0xd6, 0x27, 0xa2, 0x64, 0x2f, 0x0c, + 0x92, 0x86, 0x35, 0x62, 0xec, 0x67, 0xc6, 0x66, 0xdb, 0xd8, 0x76, 0x3c, + 0x2b, 0x8a, 0x19, 0xfc, 0x94, 0x7f, 0x79, 0xb6, 0x02, 0x59, 0x78, 0xb3, + 0xf5, 0x96, 0x85, 0x95, 0xf9, 0xac, 0xf0, 0xe5, 0xcf, 0xe5, 0x95, 0xa3, + 0x71, 0xd2, 0x2b, 0xe6, 0x46, 0xb8, 0xb2, 0xff, 0x43, 0x0b, 0x3f, 0x07, + 0x16, 0x5f, 0xf6, 0xb3, 0xb9, 0xb4, 0xe3, 0xe2, 0xca, 0xc4, 0x58, 0x99, + 0x09, 0x11, 0x00, 0xce, 0xff, 0x48, 0xf9, 0xc8, 0xd4, 0x96, 0x5f, 0x3b, + 0x20, 0xd6, 0x50, 0xcf, 0x4e, 0x63, 0x3b, 0xf8, 0xc8, 0x12, 0xce, 0x2c, + 0xbf, 0xff, 0x48, 0xfd, 0xc0, 0xf4, 0xfd, 0xf4, 0x8f, 0xdc, 0x59, 0x7f, + 0xec, 0xf4, 0x7d, 0xfb, 0xf7, 0xa6, 0xb2, 0xcc, 0x59, 0x7f, 0x19, 0x02, + 0x59, 0xc9, 0xc7, 0xa1, 0xbc, 0xfe, 0xa1, 0x33, 0xd1, 0x48, 0xe6, 0x2c, + 0xf4, 0x29, 0xef, 0xfe, 0xd0, 0x3e, 0x97, 0x3b, 0x9b, 0x00, 0x96, 0x5a, + 0x7b, 0x74, 0xed, 0xce, 0x9b, 0x92, 0x46, 0xcb, 0x94, 0x43, 0x9f, 0x63, + 0xe9, 0x43, 0x30, 0x72, 0xc4, 0xb2, 0x7c, 0xa8, 0x59, 0x40, 0x61, 0x8f, + 0x27, 0xe8, 0x48, 0x1c, 0x69, 0x33, 0x47, 0xa7, 0xa8, 0xef, 0x59, 0x1d, + 0x67, 0x69, 0x0e, 0xef, 0x1f, 0x8f, 0xf1, 0xa8, 0x14, 0xa9, 0x9e, 0x4f, + 0x8c, 0x7a, 0x78, 0xa4, 0x0f, 0x5b, 0x91, 0x9a, 0x89, 0x1e, 0x53, 0x7a, + 0x25, 0xfd, 0xa9, 0xe3, 0xde, 0x70, 0xb2, 0xfe, 0x6f, 0x31, 0x94, 0x4c, + 0xb2, 0xf4, 0x39, 0x2c, 0xbe, 0xce, 0xbf, 0x96, 0x59, 0xb1, 0x87, 0xd7, + 0xd3, 0x02, 0x1a, 0xbf, 0x89, 0xfd, 0xc8, 0xdd, 0x59, 0x7f, 0xff, 0xf3, + 0x97, 0xb9, 0x07, 0x2c, 0x6f, 0x2f, 0x47, 0x60, 0x50, 0x43, 0x7a, 0xca, + 0x34, 0x52, 0x74, 0xbe, 0xfb, 0x39, 0xf9, 0xac, 0xba, 0x5f, 0x2c, 0xbe, + 0x0b, 0xb8, 0x55, 0x16, 0xb2, 0x8c, 0xf1, 0xb4, 0x31, 0x7f, 0x98, 0x6c, + 0x79, 0xb3, 0xab, 0x2f, 0xf0, 0x0b, 0x1b, 0xcd, 0xa3, 0x59, 0x7d, 0xc7, + 0x20, 0xac, 0xb6, 0x74, 0xf5, 0x9b, 0xcd, 0x6f, 0x6a, 0x18, 0xb2, 0xfe, + 0xee, 0x72, 0x36, 0x6f, 0x59, 0x7f, 0xd2, 0x9f, 0x9a, 0x0b, 0xb8, 0x55, + 0x14, 0x1a, 0xb0, 0xfe, 0x1c, 0xc6, 0xfb, 0x26, 0x8f, 0x2c, 0xbf, 0xdc, + 0xc2, 0x0b, 0x97, 0xeb, 0x2f, 0xfa, 0x25, 0x1a, 0xda, 0x35, 0xb2, 0xcb, + 0xed, 0x18, 0xac, 0x59, 0x7b, 0xd9, 0xd5, 0x95, 0x86, 0xfc, 0x52, 0x3b, + 0xfd, 0xd9, 0xf1, 0xf8, 0x0a, 0x65, 0x97, 0xe7, 0xe3, 0x23, 0xf5, 0x97, + 0xf4, 0x4d, 0xfb, 0x94, 0xcb, 0x2f, 0x9f, 0xfc, 0xd2, 0xca, 0xc4, 0x58, + 0x0a, 0x6e, 0x65, 0x1d, 0x2f, 0xbf, 0xd3, 0x1f, 0x81, 0x31, 0xf9, 0x65, + 0xff, 0xf7, 0x0f, 0x67, 0xe3, 0x93, 0xfb, 0xb1, 0x32, 0xcb, 0xff, 0x39, + 0x7f, 0x9e, 0x82, 0x3f, 0xd6, 0x57, 0x91, 0x19, 0xb8, 0x9f, 0x69, 0xed, + 0x95, 0xda, 0xe8, 0x86, 0xdc, 0x88, 0xb1, 0xa0, 0xc8, 0x66, 0x84, 0x4e, + 0x8a, 0x99, 0x09, 0x4e, 0x90, 0x39, 0x11, 0x19, 0x71, 0xe7, 0xd0, 0xd1, + 0x01, 0xe0, 0x90, 0xc1, 0xbf, 0xc2, 0xcf, 0x7e, 0xf7, 0x36, 0x59, 0x7f, + 0xfa, 0x7b, 0x1e, 0x53, 0xf3, 0x41, 0x77, 0x0a, 0xa2, 0x8b, 0x5f, 0xe9, + 0xf9, 0xa0, 0xbb, 0x85, 0x51, 0x75, 0x2a, 0x1f, 0x2f, 0x4e, 0x50, 0xd9, + 0xc3, 0x80, 0xc3, 0x88, 0xe5, 0x19, 0x32, 0x76, 0xcb, 0xb6, 0xe0, 0x0d, + 0xe3, 0xec, 0xfe, 0x79, 0x28, 0xa1, 0xe3, 0xc3, 0x7f, 0x2d, 0x5f, 0xb4, + 0x17, 0x70, 0xaa, 0x22, 0x15, 0xee, 0x99, 0x2c, 0xbb, 0x06, 0xb2, 0xc1, + 0x59, 0x41, 0x3c, 0x2e, 0x8d, 0x90, 0xb5, 0xf6, 0x6f, 0x3d, 0x2c, 0xbe, + 0x3d, 0x67, 0xcb, 0x2b, 0x11, 0xd3, 0xf3, 0xb6, 0xe9, 0x76, 0xe1, 0x1d, + 0xfe, 0xf4, 0xf9, 0x8a, 0x3f, 0xe2, 0xca, 0x9e, 0x7f, 0x58, 0x87, 0x6d, + 0xc5, 0x97, 0xd1, 0xd8, 0x62, 0xcb, 0xe0, 0xbb, 0x85, 0x51, 0x1b, 0x28, + 0x27, 0x9f, 0xa2, 0x1b, 0x4f, 0x1a, 0x21, 0x71, 0x8e, 0xff, 0x4f, 0xcd, + 0x05, 0xdc, 0x2a, 0x8a, 0x6d, 0x7e, 0xd0, 0x5d, 0xc2, 0xa8, 0xa8, 0x17, + 0xb3, 0xe6, 0x96, 0x5a, 0x7e, 0x1e, 0x97, 0x4d, 0x2f, 0xf4, 0xfc, 0xd0, + 0x5d, 0xc2, 0xa8, 0xa9, 0x97, 0x80, 0x7a, 0x59, 0x7e, 0xd0, 0x5d, 0xc2, + 0xa8, 0xac, 0x17, 0xe3, 0x68, 0x60, 0xd2, 0xcb, 0x6c, 0xb2, 0xe1, 0x24, + 0xb2, 0xf3, 0x90, 0x56, 0x54, 0x1e, 0x2f, 0xe2, 0x5e, 0x18, 0xbb, 0x84, + 0xb2, 0xe1, 0x8a, 0xb2, 0xe6, 0x71, 0x65, 0xf9, 0xe5, 0xe3, 0xd9, 0x65, + 0xfb, 0x9c, 0x2c, 0xfd, 0x65, 0x19, 0xe8, 0x39, 0x45, 0xfc, 0x7b, 0x8f, + 0x07, 0xb8, 0xb2, 0xff, 0x4f, 0xcd, 0x05, 0xdc, 0x2a, 0x88, 0xfd, 0x70, + 0x38, 0xb2, 0xf1, 0x40, 0xd6, 0x54, 0x22, 0x92, 0x46, 0x23, 0x41, 0x31, + 0x7b, 0x42, 0xcb, 0xa3, 0x65, 0x95, 0x23, 0x4f, 0x82, 0x17, 0xf7, 0xd2, + 0x79, 0x19, 0x2c, 0xbd, 0x05, 0x32, 0xcb, 0xe8, 0xe1, 0xcc, 0xb2, 0xb0, + 0xfa, 0xc5, 0x2d, 0xd0, 0xe5, 0xcf, 0xe5, 0x97, 0x7b, 0xcb, 0x2d, 0x3c, + 0x6a, 0xe3, 0xf0, 0x70, 0x26, 0x9f, 0x37, 0x19, 0x7e, 0xe8, 0xb3, 0x06, + 0x3a, 0xce, 0xf0, 0xc4, 0x26, 0x2f, 0x42, 0x2f, 0x70, 0xbd, 0xbc, 0x5a, + 0xff, 0xf4, 0xf6, 0x3c, 0xa7, 0xe6, 0x82, 0xee, 0x15, 0x44, 0xde, 0xbf, + 0xf9, 0x8f, 0x29, 0xf9, 0xa0, 0xbb, 0x85, 0x51, 0x3f, 0x2f, 0xcd, 0xd3, + 0x74, 0xdd, 0x37, 0x6d, 0xd2, 0xcb, 0x9e, 0x4b, 0x29, 0xbb, 0x3d, 0x86, + 0xd5, 0x42, 0xbc, 0x11, 0x18, 0xb2, 0xfd, 0xa8, 0xe8, 0x21, 0x65, 0xfb, + 0xb9, 0xe8, 0x1a, 0xca, 0x6c, 0x1f, 0x61, 0x8f, 0x39, 0x3d, 0xfe, 0x6e, + 0x0d, 0xd1, 0xee, 0x74, 0xdb, 0x6b, 0x2e, 0x20, 0xac, 0xbe, 0xe4, 0xcc, + 0xe2, 0xcb, 0xf1, 0x7b, 0xa6, 0xc5, 0x97, 0xd3, 0x01, 0xc4, 0x59, 0x50, + 0x79, 0x6e, 0x4f, 0x70, 0x42, 0xb2, 0xff, 0x07, 0xa7, 0xec, 0xc6, 0x2c, + 0xbb, 0x78, 0x57, 0x18, 0x12, 0x9b, 0x82, 0x6b, 0x30, 0x8a, 0x62, 0xd3, + 0x37, 0xfe, 0x41, 0xc1, 0x7f, 0x19, 0x5f, 0x9b, 0xb6, 0xc6, 0xe6, 0x7c, + 0xb2, 0xfe, 0x6e, 0x9f, 0x6e, 0x9e, 0xea, 0xcb, 0xfe, 0x9d, 0xee, 0xe3, + 0x33, 0x58, 0xb2, 0xfc, 0xdc, 0x8a, 0x2e, 0x6e, 0xac, 0xbf, 0xbc, 0x64, + 0xd6, 0x12, 0xcb, 0xb7, 0x85, 0x71, 0x80, 0xad, 0xd5, 0x97, 0x7f, 0xfa, + 0xca, 0x6e, 0x93, 0x53, 0x6c, 0x1a, 0xb6, 0x4d, 0x9b, 0x81, 0xd6, 0x19, + 0x78, 0xb0, 0x04, 0xc2, 0x08, 0xde, 0xd3, 0xe2, 0xcb, 0xe7, 0x1e, 0x31, + 0x65, 0x37, 0x26, 0xf1, 0xb8, 0x8d, 0xdf, 0x36, 0x76, 0x67, 0x16, 0x5f, + 0xff, 0x89, 0xfd, 0x04, 0x13, 0x60, 0xc0, 0xfa, 0x92, 0xcb, 0xf3, 0x5e, + 0xf4, 0x31, 0x65, 0x37, 0x27, 0xf9, 0xb2, 0x9d, 0xff, 0x3f, 0x4f, 0x7c, + 0xf6, 0x9a, 0x69, 0x25, 0xfe, 0xeb, 0xfb, 0xce, 0xed, 0x2c, 0xa6, 0xca, + 0x67, 0xed, 0xc6, 0x14, 0x8d, 0xac, 0xa1, 0xb8, 0x20, 0x5f, 0xff, 0xcd, + 0x8e, 0x6a, 0x0f, 0xdd, 0xc1, 0x9f, 0x30, 0xbf, 0x59, 0x77, 0x21, 0x65, + 0x37, 0x67, 0xe9, 0x25, 0xeb, 0xfb, 0x76, 0x34, 0xef, 0x25, 0x97, 0xee, + 0x9b, 0xfe, 0xdc, 0x16, 0x5e, 0x8f, 0xa4, 0xb2, 0x9b, 0xa4, 0x50, 0xb6, + 0x84, 0xfe, 0x2f, 0x6f, 0x2e, 0xbf, 0xf9, 0xb9, 0x6e, 0x5b, 0xa9, 0x8a, + 0x07, 0x9f, 0x79, 0x65, 0xf1, 0x61, 0xfe, 0xb2, 0xf9, 0xb5, 0x7f, 0x16, + 0x16, 0x53, 0x60, 0xf3, 0x1b, 0x24, 0x37, 0xfe, 0x88, 0x88, 0x88, 0x8f, + 0xb8, 0xb2, 0xf4, 0xd1, 0xe5, 0x97, 0x44, 0x41, 0xec, 0x4c, 0x77, 0x7f, + 0xfb, 0xb1, 0x37, 0xdc, 0xcf, 0xb7, 0x62, 0x09, 0x65, 0xe3, 0xfb, 0x16, + 0x5f, 0xb4, 0x7b, 0x3b, 0x12, 0x5c, 0xd3, 0x49, 0x2b, 0x0f, 0x05, 0xa2, + 0x8b, 0x01, 0x24, 0xf3, 0x45, 0x7b, 0xb8, 0x15, 0x95, 0x09, 0x9c, 0x74, + 0xb3, 0xf4, 0xee, 0x3f, 0x88, 0x47, 0x7e, 0x06, 0xe4, 0x03, 0xe5, 0x97, + 0xce, 0x50, 0xde, 0xb2, 0xb0, 0xf3, 0xdc, 0xb2, 0xff, 0xcd, 0xe7, 0xbb, + 0xd9, 0xa3, 0x75, 0xd8, 0xb2, 0xff, 0xd8, 0xc8, 0xe7, 0x32, 0x5b, 0x98, + 0xb2, 0xba, 0x88, 0x82, 0x48, 0xbf, 0x31, 0xd9, 0x83, 0x59, 0x7f, 0xde, + 0x0f, 0x4c, 0x8a, 0x3e, 0x59, 0x50, 0x7b, 0xee, 0x4f, 0x46, 0x8a, 0x1e, + 0xc2, 0x06, 0xff, 0x60, 0xcf, 0x7f, 0x3f, 0x0a, 0xcb, 0xff, 0xff, 0x66, + 0xf3, 0xf4, 0xb3, 0xfe, 0x16, 0x7f, 0xa8, 0xd9, 0xf4, 0x15, 0x97, 0x44, + 0x9d, 0x14, 0xbc, 0x36, 0xbf, 0xbd, 0xcc, 0xcd, 0xa1, 0x65, 0x74, 0xf6, + 0x88, 0xb6, 0xfb, 0x83, 0xf0, 0x16, 0x5f, 0xff, 0xfd, 0xbe, 0x35, 0x83, + 0x27, 0xd0, 0xaf, 0xe0, 0x78, 0xfd, 0xce, 0x9a, 0xcb, 0xfd, 0xa0, 0x10, + 0x3c, 0x0f, 0x2c, 0xbd, 0xd8, 0x25, 0x96, 0x83, 0x3c, 0xff, 0x1a, 0x54, + 0x26, 0x58, 0x12, 0x13, 0x23, 0xec, 0x30, 0xaf, 0x11, 0xc2, 0xcb, 0xf4, + 0x08, 0xce, 0x9a, 0xca, 0xd1, 0xe1, 0x10, 0xd5, 0xf9, 0xf6, 0x87, 0x0a, + 0xcb, 0xf8, 0x49, 0xd1, 0xc8, 0x62, 0xca, 0xe9, 0xeb, 0xb9, 0x3d, 0xfd, + 0x2e, 0x7b, 0x08, 0x55, 0x97, 0xfe, 0x97, 0x22, 0x51, 0xff, 0x33, 0x7a, + 0xcb, 0xff, 0xa0, 0x39, 0xac, 0xe9, 0xeb, 0xae, 0xb2, 0xf3, 0x4e, 0xd2, + 0xcb, 0xff, 0xa3, 0x52, 0x0f, 0x4e, 0x62, 0x76, 0x96, 0x5f, 0xfd, 0xa7, + 0xd8, 0x7d, 0x8e, 0x78, 0x1d, 0x59, 0x5c, 0x44, 0x5f, 0x91, 0x6c, 0xcd, + 0x26, 0x1d, 0xd4, 0x2e, 0x42, 0xa6, 0xff, 0x18, 0x90, 0xd0, 0xf1, 0x8b, + 0x2a, 0x13, 0xbf, 0xc8, 0xd3, 0xfa, 0x79, 0x7f, 0xfc, 0x02, 0x28, 0x15, + 0x9d, 0x8f, 0xbd, 0x1d, 0x59, 0x7f, 0xd1, 0xd8, 0xfa, 0x52, 0x8d, 0x96, + 0x5f, 0x07, 0xa7, 0xa5, 0x95, 0xa3, 0xdc, 0x73, 0xab, 0xff, 0xdd, 0x36, + 0x0e, 0x27, 0x6e, 0x03, 0xa7, 0xa5, 0x97, 0xf7, 0xa3, 0xa5, 0x12, 0x59, + 0x7f, 0x89, 0xc5, 0x3d, 0x44, 0xa7, 0x1f, 0xd9, 0xa7, 0xdc, 0x7f, 0x2c, + 0xbf, 0xdf, 0x83, 0x3f, 0x63, 0xc9, 0x65, 0x9e, 0x47, 0x99, 0xf0, 0xbd, + 0xff, 0x1f, 0xb3, 0x5a, 0x06, 0xdb, 0xd6, 0x5f, 0xf7, 0x33, 0xc3, 0xcc, + 0xff, 0x8b, 0x2b, 0xa7, 0xeb, 0xe3, 0xcb, 0xfe, 0x3f, 0x66, 0xb4, 0x0d, + 0xb7, 0xac, 0xbd, 0xc0, 0x14, 0xe3, 0xde, 0xe9, 0x15, 0x0d, 0x5a, 0x18, + 0x4d, 0x75, 0x0a, 0xce, 0xc2, 0x70, 0xa1, 0x2d, 0xc8, 0x7d, 0xdf, 0x30, + 0xc7, 0x0b, 0x2f, 0xe3, 0xee, 0xb4, 0x7b, 0x2c, 0xa8, 0x3c, 0xfe, 0x90, + 0xdc, 0xd7, 0x96, 0x5f, 0xfc, 0x67, 0xd9, 0xb3, 0xd1, 0xe8, 0x1a, 0xcb, + 0x42, 0xcb, 0xff, 0xe8, 0xfa, 0x4e, 0x5f, 0xce, 0xfc, 0xf4, 0x62, 0xac, + 0xa8, 0x45, 0xfc, 0xc3, 0x1b, 0x88, 0x6d, 0xe2, 0x17, 0xde, 0xe7, 0x4d, + 0x65, 0xf6, 0xcc, 0x39, 0x2c, 0xbe, 0x8f, 0xc4, 0x62, 0xcb, 0xe2, 0x03, + 0xc9, 0x65, 0x04, 0xf1, 0x78, 0x49, 0x7f, 0xbb, 0x0c, 0x9f, 0xff, 0xf0, + 0xb2, 0xa1, 0x18, 0x38, 0xd0, 0x64, 0x57, 0xf4, 0xc7, 0xdf, 0x60, 0x56, + 0x56, 0x26, 0x7d, 0xa8, 0x71, 0xb9, 0x6d, 0xfe, 0x18, 0x91, 0xbb, 0xd0, + 0x71, 0x65, 0xf9, 0xbc, 0xd9, 0x9e, 0x59, 0x5f, 0x1f, 0x13, 0x0e, 0x2f, + 0x72, 0x1a, 0x59, 0x73, 0xf5, 0x65, 0xd3, 0x42, 0xcb, 0xa3, 0xcb, 0x2a, + 0x0d, 0x68, 0xa2, 0xf7, 0xc3, 0xc2, 0x92, 0xcb, 0xf6, 0x1c, 0xbb, 0x0b, + 0x2e, 0x9b, 0xc6, 0x78, 0xfd, 0x21, 0xbf, 0xff, 0x0f, 0xb1, 0xa3, 0xfe, + 0x04, 0x89, 0x8a, 0x18, 0xb2, 0xff, 0x0b, 0x05, 0xee, 0x3f, 0x56, 0x54, + 0x22, 0xdc, 0xcb, 0x9d, 0x5a, 0xfc, 0x58, 0xe5, 0xb2, 0xca, 0x84, 0xfd, + 0x70, 0x8c, 0xc7, 0x5d, 0x0c, 0xa3, 0x1f, 0xe1, 0x6d, 0xe7, 0xcd, 0x2c, + 0xbf, 0xa3, 0x6d, 0x46, 0x0d, 0x65, 0xfe, 0x1f, 0x63, 0xde, 0x86, 0x2c, + 0xad, 0x1f, 0xdf, 0x46, 0xc4, 0x2d, 0xbf, 0xed, 0x46, 0x9e, 0x25, 0x12, + 0x59, 0x7f, 0xfc, 0x59, 0xbc, 0x2f, 0xad, 0x9f, 0xcf, 0xf7, 0xeb, 0x2a, + 0x11, 0x74, 0x66, 0x0e, 0x6f, 0x7f, 0x89, 0xf6, 0xfa, 0x50, 0xde, 0xb2, + 0xff, 0x73, 0xae, 0x27, 0x62, 0x4b, 0x2b, 0x63, 0xeb, 0xf8, 0xde, 0xec, + 0x99, 0x65, 0xff, 0xff, 0xb3, 0xd0, 0x72, 0x7e, 0x72, 0x30, 0xa2, 0x58, + 0xc7, 0xf9, 0x65, 0x61, 0xff, 0xf0, 0x5e, 0xff, 0xfb, 0xb0, 0xc3, 0xd1, + 0xb7, 0xc0, 0x9b, 0x63, 0x4b, 0x2f, 0xec, 0x00, 0x44, 0xcf, 0x96, 0x54, + 0xc8, 0x83, 0xde, 0xa9, 0x7f, 0xe3, 0xd4, 0x70, 0x42, 0x28, 0xd2, 0xcb, + 0xfe, 0x89, 0x13, 0xfa, 0x47, 0xbd, 0x65, 0xe1, 0x23, 0xf5, 0x95, 0xd3, + 0xd7, 0xe1, 0xcd, 0xb7, 0x56, 0x5e, 0xf4, 0xb1, 0x65, 0xdc, 0xc5, 0x97, + 0xe8, 0x98, 0xe3, 0x8b, 0x2f, 0xfe, 0xe4, 0x68, 0x3e, 0x2c, 0xd9, 0xc9, + 0x65, 0x42, 0x71, 0x9b, 0x13, 0x64, 0x25, 0x0c, 0x89, 0xc5, 0x3f, 0x1c, + 0x21, 0x6f, 0x13, 0xdd, 0xe6, 0x2c, 0xbf, 0x4c, 0x0f, 0x47, 0x56, 0x54, + 0x1e, 0x00, 0x05, 0xef, 0xfd, 0x1e, 0x7e, 0x67, 0x7a, 0x6c, 0x59, 0x7e, + 0x28, 0xda, 0x36, 0x59, 0x43, 0x3e, 0x59, 0x8f, 0x6f, 0xe1, 0xc3, 0xeb, + 0xf0, 0x2c, 0xbb, 0x3a, 0xb2, 0xb6, 0x3c, 0x4d, 0xe5, 0xd7, 0xff, 0xd8, + 0x6c, 0x3f, 0xdf, 0xc5, 0x9b, 0x6a, 0x16, 0x5e, 0xf1, 0xcc, 0xb2, 0xff, + 0x18, 0xaf, 0x2e, 0x18, 0xd6, 0x54, 0x26, 0x55, 0x8c, 0xfd, 0x25, 0xe2, + 0x77, 0x87, 0x6f, 0x6c, 0x09, 0x2c, 0xbf, 0xc7, 0xce, 0xbb, 0x23, 0x75, + 0x65, 0xff, 0xe9, 0xa4, 0x7b, 0xe3, 0x58, 0x72, 0x06, 0x96, 0x56, 0x91, + 0x02, 0xe6, 0xb7, 0xe8, 0xdd, 0x36, 0x82, 0xb2, 0xff, 0xb1, 0x9c, 0x3d, + 0xcc, 0xd4, 0x2c, 0xa8, 0x6e, 0x3d, 0x76, 0x84, 0xdc, 0xa3, 0x49, 0x1c, + 0xa5, 0x2c, 0x84, 0x18, 0x5e, 0x3e, 0x21, 0x39, 0xd3, 0x0d, 0xd8, 0x5d, + 0xcd, 0x0e, 0x0d, 0x47, 0x02, 0xc9, 0x51, 0x7d, 0x8e, 0x39, 0xe1, 0x31, + 0xfc, 0x28, 0xca, 0x51, 0x87, 0x21, 0x69, 0xe8, 0xec, 0x00, 0x93, 0xbe, + 0x13, 0xe2, 0x11, 0x37, 0x95, 0xdc, 0x2f, 0x96, 0x5f, 0xff, 0xf3, 0x71, + 0x6c, 0xc6, 0x36, 0xbd, 0x36, 0x5b, 0x4d, 0xfb, 0xad, 0xc0, 0x13, 0xa7, + 0x77, 0x71, 0x65, 0xc7, 0x0b, 0x2f, 0x4c, 0x23, 0x16, 0x5f, 0xf6, 0x7b, + 0x99, 0xee, 0xe7, 0xeb, 0x28, 0x53, 0xed, 0x71, 0x52, 0x1f, 0xb9, 0xc9, + 0x65, 0x68, 0xf0, 0xd8, 0x5d, 0x7d, 0x1e, 0xc6, 0x2c, 0xbf, 0x7a, 0x08, + 0xff, 0x59, 0x77, 0xdf, 0x2c, 0xbf, 0x68, 0x1b, 0xff, 0x69, 0x65, 0xfd, + 0x8d, 0x3f, 0xec, 0xc5, 0x95, 0x39, 0x17, 0x98, 0x43, 0xf1, 0x3f, 0x46, + 0x48, 0xb6, 0xff, 0xd0, 0xc3, 0xfb, 0x80, 0x98, 0x02, 0xac, 0xbf, 0x17, + 0xbb, 0x92, 0x59, 0x77, 0x31, 0x65, 0x19, 0xbd, 0x72, 0x7b, 0xfc, 0x50, + 0xd6, 0xe6, 0x6a, 0x16, 0x59, 0xa9, 0xc8, 0xd3, 0x93, 0xf8, 0xc7, 0xef, + 0xb6, 0x8f, 0x71, 0x65, 0xe8, 0xff, 0x8b, 0x2b, 0x47, 0x80, 0x44, 0x77, + 0xcf, 0xa7, 0x92, 0xcb, 0x6b, 0x0f, 0x08, 0x88, 0x6f, 0x34, 0xd3, 0x4b, + 0x2f, 0xb6, 0x23, 0x84, 0x93, 0xcd, 0x05, 0xff, 0x6e, 0xf5, 0xca, 0x43, + 0x8d, 0x96, 0x5f, 0x3f, 0xa0, 0x6b, 0x2e, 0xfa, 0x4b, 0x2f, 0xf0, 0xb1, + 0xee, 0x75, 0xc0, 0xb2, 0xfc, 0x7b, 0x67, 0xde, 0x59, 0x71, 0x85, 0x65, + 0x42, 0x22, 0xc5, 0x18, 0x61, 0xa7, 0x8a, 0x6f, 0xfa, 0x5f, 0x70, 0xf4, + 0x1e, 0xe2, 0xcb, 0xf0, 0xaf, 0xcd, 0xf2, 0x59, 0x5f, 0x22, 0x8b, 0x47, + 0xbe, 0x3a, 0xbd, 0x80, 0xdc, 0x59, 0x4d, 0x85, 0xe6, 0x66, 0xd0, 0x62, + 0x23, 0x44, 0x1c, 0x37, 0xb2, 0x31, 0xe3, 0x85, 0xdf, 0x51, 0x9c, 0xcc, + 0x8f, 0x01, 0x1a, 0x76, 0xe1, 0x8d, 0xff, 0x75, 0xe6, 0x28, 0xcd, 0x49, + 0x65, 0xff, 0x9a, 0xce, 0x11, 0xc6, 0xb3, 0x65, 0x95, 0xba, 0x7e, 0xdb, + 0xce, 0x2f, 0xff, 0xff, 0xfd, 0xbb, 0x3b, 0xb9, 0xf4, 0xba, 0xc9, 0xc1, + 0xe8, 0x3d, 0xec, 0x2e, 0xe7, 0xa0, 0x73, 0xa7, 0x77, 0x71, 0x65, 0xff, + 0x0f, 0x00, 0xdb, 0x3e, 0xbb, 0x16, 0x5f, 0xa1, 0x85, 0x93, 0x2c, 0xc3, + 0x79, 0x7b, 0x7e, 0x0d, 0x65, 0xfd, 0xd3, 0x82, 0x04, 0x2c, 0xbf, 0xd1, + 0xba, 0x2e, 0x71, 0xf7, 0x56, 0x50, 0xa7, 0xc9, 0xd2, 0xba, 0xea, 0x29, + 0x5e, 0x10, 0x57, 0xdd, 0x81, 0x3a, 0xb2, 0x86, 0x99, 0x2f, 0x21, 0xb7, + 0xe2, 0x7b, 0xfa, 0x25, 0xd8, 0xde, 0x6b, 0x2f, 0xcc, 0x01, 0x43, 0x16, + 0x58, 0x6b, 0x2e, 0x7e, 0x2c, 0xb6, 0x98, 0x69, 0xc0, 0x23, 0x50, 0x7e, + 0xae, 0x9d, 0x74, 0xbc, 0xb2, 0xfa, 0x68, 0xf3, 0xac, 0xbe, 0x07, 0xf8, + 0x41, 0x37, 0x20, 0x17, 0xb4, 0x96, 0x56, 0xc7, 0x93, 0xd3, 0x8b, 0xff, + 0xa3, 0xa2, 0x0f, 0xc7, 0x93, 0x43, 0x16, 0x5f, 0xfb, 0xc6, 0xd0, 0x7a, + 0x7b, 0xcc, 0x6b, 0x2f, 0xf6, 0xa5, 0xdc, 0xdf, 0x0c, 0x59, 0x7c, 0x06, + 0xdf, 0x31, 0x65, 0x7c, 0x89, 0xc3, 0x41, 0x73, 0x5b, 0xf3, 0xcb, 0x87, + 0xbd, 0x65, 0xff, 0x66, 0xb2, 0x76, 0x6a, 0x06, 0xb2, 0xf3, 0x01, 0xbd, + 0x65, 0xfd, 0x92, 0xfa, 0x59, 0xe5, 0x96, 0xf4, 0x91, 0x0d, 0x87, 0x3d, + 0x1f, 0xbe, 0x8f, 0x01, 0x8b, 0x29, 0x51, 0x07, 0x2f, 0xe7, 0xdb, 0xf7, + 0x21, 0xa2, 0xb0, 0x6a, 0xdc, 0x09, 0xea, 0x6e, 0x0c, 0x53, 0x11, 0x43, + 0xe7, 0x6b, 0xfe, 0x3c, 0xf7, 0x35, 0x83, 0xc5, 0x97, 0xf7, 0x5d, 0x85, + 0x1f, 0x2c, 0xbe, 0x67, 0x1e, 0x5d, 0x3e, 0x41, 0x0d, 0xef, 0xef, 0xfa, + 0x59, 0xee, 0x2c, 0xbf, 0x8b, 0x37, 0x96, 0x71, 0x65, 0xa3, 0x47, 0xb7, + 0xe2, 0xea, 0x84, 0xd0, 0xf2, 0x10, 0xfc, 0x84, 0xad, 0xfc, 0xfd, 0x8d, + 0xd0, 0x49, 0x65, 0x49, 0x76, 0xa4, 0x30, 0xa3, 0xd4, 0x28, 0x98, 0x47, + 0xd8, 0x70, 0xfe, 0x5e, 0x50, 0xaf, 0xf4, 0xa1, 0x9d, 0xe7, 0x37, 0xf4, + 0x8b, 0x3e, 0xf6, 0x2c, 0xbf, 0xff, 0x09, 0xff, 0xf1, 0xf6, 0x6c, 0x37, + 0x70, 0xb8, 0xd6, 0x54, 0x22, 0x1b, 0x45, 0xb7, 0xf1, 0x7a, 0x59, 0xac, + 0x59, 0x76, 0xe3, 0xac, 0xa7, 0x3c, 0x51, 0x0b, 0x2f, 0xf7, 0x70, 0x2f, + 0xd8, 0xea, 0xcb, 0xff, 0x9c, 0xfd, 0x04, 0x1c, 0xf7, 0x4d, 0x65, 0xfc, + 0x47, 0xff, 0x3a, 0x6b, 0x2e, 0xd0, 0xd6, 0x5c, 0xd3, 0x4b, 0x2a, 0x46, + 0xc1, 0xa1, 0x7b, 0xd0, 0x7b, 0xd2, 0x4f, 0x34, 0x57, 0xfc, 0x64, 0x7f, + 0xf3, 0x3a, 0xeb, 0x2b, 0x13, 0x58, 0xe9, 0x93, 0xa0, 0xf1, 0xff, 0xc5, + 0xf7, 0xf4, 0x17, 0xbb, 0x92, 0x59, 0x77, 0xfc, 0x59, 0x7f, 0x1f, 0x4c, + 0x51, 0x61, 0x65, 0x84, 0x19, 0xe3, 0x78, 0x62, 0xb4, 0x89, 0xbe, 0x39, + 0x51, 0xa6, 0x0e, 0x24, 0x39, 0x2f, 0xed, 0xdc, 0x91, 0x93, 0xac, 0xbc, + 0xd3, 0x4d, 0x24, 0xa4, 0x93, 0xcd, 0x05, 0xf1, 0xb4, 0x73, 0x24, 0xa0, + 0x9e, 0x01, 0x8e, 0xdf, 0xb3, 0x51, 0xbf, 0x16, 0x54, 0x33, 0x47, 0xb6, + 0x27, 0xc9, 0x41, 0x87, 0x3b, 0xbf, 0xa8, 0xc9, 0x18, 0xcf, 0xd9, 0x50, + 0x2e, 0x52, 0x50, 0x8e, 0xe1, 0x0d, 0xf6, 0xa4, 0x0c, 0x59, 0x7f, 0x8b, + 0xef, 0x09, 0xd7, 0xfd, 0x65, 0xe2, 0x3e, 0x2c, 0xbc, 0x79, 0xb2, 0xcb, + 0xe1, 0xb9, 0x7e, 0xb2, 0xff, 0xe8, 0x2f, 0xca, 0x3e, 0x9a, 0x0b, 0xf5, + 0x95, 0x88, 0xd4, 0x33, 0x6e, 0x8d, 0xfe, 0x39, 0xc2, 0x2b, 0xe9, 0x7f, + 0x22, 0x59, 0x7e, 0x9b, 0x73, 0xfd, 0xcc, 0x59, 0x7d, 0x1e, 0x7e, 0xac, + 0xb1, 0xac, 0xbf, 0xe7, 0x14, 0x3d, 0x31, 0xbc, 0x96, 0x5f, 0x6d, 0xb3, + 0xfc, 0xb2, 0xef, 0xf8, 0x67, 0xdc, 0x42, 0x02, 0x1c, 0xdf, 0x66, 0xba, + 0x6b, 0x2f, 0xff, 0x3c, 0x8b, 0x37, 0xbc, 0xd1, 0x9e, 0xe2, 0xca, 0x83, + 0xeb, 0x72, 0x1b, 0xff, 0xcd, 0x7f, 0xdc, 0xcd, 0x8f, 0x37, 0xc7, 0xcb, + 0x2f, 0xff, 0x7f, 0x0c, 0xd6, 0xa3, 0x6f, 0x3b, 0x8a, 0xb2, 0xf3, 0x20, + 0x2b, 0x2f, 0xf9, 0xe5, 0xcf, 0xdf, 0x7e, 0x0d, 0x65, 0xd9, 0xdc, 0x3d, + 0x7e, 0x8e, 0x5f, 0xb4, 0x7b, 0x3b, 0x16, 0x5c, 0xd3, 0x4b, 0x2b, 0x0f, + 0x05, 0xa2, 0x8b, 0xba, 0x04, 0x93, 0xcd, 0x15, 0xe9, 0x08, 0xc5, 0x97, + 0xcf, 0xf0, 0xc6, 0xb2, 0xa4, 0x8f, 0x93, 0x84, 0x7b, 0x94, 0xf0, 0x7a, + 0xf6, 0x33, 0x75, 0x65, 0xff, 0x9f, 0x7e, 0x08, 0x51, 0xd3, 0xd9, 0x65, + 0xfe, 0xce, 0x16, 0x7b, 0xa6, 0xb2, 0x86, 0x89, 0x0d, 0x0f, 0x92, 0x05, + 0x62, 0xba, 0xf9, 0xa1, 0x4d, 0xd2, 0x0f, 0xd3, 0xbd, 0x1c, 0xe6, 0xf8, + 0x68, 0x5f, 0x4b, 0xfc, 0xfd, 0x65, 0xfd, 0xec, 0x98, 0xa1, 0x8b, 0x88, + 0x09, 0x7c, 0x43, 0xec, 0x2a, 0x20, 0x24, 0xf3, 0x75, 0x5f, 0x22, 0x79, + 0xd7, 0xaf, 0xfe, 0x3f, 0xb8, 0x3c, 0x28, 0x20, 0x42, 0xcb, 0xf6, 0x8c, + 0x0d, 0xb8, 0x59, 0x7f, 0xb5, 0x9f, 0x73, 0xf7, 0xf2, 0xcb, 0x80, 0x18, + 0x3e, 0x01, 0x4a, 0xef, 0xd1, 0x27, 0xf9, 0xa5, 0x97, 0xfd, 0x3b, 0x5a, + 0xce, 0xfd, 0x2e, 0x2c, 0xbf, 0xff, 0xd9, 0xc0, 0x3f, 0xd9, 0x84, 0x2f, + 0x39, 0x85, 0xee, 0x2c, 0xa0, 0xa2, 0x77, 0xe3, 0xdb, 0xf3, 0xb4, 0x31, + 0x77, 0xac, 0xac, 0x4f, 0x98, 0xe1, 0x45, 0xa2, 0xe7, 0x86, 0x31, 0x12, + 0x5b, 0x65, 0x97, 0xe9, 0xd9, 0x31, 0xb1, 0x65, 0xff, 0xe0, 0x44, 0xe6, + 0xff, 0x1f, 0x3b, 0xf3, 0xb4, 0xb2, 0xb6, 0x3f, 0xbe, 0x15, 0x5f, 0xfb, + 0x07, 0xd7, 0x9f, 0x1d, 0x8f, 0x96, 0x53, 0x61, 0x1e, 0x1a, 0x84, 0x6b, + 0x08, 0xef, 0xf8, 0x85, 0xd1, 0x18, 0x40, 0x4b, 0x2f, 0xde, 0x8c, 0x28, + 0x59, 0x46, 0x7b, 0xa4, 0x71, 0x78, 0x42, 0xf2, 0xcb, 0xc6, 0xc7, 0x59, + 0x5b, 0x1b, 0x81, 0x47, 0x6f, 0xc1, 0xc3, 0xe3, 0x16, 0x5f, 0xff, 0x7d, + 0xf7, 0x20, 0xbc, 0x24, 0xdd, 0x3f, 0x71, 0x65, 0x30, 0xfe, 0xdc, 0x9e, + 0xa1, 0x3a, 0xdc, 0x84, 0xb1, 0xac, 0x02, 0x13, 0xd7, 0x9b, 0xe3, 0xe5, + 0x97, 0xa3, 0x18, 0xb2, 0xff, 0x85, 0xf6, 0x6b, 0x47, 0x37, 0x16, 0x54, + 0x8f, 0xd9, 0x84, 0x0e, 0x37, 0x7f, 0xec, 0x64, 0x04, 0xfd, 0xa0, 0x31, + 0x65, 0xfb, 0x60, 0x4c, 0xe3, 0x59, 0x78, 0xfe, 0xe2, 0xcb, 0xff, 0xb9, + 0x1b, 0x66, 0xa6, 0x28, 0xff, 0x8b, 0x2f, 0xf4, 0x64, 0xc5, 0x1a, 0x92, + 0xca, 0x92, 0x3f, 0x5c, 0xfb, 0xf2, 0xaf, 0x0e, 0xb4, 0x8d, 0x7d, 0xa7, + 0x94, 0xcb, 0x2f, 0xdc, 0xe4, 0x7e, 0xdd, 0x2c, 0xa1, 0x4f, 0x45, 0xa2, + 0x3a, 0x84, 0x60, 0x3c, 0x27, 0x2f, 0xf6, 0xa6, 0xe1, 0x97, 0x8d, 0x65, + 0xff, 0x10, 0xb9, 0xaf, 0xd8, 0x7c, 0x59, 0x7f, 0xba, 0x7f, 0x7f, 0xa7, + 0x1a, 0xcb, 0xef, 0xbf, 0xd4, 0x24, 0xb9, 0xa6, 0x92, 0x54, 0x1b, 0xd6, + 0x89, 0x2e, 0x23, 0x49, 0x3c, 0xd0, 0xdf, 0xff, 0xfc, 0x53, 0xf3, 0x1b, + 0xe2, 0x63, 0x64, 0x4d, 0x38, 0xbe, 0x97, 0x41, 0xfa, 0xca, 0x59, 0x76, + 0xa5, 0x39, 0x34, 0x09, 0x42, 0x4f, 0xe2, 0x7f, 0xde, 0xea, 0x13, 0xcd, + 0x78, 0xde, 0xaf, 0xc5, 0x20, 0x83, 0x65, 0x97, 0xa3, 0x53, 0x2c, 0xa7, + 0x3c, 0x60, 0x14, 0xd3, 0x72, 0xd8, 0x96, 0x44, 0x3d, 0xb6, 0x49, 0x91, + 0x18, 0xcc, 0x32, 0x70, 0xf8, 0xe3, 0x0a, 0xd4, 0xa0, 0x9e, 0xca, 0xee, + 0x78, 0x5d, 0x94, 0x7d, 0x7e, 0x26, 0x04, 0xa0, 0x06, 0x9b, 0xaf, 0x78, + 0xda, 0x59, 0x7b, 0x67, 0x62, 0xcb, 0xfc, 0xe5, 0xf4, 0xba, 0x27, 0x16, + 0x5c, 0x63, 0x59, 0x7b, 0xc6, 0xd2, 0xe3, 0x08, 0x5e, 0x03, 0x88, 0xa8, + 0x81, 0xdf, 0x1a, 0xaa, 0x92, 0x2c, 0x3a, 0x6b, 0xe4, 0x0a, 0x74, 0x7e, + 0x82, 0x19, 0xb7, 0x8b, 0x4d, 0xb5, 0x97, 0xfb, 0x03, 0x1b, 0x14, 0x05, + 0x65, 0xbf, 0x59, 0x6d, 0xd9, 0xc7, 0x88, 0x66, 0x57, 0x40, 0x16, 0x5f, + 0x80, 0x5f, 0x89, 0x25, 0x97, 0xff, 0xc5, 0x9c, 0x9c, 0x27, 0x63, 0xf6, + 0x3c, 0xa7, 0x61, 0xe0, 0x70, 0x5a, 0x80, 0x8d, 0x7d, 0xed, 0x97, 0xff, + 0x68, 0xfe, 0x13, 0xd8, 0x72, 0x7e, 0x2c, 0xbf, 0xe0, 0x6d, 0x13, 0xa3, + 0xd0, 0x35, 0x95, 0xa4, 0x40, 0x75, 0x16, 0xf3, 0xeb, 0x65, 0x97, 0x34, + 0xd2, 0xcb, 0xfd, 0xa3, 0xcd, 0xe2, 0x4a, 0x78, 0x4d, 0xb3, 0x43, 0xb7, + 0xfe, 0x31, 0x67, 0x70, 0x1f, 0xb2, 0x24, 0xb2, 0xff, 0x73, 0x3c, 0xec, + 0xc2, 0x59, 0x43, 0x4c, 0x73, 0x4b, 0x3d, 0x4f, 0xf2, 0x1d, 0xff, 0xb9, + 0x85, 0x9d, 0xc0, 0xe1, 0x2c, 0xbf, 0xe9, 0x73, 0xdd, 0xc6, 0x64, 0x96, + 0x5f, 0xfb, 0x05, 0xeb, 0xc8, 0x47, 0xfa, 0x16, 0x54, 0x91, 0x68, 0x67, + 0x64, 0x73, 0x50, 0x99, 0x06, 0x43, 0xca, 0xff, 0xe6, 0x31, 0xe5, 0x9a, + 0x0b, 0xb8, 0x55, 0x10, 0xc2, 0xff, 0xff, 0xf3, 0xf3, 0x0b, 0x03, 0xd8, + 0xfa, 0x5b, 0x99, 0xd0, 0x9e, 0x13, 0x8a, 0xb2, 0xb1, 0x19, 0x00, 0x50, + 0xa8, 0x5d, 0x2d, 0x38, 0xce, 0xfb, 0x2b, 0x84, 0xa1, 0xdf, 0x7e, 0x28, + 0xff, 0xef, 0xd6, 0x5d, 0x02, 0x2c, 0xbf, 0x3e, 0xc5, 0x12, 0x49, 0x53, + 0x1b, 0xee, 0x8b, 0xdf, 0xfb, 0xdd, 0x73, 0xf4, 0x6a, 0x3f, 0x59, 0x7e, + 0xeb, 0x90, 0x9b, 0x2c, 0xa9, 0x23, 0xc5, 0x8d, 0x04, 0x44, 0xd1, 0xf5, + 0xff, 0x8c, 0x31, 0xc7, 0xd6, 0x8d, 0xa5, 0x97, 0xfe, 0xf1, 0x96, 0xd9, + 0xf7, 0xba, 0xeb, 0x2f, 0xfe, 0x3d, 0x0a, 0x1e, 0x9f, 0x48, 0x1b, 0x2c, + 0xb7, 0x31, 0x10, 0xbf, 0x9f, 0xdf, 0x03, 0x38, 0x6b, 0x2e, 0xe0, 0x16, + 0x5f, 0xd2, 0xeb, 0xb9, 0x42, 0xcb, 0x40, 0x4f, 0x0b, 0xe1, 0x7b, 0xff, + 0xb3, 0xd1, 0xd3, 0xc1, 0x45, 0x89, 0x2c, 0xbf, 0x68, 0x2e, 0xe1, 0x54, + 0x41, 0x4b, 0xdd, 0x86, 0x2c, 0xbf, 0xf4, 0x6c, 0xfe, 0xd6, 0x4b, 0x73, + 0x16, 0x50, 0xd1, 0xab, 0x88, 0x86, 0x68, 0x43, 0x97, 0xee, 0xc3, 0x01, + 0xf2, 0xcb, 0xef, 0x72, 0x3f, 0x49, 0x79, 0xf5, 0xb2, 0x4b, 0xe0, 0x13, + 0x8a, 0x92, 0xff, 0x1e, 0xd9, 0xee, 0x47, 0xe9, 0x29, 0x25, 0xfd, 0x81, + 0x8e, 0xc3, 0x12, 0x5c, 0xd3, 0x49, 0x2f, 0xe2, 0x82, 0xd8, 0xf4, 0x92, + 0xb1, 0x31, 0x20, 0x91, 0xb0, 0x77, 0xa4, 0x5f, 0x9a, 0x10, 0x5b, 0x45, + 0x82, 0x0c, 0xdc, 0x7a, 0x49, 0x3c, 0xfc, 0xea, 0x4a, 0x84, 0x66, 0x3a, + 0xec, 0x75, 0xd7, 0xff, 0xe8, 0x6b, 0x85, 0x9f, 0x79, 0xcb, 0x6c, 0xfb, + 0xcb, 0x2a, 0x17, 0x4a, 0xb0, 0xf4, 0xe1, 0x87, 0xa2, 0x9e, 0xb1, 0xbc, + 0xb0, 0xe2, 0x39, 0xbc, 0xc7, 0x1a, 0xcb, 0xff, 0xfe, 0x2c, 0xf7, 0xa3, + 0xe9, 0x4e, 0xec, 0x30, 0x1f, 0x73, 0xb0, 0xb2, 0xfe, 0xc2, 0xe1, 0x96, + 0x2c, 0xbf, 0x99, 0x83, 0xee, 0x6c, 0xb2, 0xff, 0xf1, 0x38, 0xbc, 0xff, + 0xde, 0xfb, 0xd8, 0x15, 0x95, 0x07, 0xf6, 0x29, 0x75, 0xee, 0x81, 0x8b, + 0x28, 0x54, 0xda, 0xb7, 0x47, 0x3a, 0xd4, 0x50, 0xa5, 0x6f, 0x22, 0xbf, + 0xce, 0x59, 0xcd, 0x47, 0x16, 0x5f, 0xc3, 0xc2, 0x7f, 0x71, 0x65, 0x48, + 0xf7, 0x78, 0x63, 0x7c, 0xf3, 0x67, 0x56, 0x5f, 0xf4, 0x19, 0x3f, 0xa6, + 0x36, 0x96, 0x5b, 0x53, 0x8f, 0x6b, 0x84, 0x55, 0x08, 0xa6, 0x37, 0xcb, + 0xf6, 0xbe, 0x96, 0x79, 0x65, 0xff, 0xf3, 0x9f, 0xfc, 0xc1, 0x5d, 0x9a, + 0x8c, 0x25, 0x97, 0xef, 0x1e, 0x7d, 0xe5, 0x97, 0xff, 0xfd, 0xd3, 0xd6, + 0x0d, 0xd9, 0x85, 0xe2, 0x86, 0xb3, 0xdc, 0x59, 0x68, 0x59, 0x7d, 0x1b, + 0xc7, 0x01, 0x3f, 0x4f, 0xd9, 0x2f, 0xfc, 0xf2, 0xeb, 0xfb, 0x98, 0x52, + 0x59, 0x5d, 0x3f, 0x8f, 0x1d, 0xd6, 0x93, 0xad, 0xe9, 0x4f, 0x13, 0xbd, + 0x18, 0xa5, 0xff, 0xec, 0xd7, 0xfe, 0xd6, 0x6d, 0xe8, 0xce, 0x2c, 0xbc, + 0x1c, 0x62, 0xcb, 0xf8, 0x6f, 0xee, 0x02, 0x4b, 0x2e, 0x96, 0xe4, 0x1e, + 0x50, 0x83, 0x97, 0xf3, 0xea, 0x3c, 0x7b, 0xd6, 0x57, 0xc7, 0xbe, 0x46, + 0x37, 0xff, 0xfe, 0xd6, 0xa3, 0xe9, 0x7d, 0xc3, 0xd0, 0x7b, 0x82, 0x68, + 0xe0, 0x6b, 0x2f, 0xf9, 0xf5, 0x9f, 0x4a, 0x3f, 0x85, 0x95, 0x08, 0xca, + 0xc2, 0x20, 0x37, 0xdf, 0xff, 0x82, 0x2b, 0xf3, 0x35, 0x23, 0xeb, 0x97, + 0xd2, 0x59, 0x7f, 0xe0, 0xc7, 0xb9, 0x9e, 0x3f, 0x9a, 0x59, 0x67, 0xc4, + 0x4b, 0x0a, 0xad, 0x50, 0xab, 0xb8, 0x68, 0x9d, 0x8e, 0xf8, 0xa1, 0x89, + 0x7e, 0xe1, 0x03, 0x7c, 0x96, 0x5e, 0xd8, 0x40, 0xac, 0xbe, 0x23, 0x9b, + 0x75, 0x65, 0x41, 0xf7, 0x39, 0x57, 0x07, 0xee, 0x7f, 0xd6, 0x54, 0x8f, + 0x13, 0xc5, 0xb7, 0xff, 0xe7, 0x79, 0x3f, 0x67, 0x66, 0xc0, 0xf0, 0x1c, + 0x45, 0x45, 0xf6, 0xbd, 0xbc, 0x1e, 0x59, 0x74, 0x0d, 0x65, 0x41, 0xb5, + 0xfc, 0x7e, 0xfe, 0x70, 0xc1, 0x47, 0xeb, 0x2f, 0xfd, 0xc3, 0x2f, 0xa5, + 0xa0, 0x47, 0x16, 0x5f, 0xb3, 0x58, 0x38, 0x59, 0x53, 0x26, 0x99, 0xa8, + 0x4d, 0x74, 0x87, 0xc5, 0x9b, 0xcf, 0xef, 0xdd, 0xc9, 0xa3, 0x75, 0x65, + 0xf8, 0x7a, 0xd6, 0x34, 0xb2, 0xb6, 0x3d, 0x42, 0x2b, 0xbf, 0x8c, 0xb3, + 0xd1, 0x32, 0xca, 0x83, 0xce, 0x91, 0x15, 0xd2, 0xe2, 0xcb, 0xfb, 0x92, + 0x30, 0xbe, 0x96, 0x58, 0x2b, 0x2f, 0xff, 0xf7, 0xe7, 0xa1, 0x7b, 0x0c, + 0x9a, 0x46, 0x5d, 0x8d, 0x42, 0xcb, 0x7b, 0x0f, 0xcf, 0x82, 0x37, 0x8f, + 0x58, 0xb2, 0xf1, 0x64, 0x96, 0x50, 0x4d, 0xb7, 0x86, 0xea, 0x0f, 0xf8, + 0xd7, 0x6f, 0xfc, 0x47, 0x2f, 0x77, 0x34, 0x7c, 0x59, 0x7e, 0x91, 0x66, + 0x6c, 0xb2, 0xed, 0x6c, 0xb2, 0xa0, 0xdf, 0xe1, 0x3d, 0xfe, 0x71, 0xc7, + 0xf0, 0xd7, 0x16, 0x57, 0x4f, 0x4d, 0xc7, 0xef, 0xed, 0xc6, 0xd7, 0x3a, + 0x77, 0x77, 0x17, 0x10, 0x0a, 0xff, 0x7b, 0xf1, 0x0a, 0x5d, 0xc5, 0xc4, + 0x02, 0xbc, 0xfa, 0x92, 0xe2, 0x01, 0x56, 0x1f, 0x58, 0x10, 0xae, 0x79, + 0x2e, 0x20, 0x15, 0xf3, 0x97, 0xd2, 0x5c, 0x40, 0x2b, 0xfc, 0x61, 0xee, + 0x7f, 0xfc, 0x2e, 0x20, 0x15, 0xe3, 0x21, 0xae, 0x20, 0x15, 0x0d, 0x17, + 0x6c, 0x23, 0xe9, 0x7e, 0xf4, 0x1b, 0x0a, 0xb8, 0x80, 0x57, 0xb5, 0x1e, + 0x5c, 0x40, 0x2a, 0x5c, 0x40, 0x2b, 0xdb, 0x87, 0xfa, 0xe2, 0x01, 0x5d, + 0x0c, 0x5c, 0x40, 0x2a, 0x19, 0xf4, 0x60, 0xc1, 0x96, 0xdf, 0x1b, 0x07, + 0x0b, 0x88, 0x05, 0x7b, 0xce, 0x15, 0xc4, 0x02, 0xbf, 0xf1, 0x3c, 0xa7, + 0xf4, 0xc2, 0xfa, 0x5c, 0x40, 0x2b, 0xff, 0x9f, 0xc0, 0xd8, 0xcb, 0xdd, + 0x79, 0x2e, 0x20, 0x15, 0xce, 0x35, 0xc4, 0x02, 0xbf, 0xc4, 0xed, 0x73, + 0x91, 0xfa, 0xe2, 0x01, 0x5f, 0x8c, 0x57, 0x2f, 0xd7, 0x10, 0x0a, 0xe3, + 0xe2, 0xe2, 0x01, 0x56, 0x8f, 0x63, 0xc6, 0xb7, 0xff, 0xba, 0x7e, 0xf6, + 0x72, 0x76, 0x8e, 0x18, 0xb8, 0x80, 0x57, 0xef, 0x14, 0x7d, 0x25, 0x44, + 0x02, 0xbb, 0xf8, 0x5c, 0x40, 0x29, 0xe6, 0xd6, 0xfc, 0x70, 0xc7, 0x1a, + 0xe2, 0x01, 0x5f, 0x01, 0xc8, 0x2b, 0x88, 0x05, 0x7a, 0x34, 0x15, 0xc4, + 0x02, 0xbf, 0xf6, 0x7d, 0xc1, 0xc6, 0x17, 0xfc, 0x5c, 0x40, 0x2b, 0xf0, + 0x1e, 0x52, 0x85, 0xc4, 0x02, 0xbf, 0x38, 0x7b, 0x1f, 0x2e, 0x20, 0x15, + 0x62, 0x2d, 0x7a, 0x98, 0x03, 0x4b, 0xb5, 0xfa, 0xe2, 0x01, 0x54, 0x95, + 0x9a, 0x0c, 0x8f, 0x21, 0x32, 0x12, 0x23, 0x84, 0x6f, 0x4d, 0xbf, 0x33, + 0xe1, 0x77, 0xa1, 0xbc, 0x02, 0xfb, 0xf6, 0x7b, 0x8f, 0xf2, 0xe2, 0x01, + 0x5f, 0xe1, 0xc0, 0x66, 0xd4, 0x79, 0x71, 0x00, 0x86, 0x6d, 0x6f, 0x6a, + 0x1a, 0x5c, 0x40, 0x2a, 0x09, 0xfd, 0xe9, 0x46, 0xff, 0x01, 0xe5, 0x28, + 0x11, 0x8b, 0x88, 0x05, 0x7c, 0x65, 0x2e, 0x2e, 0x20, 0x15, 0xfc, 0xf3, + 0x4b, 0x3e, 0x92, 0xe2, 0x01, 0x56, 0x23, 0x37, 0xa4, 0x5f, 0xa0, 0x80, + 0xba, 0xff, 0xbb, 0x1c, 0x9f, 0xc0, 0x6b, 0xf5, 0xc4, 0x02, 0xb1, 0xae, + 0x20, 0x15, 0xcf, 0xb0, 0xcf, 0x9f, 0xa9, 0x57, 0x6b, 0xf5, 0xc4, 0x02, + 0xbf, 0x3f, 0xb8, 0x7f, 0x2e, 0x20, 0x15, 0xfc, 0x64, 0x09, 0x67, 0x17, + 0x10, 0x0a, 0xa1, 0x12, 0x64, 0x4b, 0xe3, 0x5a, 0x86, 0x54, 0x10, 0xe1, + 0x6f, 0x90, 0xdc, 0x33, 0xf9, 0x87, 0xf5, 0x09, 0x1e, 0x96, 0xb9, 0x77, + 0xe5, 0x24, 0x99, 0xc9, 0x70, 0xbe, 0x94, 0x31, 0xb9, 0x0a, 0x41, 0x21, + 0x83, 0x7b, 0xc6, 0xd2, 0xe3, 0x09, 0x5e, 0x77, 0x0a, 0xa2, 0x01, 0x4f, + 0x4c, 0x57, 0xe8, 0x75, 0xdf, 0x0a, 0xda, 0xa3, 0x62, 0xcb, 0xb7, 0xec, + 0xb2, 0xfe, 0xda, 0x35, 0xd7, 0xdd, 0x59, 0x6e, 0x2c, 0xbe, 0x28, 0x1f, + 0x56, 0x57, 0x4d, 0x96, 0xf1, 0x1a, 0x84, 0x50, 0x60, 0xd1, 0xb1, 0xdf, + 0xfd, 0x22, 0xc0, 0xf4, 0xff, 0xfc, 0x13, 0x2c, 0xbf, 0x7b, 0x06, 0xfd, + 0x59, 0x77, 0xf0, 0x92, 0xc2, 0xa4, 0xbd, 0xd8, 0xd9, 0x65, 0xcd, 0x34, + 0x92, 0x8c, 0xf7, 0xf7, 0x45, 0xe6, 0x12, 0x68, 0x76, 0xdc, 0x49, 0x3c, + 0xf0, 0x2c, 0xcc, 0x47, 0x51, 0xc3, 0x1a, 0xfe, 0xf7, 0x31, 0xae, 0x9a, + 0xcb, 0x79, 0x65, 0x8f, 0xc6, 0xfc, 0x05, 0xd7, 0xff, 0xef, 0xa5, 0xc2, + 0xfa, 0x05, 0xe4, 0x7d, 0x23, 0x62, 0xcb, 0xff, 0xde, 0xe6, 0x0a, 0x7a, + 0x13, 0xff, 0xe3, 0xe5, 0x94, 0xd9, 0x6c, 0x63, 0xa0, 0x5f, 0x68, 0xc7, + 0xa4, 0x40, 0x38, 0x67, 0x86, 0x97, 0x70, 0x6a, 0x1a, 0x86, 0x5b, 0x96, + 0xff, 0x19, 0x8f, 0x9a, 0xc0, 0x4c, 0x22, 0xcd, 0xff, 0x64, 0x8c, 0x6e, + 0x1e, 0x49, 0x65, 0xff, 0x30, 0xc8, 0x27, 0xa3, 0xfd, 0x65, 0x04, 0xfc, + 0x3a, 0x71, 0x78, 0x3d, 0x25, 0x97, 0xff, 0x7b, 0x73, 0x26, 0x93, 0xeb, + 0x61, 0xc2, 0xca, 0x61, 0xf2, 0x90, 0xe5, 0xc5, 0xfa, 0xcb, 0xa3, 0x8b, + 0x2f, 0x78, 0x4d, 0xe6, 0x6b, 0x77, 0x8b, 0xdf, 0xec, 0xfb, 0xde, 0x79, + 0x71, 0x65, 0xe9, 0x36, 0xe4, 0xb2, 0xef, 0xa4, 0xb8, 0xc0, 0x17, 0xff, + 0xb1, 0xa8, 0xf6, 0x4d, 0x23, 0xf7, 0x1d, 0x65, 0x7c, 0x89, 0x02, 0x21, + 0xe1, 0x2d, 0xff, 0xfa, 0x33, 0xbc, 0x27, 0xf0, 0x3c, 0x3e, 0x98, 0xab, + 0x2a, 0x15, 0x2a, 0xe4, 0x21, 0xcd, 0x3b, 0x46, 0xef, 0x0c, 0x42, 0x30, + 0xbf, 0xff, 0x11, 0x03, 0xec, 0xfb, 0xc3, 0xd3, 0xfd, 0x9b, 0x2c, 0xbf, + 0x67, 0xb5, 0x1c, 0x59, 0x46, 0x7f, 0xe4, 0xb1, 0x7e, 0x9a, 0x51, 0xad, + 0x96, 0x5f, 0x40, 0xb0, 0xc5, 0x95, 0x23, 0xec, 0xd1, 0x03, 0x0a, 0xaf, + 0xfd, 0x2e, 0x4e, 0x2c, 0x64, 0x68, 0x55, 0x97, 0xe9, 0xd3, 0xb3, 0xae, + 0xb2, 0xfe, 0x94, 0x6b, 0xf1, 0x18, 0xb2, 0xff, 0xed, 0xe5, 0x9c, 0xf6, + 0x14, 0xb3, 0x8b, 0x2f, 0x99, 0x00, 0xf2, 0xca, 0xc3, 0xe6, 0x74, 0x4b, + 0xf3, 0xfb, 0xcf, 0xa5, 0x97, 0xbc, 0xe4, 0xb2, 0xcf, 0x88, 0xf8, 0x28, + 0x4b, 0x70, 0x81, 0xbc, 0x9e, 0xa7, 0x26, 0xd7, 0xd8, 0xc8, 0xef, 0xfa, + 0x37, 0x47, 0xd8, 0xd9, 0xc9, 0x65, 0xff, 0x40, 0x61, 0x86, 0xcf, 0xcd, + 0x65, 0x69, 0x13, 0xfd, 0x2c, 0x6f, 0x3b, 0xbf, 0x84, 0x6b, 0x47, 0x9d, + 0x49, 0x7e, 0xe7, 0x63, 0x36, 0x59, 0x7f, 0xf7, 0xe4, 0x79, 0xf7, 0xa6, + 0x93, 0xe9, 0x65, 0xf4, 0xdd, 0x79, 0x96, 0x5f, 0x05, 0xf5, 0xb2, 0xcb, + 0xf6, 0x4d, 0x28, 0xf9, 0x65, 0xc7, 0x32, 0xcb, 0xc7, 0x04, 0xb2, 0xfd, + 0x9a, 0x1f, 0x71, 0x65, 0x0c, 0xf0, 0x78, 0x35, 0x5d, 0x3f, 0xae, 0x2c, + 0x5e, 0x28, 0x92, 0x4b, 0xff, 0x17, 0xe6, 0xde, 0xde, 0x09, 0x46, 0xea, + 0xca, 0xc3, 0xe3, 0x71, 0xba, 0x9c, 0x9f, 0xef, 0xc5, 0x1a, 0x46, 0xe9, + 0x21, 0x11, 0xfa, 0x14, 0x6d, 0xf0, 0x85, 0xa8, 0x5d, 0x4d, 0xc2, 0xf3, + 0x94, 0x97, 0xd3, 0x37, 0x94, 0x59, 0x7f, 0x7d, 0xcd, 0x6a, 0x3c, 0xb2, + 0xfe, 0x97, 0x05, 0xd3, 0x85, 0x65, 0xe2, 0xf7, 0x16, 0x5e, 0x23, 0x92, + 0xcb, 0xf7, 0x00, 0x40, 0x0a, 0xcb, 0xfb, 0xd3, 0x4b, 0x3e, 0x92, 0xca, + 0x84, 0x5f, 0x19, 0x7b, 0x8e, 0x00, 0x6c, 0x42, 0x8b, 0xff, 0xba, 0xd4, + 0x6b, 0x98, 0xd3, 0xe8, 0x55, 0x97, 0xc3, 0x1e, 0x31, 0x65, 0xdf, 0xc2, + 0x4b, 0x9a, 0x69, 0x25, 0x19, 0xb0, 0x68, 0x5e, 0xfc, 0x30, 0x3e, 0xa4, + 0x92, 0x79, 0xa1, 0xac, 0x45, 0x68, 0xae, 0x77, 0xff, 0xbd, 0xf0, 0x4f, + 0xbb, 0x91, 0xee, 0x89, 0xc5, 0x97, 0xfa, 0x24, 0x7e, 0x94, 0x79, 0x65, + 0xcd, 0xbe, 0x2c, 0xd1, 0xb2, 0xbf, 0xee, 0xbf, 0xb8, 0x12, 0xcd, 0x96, + 0x5c, 0x13, 0x59, 0x7c, 0x47, 0xf4, 0x96, 0x5f, 0xf1, 0xfd, 0xdc, 0x1e, + 0x9c, 0x2b, 0x2a, 0x0f, 0x6f, 0x44, 0x57, 0xfb, 0x98, 0x7e, 0x14, 0xfa, + 0xb2, 0xff, 0xbb, 0x1a, 0x80, 0x99, 0x05, 0x65, 0xe1, 0x5f, 0x81, 0x47, + 0xe6, 0x9c, 0x7c, 0x42, 0xde, 0x67, 0x58, 0x9c, 0x3f, 0xa3, 0x35, 0xa9, + 0x2b, 0x74, 0xd4, 0x3d, 0x18, 0x46, 0x08, 0x41, 0x35, 0x1d, 0x95, 0xfc, + 0xd0, 0xaf, 0xe2, 0x85, 0x97, 0xc0, 0x66, 0x0d, 0x65, 0x7c, 0x7a, 0x0d, + 0xe5, 0xd7, 0xfe, 0xee, 0x37, 0xb9, 0x0b, 0x9f, 0x79, 0x65, 0xff, 0x60, + 0x7a, 0x63, 0xe8, 0x05, 0x59, 0x7b, 0xd8, 0x15, 0x94, 0xc3, 0xd6, 0xe1, + 0xd5, 0xe9, 0x33, 0xf5, 0x94, 0x2a, 0x36, 0x3f, 0x84, 0xc7, 0x88, 0xaf, + 0xf8, 0x57, 0x9d, 0x0c, 0x23, 0x15, 0x65, 0xff, 0x9f, 0x8c, 0x83, 0xd6, + 0x8d, 0xa5, 0x96, 0xe0, 0xa7, 0xf3, 0xd3, 0xbb, 0xe7, 0x93, 0xe9, 0x65, + 0xff, 0x67, 0xbc, 0x62, 0xfb, 0x02, 0xb2, 0xfe, 0x8f, 0xb9, 0x9f, 0x79, + 0x65, 0xda, 0x85, 0x94, 0x33, 0xc5, 0xf1, 0x7d, 0xfe, 0xf1, 0x84, 0xc7, + 0x1e, 0x59, 0x7e, 0xe4, 0x07, 0x18, 0xb2, 0xa0, 0xf6, 0x78, 0x65, 0x6e, + 0x0d, 0x31, 0xac, 0x7e, 0xd3, 0xdd, 0x7c, 0x9c, 0xd3, 0x0a, 0x7d, 0x19, + 0xdd, 0xff, 0x78, 0xf6, 0x8f, 0xbf, 0xd4, 0x2c, 0xbd, 0xcf, 0x62, 0xcb, + 0xb3, 0x93, 0x8f, 0x5c, 0x43, 0xbb, 0xfd, 0xd0, 0x9f, 0x01, 0x23, 0x59, + 0x7f, 0xf6, 0x78, 0xfe, 0x91, 0x43, 0x65, 0xb8, 0xee, 0x2c, 0xbf, 0xfc, + 0x09, 0x75, 0xcf, 0xc6, 0x5e, 0x07, 0x56, 0x5f, 0xe1, 0x7d, 0xf0, 0x4f, + 0x5c, 0x59, 0x7e, 0xcf, 0x7e, 0xfe, 0x59, 0x50, 0x99, 0x5c, 0x8c, 0xf4, + 0xa2, 0x04, 0x9d, 0xc3, 0x6b, 0xff, 0xf4, 0x75, 0xf0, 0xa3, 0x42, 0x8c, + 0x0f, 0xa9, 0x2c, 0xa9, 0x27, 0xf9, 0xe8, 0xd6, 0xdb, 0xd3, 0x6a, 0x17, + 0xae, 0xb2, 0x15, 0xa7, 0x0f, 0xe7, 0x94, 0x94, 0x09, 0x51, 0x77, 0xdd, + 0x37, 0x92, 0xcb, 0xfd, 0x85, 0x2c, 0xe0, 0x8c, 0x59, 0x7e, 0x67, 0x3f, + 0x77, 0x59, 0x5e, 0x3d, 0xb1, 0x0c, 0xef, 0xf6, 0x14, 0xee, 0xe7, 0xcd, + 0x2c, 0xbf, 0xa3, 0xa7, 0xbf, 0x26, 0x59, 0x5a, 0x3e, 0x5f, 0xcd, 0xaf, + 0xfa, 0x44, 0x0f, 0xe7, 0x05, 0x9f, 0xac, 0xad, 0x93, 0x65, 0x93, 0xe6, + 0x42, 0x23, 0xe2, 0x3b, 0xfe, 0xcf, 0xa5, 0xd6, 0xf6, 0xf8, 0xdd, 0x59, + 0x7f, 0xf3, 0xf7, 0x87, 0x23, 0xf4, 0x7b, 0x8b, 0x2f, 0xf6, 0x7b, 0xa7, + 0xb8, 0xfb, 0x2c, 0xbf, 0xe2, 0x8c, 0xfb, 0xd9, 0xa8, 0x59, 0x7f, 0xe8, + 0xe8, 0x9c, 0x2c, 0xf7, 0x71, 0x65, 0xfd, 0x9b, 0xfb, 0x9f, 0xba, 0xca, + 0x84, 0xe9, 0x31, 0x10, 0xd0, 0xfa, 0x86, 0xe6, 0xdf, 0x9b, 0x91, 0xf5, + 0xf9, 0xf7, 0x8c, 0x70, 0xb2, 0xee, 0x71, 0x65, 0xe6, 0x9a, 0x69, 0x65, + 0xdf, 0xba, 0x49, 0xe6, 0x82, 0xb4, 0x7c, 0x1c, 0x37, 0xbf, 0xf6, 0x70, + 0x9c, 0x59, 0x88, 0xe6, 0x59, 0x7f, 0x7f, 0x12, 0xe8, 0x9c, 0x59, 0x7f, + 0xc7, 0xf8, 0x99, 0xbc, 0x81, 0xc5, 0x97, 0xf1, 0x97, 0xe1, 0x09, 0xac, + 0xbc, 0xff, 0xe2, 0x4a, 0x92, 0x73, 0xec, 0x84, 0x4f, 0x48, 0xbf, 0x3f, + 0x23, 0x0d, 0xe7, 0x9b, 0x85, 0xb7, 0xd0, 0x33, 0x1a, 0xcb, 0xfb, 0x9d, + 0x30, 0xbe, 0x96, 0x5f, 0x87, 0xa3, 0x06, 0xcb, 0x2f, 0xd9, 0xee, 0x3f, + 0xcb, 0x2f, 0xf3, 0x58, 0x59, 0xbc, 0xf4, 0xb2, 0xfe, 0x2c, 0xfb, 0xf1, + 0x24, 0xb2, 0xff, 0xfb, 0x9e, 0xce, 0x88, 0xcc, 0x0c, 0x76, 0x18, 0xb2, + 0xb1, 0x33, 0x29, 0x8b, 0x74, 0x52, 0x45, 0x1e, 0x34, 0x01, 0x85, 0xfb, + 0x33, 0xdd, 0xc5, 0x97, 0x3b, 0x16, 0x5f, 0xf0, 0x39, 0xe8, 0x98, 0x1f, + 0x71, 0x65, 0xfe, 0xcd, 0xf9, 0x3d, 0xa6, 0x9a, 0x49, 0x7e, 0x9a, 0x33, + 0xbc, 0x59, 0x53, 0x91, 0x3c, 0x47, 0x82, 0x1d, 0x5f, 0xe6, 0xdc, 0x00, + 0x3d, 0x3d, 0x2c, 0xbc, 0xc7, 0xf2, 0xca, 0x99, 0x33, 0x9e, 0xc2, 0xd0, + 0x06, 0x5b, 0xcd, 0xe9, 0x65, 0xf7, 0xc1, 0x3d, 0x2c, 0xb7, 0xed, 0xd9, + 0xae, 0xf0, 0x5d, 0xfb, 0x7b, 0xb0, 0xd8, 0xb2, 0xa0, 0xf5, 0x88, 0xb6, + 0xfd, 0x93, 0x4a, 0x24, 0xb2, 0xfe, 0xd8, 0x71, 0x84, 0x35, 0x95, 0x0b, + 0x96, 0xf2, 0x6f, 0x38, 0xd4, 0xfa, 0xae, 0xf1, 0xaf, 0xf2, 0x19, 0x5e, + 0x20, 0x10, 0xa2, 0xf3, 0xfe, 0x6b, 0x2f, 0xf8, 0x64, 0x0e, 0x66, 0xd9, + 0xb2, 0xcb, 0xd1, 0xa2, 0x59, 0x7f, 0xb0, 0x64, 0xfc, 0x31, 0xac, 0xb7, + 0x56, 0x5e, 0x03, 0xec, 0x47, 0x85, 0xc3, 0x1b, 0x1e, 0x91, 0x21, 0xe5, + 0xda, 0x62, 0x61, 0xce, 0x38, 0xdb, 0x86, 0x55, 0xfc, 0x20, 0xca, 0x33, + 0x65, 0x96, 0x25, 0x97, 0xd1, 0xb4, 0x49, 0x65, 0x0c, 0xf8, 0x1c, 0xb8, + 0x84, 0x2f, 0xff, 0x60, 0xdd, 0x99, 0xf4, 0xb3, 0xfc, 0x1a, 0xcb, 0xba, + 0xeb, 0x2e, 0x9b, 0x8b, 0x2f, 0xd9, 0xbc, 0xc8, 0x78, 0x6b, 0x84, 0x16, + 0xbf, 0xa7, 0x7b, 0x39, 0xc8, 0x59, 0x7e, 0xee, 0x7d, 0xe8, 0x59, 0x7e, + 0x6f, 0x7d, 0x84, 0x92, 0xca, 0x9c, 0x99, 0xd4, 0xf7, 0x88, 0x3e, 0xc2, + 0xf0, 0x14, 0x5f, 0x0f, 0x3a, 0xeb, 0x2f, 0xfd, 0x85, 0x2e, 0xe1, 0x14, + 0x34, 0xb2, 0xff, 0xd9, 0xad, 0x3c, 0xa7, 0x6f, 0x8d, 0xd5, 0x95, 0x08, + 0x81, 0x91, 0xe5, 0x69, 0x31, 0x12, 0x4d, 0xf4, 0x28, 0xaf, 0xf6, 0xb9, + 0xdc, 0x23, 0xe2, 0xca, 0x85, 0x5b, 0xe7, 0x29, 0xe1, 0xcd, 0x6f, 0xfb, + 0x07, 0x85, 0x04, 0x08, 0x59, 0x66, 0x96, 0x5f, 0xff, 0x17, 0xf9, 0xf7, + 0xa3, 0xe9, 0x7b, 0xf8, 0x92, 0xca, 0x83, 0xe5, 0x31, 0x2a, 0x87, 0xcf, + 0xda, 0xda, 0x31, 0xa9, 0x4e, 0xaa, 0x0e, 0x79, 0xab, 0x23, 0xd8, 0x16, + 0x35, 0x90, 0xce, 0x5e, 0x7d, 0x0f, 0xa3, 0x8d, 0xba, 0x68, 0x7a, 0xea, + 0xb1, 0xaf, 0x64, 0xb9, 0xfe, 0xcf, 0x4b, 0x3a, 0xbf, 0xf0, 0xed, 0x2a, + 0x53, 0xb7, 0x25, 0xb5, 0x7a, 0x7a, 0xdc, 0x11, 0xc8, 0xef, 0x96, 0xf0, + 0x21, 0xb3, 0x7c, 0x26, 0xaf, 0xfb, 0x34, 0x51, 0xe9, 0x67, 0x56, 0x5f, + 0xfc, 0x41, 0x15, 0xf9, 0x92, 0x82, 0x0a, 0xcb, 0xf7, 0xf8, 0x37, 0x92, + 0xca, 0x33, 0xeb, 0x24, 0x3b, 0xfe, 0xf7, 0x3a, 0x70, 0xc7, 0x1a, 0xcb, + 0xff, 0x74, 0xca, 0x3e, 0xe1, 0xb2, 0x16, 0x5e, 0xe4, 0x69, 0x65, 0xde, + 0xe0, 0x4f, 0x67, 0xe3, 0xda, 0x84, 0x60, 0x02, 0x12, 0x37, 0xf8, 0x25, + 0x92, 0x93, 0xf1, 0x65, 0xfc, 0xed, 0x67, 0xe2, 0x79, 0x65, 0xc3, 0x35, + 0x97, 0xdf, 0x72, 0x3e, 0x59, 0x73, 0xca, 0x71, 0xba, 0x31, 0x6b, 0xfb, + 0x98, 0x33, 0xe6, 0xcb, 0x2f, 0x4a, 0x3f, 0x59, 0x7e, 0x12, 0x69, 0x46, + 0xea, 0x4a, 0x85, 0x5d, 0x59, 0x0a, 0x21, 0x61, 0xc0, 0x64, 0xfa, 0x32, + 0xeb, 0x57, 0x0b, 0x7c, 0x5c, 0x20, 0xed, 0x82, 0xb2, 0xff, 0xe1, 0x48, + 0x0e, 0x26, 0x70, 0xe0, 0x96, 0x5e, 0xdc, 0x31, 0xac, 0xad, 0x1f, 0x13, + 0x10, 0xef, 0x43, 0xe9, 0x65, 0xfc, 0xcf, 0x76, 0x37, 0xc2, 0xcb, 0xec, + 0x20, 0xfe, 0xb2, 0xff, 0xde, 0x03, 0x3b, 0x06, 0x4e, 0x35, 0x97, 0xd2, + 0x93, 0xf9, 0x65, 0x7c, 0x7b, 0xee, 0x7b, 0x7c, 0x2e, 0x9d, 0xa5, 0x96, + 0x11, 0x51, 0x02, 0xad, 0xe5, 0x50, 0x28, 0xaf, 0x1b, 0xd6, 0x87, 0xeb, + 0x11, 0x06, 0x6c, 0x37, 0xf1, 0xb6, 0xc3, 0xd8, 0x69, 0x65, 0xfe, 0xe9, + 0x89, 0x3f, 0xff, 0xe1, 0x25, 0x68, 0xfa, 0xb7, 0x0c, 0xaf, 0x89, 0xbd, + 0xb7, 0xc5, 0x94, 0x67, 0x9c, 0x21, 0x2d, 0xfd, 0xdc, 0x03, 0x6f, 0x38, + 0xb2, 0xff, 0x8b, 0xdc, 0x07, 0xde, 0x36, 0x96, 0x5f, 0xff, 0xb1, 0xa8, + 0x60, 0x1c, 0x7e, 0xf8, 0x26, 0x4d, 0x2c, 0xbf, 0xfb, 0x3e, 0xf0, 0x7a, + 0x63, 0xee, 0x6c, 0xb2, 0xfe, 0x7e, 0x66, 0x10, 0xab, 0x2b, 0x0f, 0xc8, + 0x08, 0xd5, 0x09, 0x92, 0x8c, 0xef, 0xb0, 0xc9, 0xbf, 0xe8, 0xf7, 0x27, + 0x63, 0x0c, 0x6b, 0x2f, 0xfd, 0x38, 0x9c, 0x59, 0xdc, 0xff, 0xf8, 0x59, + 0x7f, 0xfb, 0x60, 0x7f, 0xc9, 0x1f, 0x39, 0x1a, 0x92, 0xcb, 0x18, 0xa8, + 0x92, 0xd2, 0x2d, 0xfe, 0x7e, 0xfd, 0xc8, 0x2f, 0x2c, 0xae, 0x1e, 0xe7, + 0x8a, 0x6f, 0xff, 0xf0, 0xfb, 0x01, 0xe9, 0xcc, 0xef, 0x21, 0x5c, 0x47, + 0xdd, 0x59, 0x7c, 0x59, 0xbf, 0x16, 0x56, 0xc8, 0x87, 0x69, 0x96, 0xff, + 0x74, 0xe6, 0x94, 0x14, 0x96, 0x5f, 0xff, 0xd1, 0xee, 0x08, 0x5e, 0xe8, + 0x1e, 0x5e, 0xe6, 0x34, 0xb2, 0xff, 0xd0, 0xd7, 0x1b, 0x0e, 0x1c, 0xfb, + 0xcb, 0x2a, 0x11, 0xf2, 0x12, 0x5d, 0x19, 0xf9, 0x76, 0xfa, 0x5d, 0xcd, + 0x96, 0x5f, 0xf4, 0x7c, 0xc7, 0xf6, 0x7d, 0xe5, 0x97, 0x3e, 0xcb, 0x2b, + 0xe3, 0xf4, 0x22, 0x36, 0x8e, 0xaf, 0xf3, 0x1f, 0x85, 0x18, 0x2a, 0xcb, + 0xf0, 0x3b, 0xa8, 0x69, 0x65, 0xdb, 0x8e, 0xb2, 0xe8, 0x0e, 0x1f, 0xa7, + 0x8c, 0x84, 0x29, 0xbb, 0x4e, 0xb2, 0xff, 0xed, 0xe7, 0xce, 0x61, 0x05, + 0xcb, 0xf5, 0x97, 0xfb, 0xa6, 0x31, 0xe3, 0x53, 0x2c, 0xbd, 0x1a, 0xff, + 0x0f, 0xe8, 0x28, 0xb5, 0xa4, 0x61, 0xf6, 0x12, 0x17, 0xfe, 0x7f, 0xb9, + 0x9e, 0x36, 0x3c, 0x96, 0x5b, 0xcb, 0x2b, 0xf3, 0xcf, 0x10, 0xfa, 0xff, + 0xf6, 0x67, 0x4c, 0x3d, 0xcf, 0x60, 0xb2, 0x59, 0x7f, 0xff, 0xa6, 0x28, + 0x66, 0xa0, 0x39, 0xac, 0xe9, 0xeb, 0xae, 0xb2, 0xff, 0xf9, 0xf5, 0xfe, + 0xe6, 0x6a, 0x24, 0x7f, 0x7b, 0x16, 0x5f, 0xff, 0xfc, 0x0e, 0x75, 0xe5, + 0xc9, 0x1f, 0x84, 0xd4, 0x76, 0x3d, 0xc7, 0xf9, 0x65, 0xfa, 0x30, 0xbd, + 0xb8, 0xb2, 0xfe, 0x3f, 0xbf, 0xd3, 0x8d, 0x65, 0x98, 0xb2, 0x98, 0x7d, + 0x3d, 0x29, 0x22, 0xfb, 0xb5, 0xba, 0xb2, 0xf4, 0x80, 0x35, 0x97, 0x3f, + 0xd3, 0x8f, 0x96, 0x62, 0xe7, 0x1a, 0xac, 0x54, 0x62, 0x6b, 0xfa, 0x53, + 0xe4, 0x68, 0x57, 0xff, 0xf6, 0x16, 0xdc, 0xe4, 0x7f, 0x9d, 0x3d, 0x3b, + 0x5e, 0x59, 0x7f, 0x0f, 0x08, 0x5d, 0x42, 0xca, 0x93, 0x2a, 0x1c, 0x71, + 0xab, 0x04, 0xd7, 0xe8, 0xca, 0x26, 0x8e, 0x8b, 0x50, 0xb0, 0x64, 0x29, + 0x3b, 0x0f, 0xdf, 0xdd, 0xc8, 0x93, 0xd2, 0x9e, 0x9a, 0x43, 0xdc, 0x5c, + 0xbd, 0xf3, 0x6d, 0xbd, 0x65, 0xff, 0xfe, 0x2c, 0x1f, 0x61, 0xa2, 0xc3, + 0xdb, 0x70, 0x1d, 0x3d, 0x2c, 0xa8, 0x66, 0x0a, 0x9d, 0x2a, 0xa5, 0xe1, + 0xc8, 0x02, 0x5b, 0xe8, 0x09, 0x85, 0x65, 0xf0, 0xf4, 0x6d, 0x2c, 0xb4, + 0x2c, 0xbf, 0xfe, 0x99, 0xde, 0x5c, 0x86, 0x0f, 0xb0, 0x41, 0x59, 0x50, + 0x7b, 0xe6, 0x21, 0x7f, 0xd9, 0x34, 0xa3, 0xec, 0xfb, 0xcb, 0x2d, 0xb6, + 0x1e, 0xd9, 0x10, 0x54, 0x93, 0x25, 0x19, 0x0e, 0xa1, 0xbb, 0x7c, 0x3e, + 0x83, 0x65, 0x97, 0xf3, 0xcb, 0x36, 0x01, 0x2c, 0xbb, 0x06, 0xb2, 0x86, + 0x78, 0x61, 0x2d, 0xbf, 0xf6, 0xb3, 0x76, 0x6e, 0xbb, 0x0f, 0x8b, 0x2d, + 0xb4, 0x23, 0x2f, 0x19, 0xf4, 0x45, 0x73, 0x6f, 0x16, 0x56, 0x1e, 0x7b, + 0x9a, 0xdf, 0xfb, 0x79, 0xfa, 0x51, 0x3b, 0xd0, 0x05, 0x97, 0xed, 0xc0, + 0x77, 0x02, 0xb2, 0xb0, 0xfb, 0x7c, 0x85, 0x7f, 0xb5, 0x1e, 0x3f, 0xe2, + 0x4b, 0x2f, 0xef, 0xb6, 0x79, 0x46, 0xea, 0xcb, 0x8a, 0x4b, 0x2a, 0x0f, + 0x23, 0x63, 0x2a, 0x6c, 0x36, 0x5f, 0xf0, 0xe7, 0x22, 0x21, 0x46, 0xc2, + 0x5e, 0x70, 0x81, 0x64, 0x29, 0x7b, 0x4c, 0xee, 0x78, 0xdc, 0x4a, 0x35, + 0x0e, 0x42, 0x37, 0xc4, 0x20, 0x7b, 0xbf, 0xf3, 0x60, 0x48, 0x60, 0x7a, + 0xff, 0x7e, 0xb2, 0xff, 0x4a, 0x6c, 0x27, 0xee, 0x2c, 0xbe, 0xfa, 0x50, + 0xc5, 0x97, 0xfd, 0x05, 0xb7, 0x31, 0x91, 0xba, 0xb2, 0xe8, 0xea, 0xcb, + 0xf9, 0xe6, 0x1c, 0x16, 0xcb, 0x2b, 0x64, 0x51, 0x0c, 0x8c, 0x8e, 0xf7, + 0x8b, 0x5f, 0x44, 0xc7, 0xd5, 0x97, 0x9b, 0xe1, 0x8b, 0x29, 0xcf, 0x05, + 0xbc, 0x8a, 0xfc, 0x43, 0xec, 0x49, 0x65, 0xf3, 0x7c, 0x10, 0x56, 0x5f, + 0xdd, 0xc1, 0x5e, 0x36, 0x59, 0x7d, 0x13, 0x6a, 0x16, 0x5c, 0xcc, 0x59, + 0x4c, 0x37, 0x1d, 0x22, 0xbe, 0x80, 0x36, 0xcd, 0x65, 0xfb, 0x38, 0x50, + 0xd2, 0xcb, 0xf3, 0xf3, 0xc7, 0x32, 0xcb, 0xfc, 0x7a, 0x8d, 0x9f, 0x41, + 0x59, 0x6f, 0x4e, 0x4e, 0x76, 0x09, 0x30, 0x9c, 0x24, 0x86, 0xcd, 0xa2, + 0x1e, 0x92, 0xf0, 0x9f, 0xc5, 0x17, 0xff, 0xb4, 0x12, 0xcd, 0xe5, 0x91, + 0xa8, 0xe2, 0xcb, 0xfc, 0xf3, 0x77, 0x19, 0x9c, 0x59, 0x58, 0x7f, 0x9b, + 0xd2, 0x6f, 0x6e, 0x47, 0x96, 0x5f, 0x46, 0xf3, 0xde, 0xb2, 0xec, 0x62, + 0xcb, 0x0b, 0x38, 0xdd, 0x99, 0x2d, 0x6c, 0x88, 0x32, 0x5a, 0xbf, 0x0b, + 0xec, 0xc6, 0x2c, 0xbf, 0xf4, 0xa4, 0x61, 0x86, 0x4d, 0xc8, 0x59, 0x58, + 0x88, 0xa3, 0x23, 0x72, 0x8b, 0xff, 0xd3, 0x16, 0x0a, 0x2b, 0xfb, 0x86, + 0x53, 0x2c, 0xbe, 0xee, 0x6c, 0x4b, 0x2f, 0xd8, 0x33, 0xd7, 0x16, 0x5f, + 0x84, 0x91, 0xff, 0xc5, 0x97, 0xed, 0x06, 0x33, 0x65, 0x97, 0xbd, 0xef, + 0x96, 0x5f, 0xfd, 0xf0, 0x4f, 0xb3, 0x9b, 0xf3, 0xa6, 0xc5, 0x95, 0xf9, + 0xf4, 0x78, 0x7a, 0xe0, 0x69, 0x65, 0x62, 0x32, 0xb9, 0x09, 0x0d, 0xc2, + 0x3b, 0x46, 0xc9, 0xa9, 0x30, 0x9d, 0xa8, 0x7a, 0x54, 0x2f, 0x3b, 0xe4, + 0xa1, 0xd3, 0x8c, 0x03, 0xb1, 0x98, 0x39, 0x6f, 0x13, 0x3d, 0x1b, 0xa5, + 0xff, 0x88, 0xc4, 0xfb, 0x37, 0xfd, 0x02, 0x2c, 0xbf, 0xfc, 0x79, 0xa1, + 0xc3, 0x59, 0xd8, 0xfb, 0x8b, 0x2f, 0x84, 0x8d, 0x7e, 0xb2, 0xff, 0xd1, + 0xf7, 0x7b, 0x1b, 0x40, 0x18, 0xb2, 0xe1, 0x24, 0xb2, 0xe7, 0xd2, 0xcb, + 0xff, 0xf0, 0xb9, 0xe3, 0xe7, 0x41, 0x9e, 0xfd, 0xc7, 0x0b, 0x2f, 0xef, + 0x1e, 0xcc, 0x80, 0xac, 0xa1, 0xa2, 0x6b, 0x42, 0xdd, 0x56, 0xbf, 0xfd, + 0xfc, 0xd2, 0x3d, 0x4a, 0x69, 0x1e, 0xa4, 0xb2, 0xf7, 0x8f, 0x65, 0x95, + 0xf1, 0xf5, 0xe9, 0x3a, 0xfc, 0xcc, 0x06, 0xb6, 0x59, 0x7a, 0x06, 0x35, + 0x97, 0x63, 0x7a, 0xcb, 0xef, 0xc4, 0x29, 0x2c, 0xb3, 0x91, 0xbd, 0xf0, + 0xcd, 0xfb, 0x9c, 0xc2, 0xfd, 0x65, 0x7e, 0x79, 0xa4, 0x4b, 0x50, 0x9d, + 0x79, 0xc2, 0x6d, 0xc8, 0xfc, 0x52, 0x08, 0x53, 0x5d, 0xf4, 0xcb, 0x2f, + 0xc2, 0x7b, 0xf6, 0x62, 0xca, 0x61, 0xe1, 0xfe, 0x33, 0x74, 0x71, 0x65, + 0xf4, 0x76, 0x06, 0xb2, 0x82, 0x6d, 0xe6, 0x16, 0xbf, 0xe9, 0x3e, 0xbc, + 0x50, 0xce, 0x2c, 0xbf, 0xd0, 0x38, 0xd0, 0x23, 0xf5, 0x97, 0x33, 0x93, + 0x1f, 0x5b, 0x0e, 0x2f, 0xff, 0xa3, 0x3e, 0xf7, 0x70, 0xe4, 0x62, 0x8b, + 0x8b, 0x2f, 0xc5, 0x0d, 0xe5, 0x0b, 0x2f, 0xff, 0xe7, 0x68, 0x6e, 0xfa, + 0xdb, 0xaf, 0xee, 0x9e, 0xa4, 0xb2, 0xff, 0x9c, 0xb3, 0xde, 0x36, 0xbc, + 0xb2, 0xff, 0xff, 0xe9, 0xa4, 0x65, 0xe8, 0xfd, 0xbf, 0xc6, 0x2e, 0xb2, + 0x3e, 0x91, 0xb1, 0x65, 0x42, 0x2b, 0xc8, 0xe2, 0xa1, 0x55, 0xd6, 0x2d, + 0x1c, 0x23, 0x74, 0x5e, 0xea, 0x04, 0x50, 0x08, 0xc2, 0xe9, 0xb2, 0xcf, + 0x1a, 0x84, 0x69, 0x4f, 0xa5, 0xe3, 0xe0, 0x50, 0xe6, 0x4a, 0xe9, 0x27, + 0xe8, 0x1c, 0x94, 0xc3, 0xe9, 0x69, 0xf7, 0xff, 0x7b, 0xe9, 0x67, 0x8f, + 0x7c, 0x10, 0x56, 0x5f, 0xd0, 0x0f, 0x8f, 0xe6, 0xf5, 0x97, 0xec, 0x6b, + 0x3e, 0xf2, 0xca, 0x9c, 0x7b, 0x66, 0x65, 0x7f, 0xbe, 0x96, 0x0f, 0xb9, + 0xb2, 0xca, 0xf9, 0x1f, 0x3a, 0x85, 0x09, 0x11, 0xdf, 0xdb, 0x46, 0xbe, + 0x97, 0x16, 0x5e, 0xd6, 0x71, 0x65, 0xf8, 0xcb, 0x7e, 0x49, 0x65, 0xec, + 0x3d, 0x96, 0x50, 0xa7, 0xc0, 0xc1, 0xce, 0x94, 0x5f, 0xd1, 0xb6, 0x7b, + 0x18, 0xb2, 0xff, 0xec, 0x20, 0x07, 0xb8, 0xc9, 0x9c, 0x2b, 0x28, 0xd1, + 0x43, 0xa3, 0x0e, 0x16, 0xdf, 0x30, 0xe0, 0x6b, 0x2f, 0xf1, 0x0b, 0xd8, + 0x63, 0x09, 0x65, 0xfd, 0xba, 0x70, 0xde, 0x0f, 0x2c, 0xbf, 0x44, 0xd9, + 0x81, 0x59, 0x50, 0x8a, 0xec, 0x21, 0x33, 0x3e, 0x99, 0xdf, 0x13, 0x1f, + 0xcb, 0x2f, 0x11, 0xc9, 0x65, 0xff, 0xbb, 0x93, 0x1c, 0xc0, 0x6f, 0x07, + 0x16, 0x5e, 0x3d, 0x0a, 0xb2, 0xfb, 0xc7, 0x1f, 0x2c, 0xa3, 0x44, 0x19, + 0x22, 0x70, 0x76, 0xff, 0xa2, 0x68, 0xf7, 0x73, 0x41, 0x59, 0x7b, 0xb1, + 0x32, 0xcb, 0x47, 0xc7, 0xac, 0xde, 0x73, 0x52, 0x45, 0x7f, 0x21, 0x09, + 0x78, 0x8c, 0xd6, 0x5f, 0xfc, 0x09, 0x8f, 0xb1, 0xf4, 0xa2, 0x68, 0x59, + 0x7e, 0x1b, 0x94, 0x75, 0x65, 0xfd, 0x28, 0xfb, 0xd9, 0xd5, 0x97, 0xff, + 0xbd, 0xc3, 0xfe, 0x25, 0xcc, 0xcf, 0xbc, 0xb2, 0xa6, 0x3f, 0x9e, 0x17, + 0x57, 0x51, 0x84, 0xd4, 0x27, 0xef, 0xf7, 0x5e, 0x6c, 0x36, 0xf1, 0xac, + 0xa3, 0x3d, 0xfe, 0x14, 0xdf, 0xee, 0x1f, 0x4e, 0x63, 0xd9, 0x65, 0xff, + 0xf0, 0x35, 0xa8, 0x2c, 0x14, 0xfb, 0xdc, 0x11, 0x65, 0x62, 0x21, 0x34, + 0x69, 0x7a, 0x6d, 0x42, 0xcb, 0xf3, 0x98, 0xe0, 0x96, 0x5d, 0x00, 0x59, + 0x50, 0x7b, 0x04, 0x3b, 0xc2, 0x5b, 0xed, 0xa1, 0xbe, 0x16, 0x5f, 0x77, + 0xf7, 0xf2, 0xcb, 0x75, 0x65, 0xb7, 0xb9, 0xb4, 0x01, 0x1d, 0xff, 0xc6, + 0xc3, 0xe7, 0x60, 0xf4, 0x0d, 0xd5, 0x95, 0x08, 0xc7, 0x35, 0x97, 0x28, + 0xbf, 0x8b, 0x87, 0xbe, 0x06, 0xb2, 0xff, 0xbf, 0x32, 0xf4, 0x70, 0x1d, + 0x59, 0x78, 0x8c, 0x55, 0x97, 0xe7, 0xd6, 0xa3, 0x65, 0x97, 0xf7, 0x8f, + 0x47, 0xe0, 0x2c, 0xa9, 0xc8, 0xaa, 0x61, 0xcf, 0x87, 0x04, 0x28, 0xbd, + 0xc7, 0xfd, 0x65, 0x41, 0xee, 0xf9, 0x02, 0xfe, 0x00, 0x9d, 0xcf, 0xb8, + 0xb2, 0xff, 0xff, 0xfd, 0xa8, 0xf1, 0x38, 0x4f, 0x93, 0x1e, 0x83, 0x1c, + 0xf4, 0x7d, 0x02, 0x67, 0x16, 0x5f, 0xee, 0xe7, 0xd1, 0xa3, 0x62, 0xcb, + 0xff, 0xff, 0xfe, 0xe6, 0x7b, 0xae, 0xce, 0x6b, 0x47, 0xf7, 0x9d, 0xc5, + 0xcc, 0x98, 0x1e, 0x86, 0xbe, 0x85, 0x97, 0xe0, 0x4d, 0x9b, 0x98, 0xb2, + 0xb8, 0x8c, 0x2f, 0x42, 0x5e, 0xff, 0xbe, 0xe1, 0x1b, 0x3d, 0x9b, 0xab, + 0x2e, 0xcd, 0x2c, 0xa8, 0x3d, 0x2e, 0x9e, 0x5f, 0xde, 0x27, 0xff, 0x09, + 0x65, 0xf8, 0x9f, 0xfc, 0x25, 0x95, 0x38, 0xf4, 0xbc, 0x59, 0x50, 0xaa, + 0x24, 0x70, 0x83, 0x78, 0x7a, 0xf9, 0xe8, 0x0e, 0x77, 0xfe, 0xf1, 0xf0, + 0x9f, 0xd3, 0x38, 0xd6, 0x5f, 0x7e, 0xff, 0x71, 0x65, 0xcd, 0x34, 0xb2, + 0xb8, 0x6f, 0x5a, 0x24, 0xbe, 0xeb, 0xe7, 0x52, 0x4f, 0x34, 0x55, 0x88, + 0xd0, 0x38, 0x4e, 0xdf, 0x84, 0xc6, 0x1e, 0x96, 0x5c, 0xc7, 0x59, 0x7f, + 0xbd, 0x04, 0x16, 0xe7, 0xf6, 0x2c, 0xae, 0x9e, 0x78, 0x05, 0xaf, 0x76, + 0x3f, 0x59, 0x7f, 0xe0, 0x0f, 0xa7, 0xa3, 0xfa, 0x68, 0x59, 0x73, 0x77, + 0xbd, 0x65, 0x62, 0x62, 0x86, 0xee, 0xe4, 0x44, 0x3b, 0xe4, 0x0b, 0xdd, + 0x9d, 0xba, 0xb2, 0xf1, 0x04, 0xd6, 0x5f, 0xbb, 0x05, 0x9b, 0x2c, 0xa8, + 0x3e, 0x43, 0x22, 0x71, 0xbb, 0xfd, 0xd8, 0xf0, 0x18, 0x0f, 0x2c, 0xa8, + 0x67, 0xa6, 0x6c, 0x6b, 0x28, 0xcc, 0x47, 0x0d, 0xdc, 0x3a, 0x14, 0x87, + 0xe8, 0xd3, 0x4c, 0xa3, 0x74, 0x6a, 0x68, 0xd9, 0xf5, 0x0a, 0x56, 0x3d, + 0x76, 0x1e, 0x8e, 0x5b, 0xfc, 0x66, 0xad, 0xb2, 0x12, 0x95, 0x73, 0xc8, + 0xc9, 0x3d, 0x19, 0xd6, 0xf8, 0x55, 0xb7, 0x96, 0x5f, 0xe0, 0xf4, 0xfd, + 0xc7, 0xf9, 0x65, 0xec, 0xd6, 0xf5, 0x97, 0xc7, 0xa1, 0x26, 0x59, 0x7f, + 0xe2, 0xfd, 0x8f, 0x22, 0x8f, 0x71, 0x65, 0xd9, 0x8b, 0x2f, 0x83, 0xd3, + 0x11, 0x65, 0x0a, 0x8e, 0xc3, 0x34, 0xe8, 0xf3, 0x92, 0x36, 0xcf, 0x84, + 0x15, 0xbf, 0x4d, 0x13, 0x76, 0x16, 0x5f, 0xfe, 0x2f, 0x70, 0x4f, 0x19, + 0x02, 0x59, 0xc5, 0x97, 0x09, 0x0b, 0x2f, 0x34, 0xd3, 0x49, 0x2f, 0xa5, + 0xec, 0x0a, 0x49, 0xe6, 0x82, 0xfd, 0x83, 0x3f, 0xf8, 0xbb, 0xbf, 0x95, + 0xa3, 0xe9, 0x23, 0x4b, 0xd1, 0xc9, 0x2c, 0xa8, 0x4d, 0x43, 0x0a, 0x74, + 0x94, 0xf0, 0xa0, 0xfc, 0x86, 0xf9, 0x83, 0xc2, 0x59, 0x77, 0xb8, 0xb2, + 0xff, 0x7b, 0xb1, 0xee, 0x74, 0xd6, 0x5c, 0xf2, 0x59, 0x7e, 0x9d, 0x93, + 0x1e, 0xcb, 0x2a, 0x71, 0xfa, 0x30, 0xcf, 0x82, 0xd6, 0xe2, 0xcb, 0xfd, + 0xef, 0xa5, 0xd8, 0x2d, 0x92, 0x5f, 0xfb, 0x3e, 0x91, 0xe1, 0x16, 0x0d, + 0x65, 0xfb, 0x66, 0x03, 0xef, 0x2c, 0xa8, 0x4d, 0xa7, 0xe8, 0x45, 0xe8, + 0xc4, 0x84, 0x78, 0x6b, 0xe3, 0xcb, 0x1a, 0xcb, 0xe7, 0x11, 0xc6, 0xb2, + 0xef, 0xa4, 0xe6, 0xc8, 0x02, 0x17, 0xfc, 0x50, 0xd7, 0x0c, 0xbe, 0x92, + 0xcb, 0xff, 0xff, 0x73, 0xf3, 0xd0, 0xf0, 0xba, 0x61, 0xe9, 0xf8, 0x58, + 0x29, 0x2c, 0xba, 0x02, 0xb2, 0x89, 0x17, 0x7e, 0x39, 0xde, 0xd9, 0x78, + 0x48, 0xdd, 0x59, 0x78, 0x5e, 0x9a, 0xca, 0xd8, 0xde, 0x99, 0x05, 0xf8, + 0xa1, 0xac, 0x25, 0x97, 0xfd, 0xdf, 0xa0, 0x59, 0xa5, 0x1b, 0xab, 0x2d, + 0xc1, 0x9f, 0x2e, 0x13, 0x56, 0x91, 0x5b, 0xe8, 0x43, 0x5b, 0x65, 0x95, + 0x0a, 0xb2, 0xf2, 0x11, 0xc7, 0x0e, 0x87, 0x8c, 0x6c, 0x05, 0x17, 0xff, + 0xc5, 0x2f, 0x03, 0xba, 0x86, 0xa4, 0x7f, 0xe2, 0xcb, 0xff, 0xf7, 0x9f, + 0x58, 0x7f, 0xf3, 0x3a, 0x7a, 0xeb, 0xac, 0xbf, 0x7d, 0xc9, 0xb3, 0xcb, + 0x2b, 0x11, 0x9f, 0xf2, 0x89, 0x2a, 0x5f, 0xc7, 0xe2, 0x7f, 0xf8, 0xb2, + 0xff, 0xf7, 0xa6, 0xcd, 0x63, 0xb2, 0x3a, 0x63, 0x59, 0x7f, 0x01, 0x99, + 0xdf, 0x9d, 0x65, 0x0a, 0x8a, 0x42, 0x2d, 0xe2, 0x4d, 0xff, 0xe3, 0x19, + 0x3f, 0xc5, 0x9e, 0xc3, 0xfd, 0x65, 0xf6, 0xdb, 0x3e, 0xea, 0xcb, 0xe0, + 0x8c, 0x1b, 0x2c, 0xbd, 0x2e, 0x01, 0x65, 0xd1, 0xec, 0x3c, 0x1e, 0x92, + 0x5f, 0xba, 0xfa, 0xcd, 0x2c, 0xb8, 0x0e, 0xb2, 0x82, 0x6f, 0x48, 0x9e, + 0xfa, 0x5e, 0x00, 0xd6, 0x5f, 0xa0, 0xe4, 0xfc, 0x59, 0x5f, 0x1e, 0x4e, + 0x88, 0xef, 0xfd, 0xf7, 0x0c, 0x5c, 0xf1, 0xeb, 0x16, 0x56, 0xc8, 0xcb, + 0x26, 0x9f, 0x11, 0xdf, 0xf6, 0xb3, 0x85, 0x9b, 0xfa, 0x6b, 0x2f, 0xf0, + 0xcb, 0x37, 0x9e, 0x9d, 0x65, 0x42, 0x27, 0x0c, 0xc0, 0x07, 0x37, 0xed, + 0xb7, 0x4f, 0x3e, 0x59, 0x7e, 0x3e, 0x46, 0xcc, 0x5d, 0x9f, 0xab, 0xf4, + 0x3e, 0xbf, 0x02, 0xec, 0xfd, 0x5c, 0xf2, 0x5d, 0x9f, 0xab, 0xe0, 0x4b, + 0x38, 0xbb, 0x3f, 0x54, 0x33, 0xd2, 0x22, 0x3b, 0xf4, 0x67, 0x30, 0x97, + 0x67, 0xea, 0x97, 0x67, 0xea, 0xe7, 0xf2, 0xec, 0xfd, 0x30, 0xb8, 0xb4, + 0x88, 0xff, 0x00, 0x95, 0x7d, 0x9b, 0x87, 0xfa, 0xec, 0xfd, 0x52, 0xec, + 0xfd, 0x5d, 0xfc, 0x2e, 0xcf, 0xd5, 0xff, 0x67, 0xef, 0xac, 0xdf, 0x83, + 0x5d, 0x9f, 0xab, 0xfb, 0x3a, 0x7c, 0x06, 0xcb, 0xb3, 0xf5, 0x5f, 0xa2, + 0x98, 0x89, 0x38, 0x8f, 0x7d, 0xad, 0xa3, 0xcb, 0xb3, 0xf5, 0x4b, 0xb3, + 0xf5, 0x86, 0xc2, 0xe6, 0x9a, 0x5d, 0x9f, 0xaa, 0x92, 0xb1, 0xd1, 0x9a, + 0xe4, 0x21, 0xfe, 0x84, 0xee, 0x89, 0xd8, 0x65, 0xc8, 0x5f, 0x79, 0x81, + 0xa2, 0x7b, 0xa0, 0x54, 0xd9, 0xfa, 0x4f, 0x44, 0x85, 0xff, 0x6d, 0x1b, + 0xf0, 0xf5, 0x9b, 0x2c, 0xa9, 0x1f, 0xa6, 0x8e, 0x6f, 0xe8, 0xc1, 0x22, + 0x52, 0x59, 0x7f, 0xb9, 0x92, 0x94, 0x7b, 0xe5, 0x95, 0x88, 0x83, 0x22, + 0x2e, 0x16, 0xdf, 0xfb, 0x02, 0x3c, 0xd3, 0x4f, 0xd9, 0x96, 0x5f, 0xfd, + 0xc2, 0xc9, 0xa3, 0x6f, 0xdf, 0xee, 0x2c, 0xba, 0x5b, 0x24, 0xbe, 0x99, + 0xdf, 0x4b, 0x2b, 0x64, 0x77, 0xfc, 0x5d, 0xd4, 0x02, 0x47, 0x6f, 0x18, + 0xb8, 0xf6, 0x59, 0x5a, 0x5e, 0x24, 0x79, 0xdb, 0xff, 0x27, 0x5f, 0xe6, + 0x70, 0xb3, 0xd9, 0xfa, 0xcb, 0xfe, 0x98, 0xb3, 0x7f, 0x7e, 0x7d, 0xd5, + 0x97, 0xf7, 0xb3, 0xb1, 0xaf, 0xd6, 0x5f, 0xf6, 0x8d, 0x9c, 0x12, 0x32, + 0x65, 0x97, 0xfc, 0x18, 0xfc, 0x60, 0x7d, 0x49, 0x65, 0xff, 0x9d, 0xf6, + 0xc6, 0x39, 0x7d, 0x25, 0x97, 0x9c, 0x5e, 0x61, 0xfc, 0x4c, 0x75, 0x66, + 0xa7, 0x26, 0x29, 0xa2, 0xe2, 0x85, 0x95, 0x42, 0x78, 0x98, 0x66, 0xf1, + 0xa9, 0xdf, 0x18, 0xa6, 0xd2, 0xcb, 0xef, 0x77, 0x36, 0x59, 0x4c, 0x3c, + 0x62, 0x23, 0xb8, 0x6d, 0x2c, 0xa8, 0x37, 0x38, 0x43, 0x79, 0x9f, 0xe9, + 0x65, 0xff, 0xef, 0xbd, 0xd3, 0x10, 0x79, 0x85, 0xc3, 0x59, 0x7f, 0xfe, + 0x96, 0xa3, 0x7b, 0xcd, 0x03, 0xec, 0x31, 0xe6, 0x59, 0x7f, 0x9b, 0xdf, + 0x87, 0xc9, 0xb1, 0x65, 0x4e, 0x47, 0xb6, 0x0f, 0x7c, 0x95, 0xa5, 0x8b, + 0xfe, 0x8f, 0xa3, 0x39, 0xc6, 0x7c, 0xb2, 0xf1, 0x94, 0x96, 0x54, 0x36, + 0x7f, 0x3b, 0x27, 0x4a, 0x71, 0x57, 0x23, 0x27, 0x38, 0x69, 0xee, 0x98, + 0x4c, 0x91, 0xa6, 0x8e, 0xc7, 0xa0, 0xf3, 0xca, 0x45, 0x1f, 0xf7, 0x21, + 0x66, 0x08, 0xc5, 0x5a, 0x3f, 0x6f, 0x3a, 0xbf, 0xff, 0xe3, 0xeb, 0xf6, + 0x25, 0x3f, 0x3f, 0x89, 0x70, 0x7d, 0x8d, 0x2c, 0xbf, 0xf0, 0xb1, 0xf1, + 0x47, 0x7a, 0x00, 0xac, 0xbf, 0xfb, 0x51, 0x85, 0x92, 0x3e, 0xe6, 0xf5, + 0x97, 0xff, 0xc4, 0xe2, 0xf3, 0x37, 0xc7, 0xde, 0xe0, 0x18, 0xb2, 0x86, + 0x89, 0x62, 0x43, 0xbf, 0xc5, 0x1e, 0xfa, 0x67, 0x62, 0xcb, 0xb7, 0xe2, + 0xca, 0x61, 0xe6, 0x11, 0xa5, 0xfc, 0x4e, 0x2f, 0x5e, 0x4b, 0x2e, 0x7d, + 0x2c, 0xbf, 0x07, 0x19, 0x1c, 0x59, 0x79, 0xa6, 0x9a, 0x49, 0x78, 0x48, + 0xfd, 0x24, 0xf3, 0x41, 0x7f, 0xcf, 0x21, 0x35, 0x9b, 0xdf, 0x4b, 0x2f, + 0xff, 0xdd, 0xc9, 0x08, 0x45, 0x9b, 0x4d, 0x28, 0xd6, 0xcb, 0x28, 0x91, + 0x27, 0xe3, 0xbb, 0xfc, 0x52, 0x36, 0x67, 0xde, 0x59, 0x7d, 0xf0, 0x4c, + 0x96, 0x5e, 0xfe, 0x24, 0xe7, 0xab, 0xe3, 0x3b, 0xfe, 0xf3, 0x96, 0x73, + 0x51, 0xc5, 0x97, 0xd2, 0x8f, 0xfe, 0x59, 0x7f, 0x7f, 0x05, 0x9f, 0x79, + 0x65, 0xcf, 0xfc, 0xe3, 0xd2, 0x10, 0x92, 0xff, 0xf0, 0x85, 0x30, 0xae, + 0x3e, 0xe0, 0x73, 0x4b, 0x28, 0xd3, 0x39, 0x73, 0x32, 0x84, 0x4f, 0x0c, + 0x6f, 0x6f, 0x8d, 0x2c, 0xa9, 0x2e, 0x94, 0x0d, 0xa3, 0x21, 0xac, 0x6d, + 0xcc, 0x21, 0xe9, 0x6b, 0x8b, 0x7e, 0x8e, 0x50, 0xc3, 0xf4, 0x76, 0x1b, + 0xd0, 0x2e, 0x3d, 0x96, 0x5f, 0xe2, 0x08, 0xcf, 0x7c, 0x0d, 0x65, 0x0c, + 0xf2, 0xc0, 0x2f, 0x6f, 0xd6, 0x5f, 0xf6, 0x46, 0xec, 0xee, 0xbe, 0x69, + 0x65, 0xe6, 0x1c, 0xcb, 0x2f, 0xd9, 0xff, 0x22, 0x4b, 0x2f, 0xc6, 0xc1, + 0x8f, 0x16, 0x5b, 0xf2, 0x3c, 0xfd, 0xc2, 0x8b, 0xfe, 0xf7, 0x73, 0x93, + 0xbc, 0x7b, 0x2c, 0xa8, 0x3e, 0x73, 0x2b, 0xbf, 0xe2, 0x30, 0x36, 0xf9, + 0xb9, 0x1e, 0x59, 0x79, 0xf5, 0xfa, 0xca, 0x92, 0x73, 0xb3, 0x09, 0x30, + 0xf3, 0xb0, 0xd3, 0x22, 0x0d, 0xc3, 0xfb, 0xec, 0xf0, 0x9b, 0x2c, 0xbc, + 0xd3, 0x4d, 0x26, 0x21, 0x02, 0xf8, 0x2e, 0xe1, 0x4c, 0x42, 0x04, 0xf3, + 0x5d, 0x7c, 0xfa, 0xc6, 0x96, 0x56, 0x8f, 0x8f, 0x7a, 0x0d, 0xe6, 0x9a, + 0x69, 0x31, 0x07, 0x94, 0x98, 0x83, 0xc9, 0xe6, 0xba, 0xfe, 0xf3, 0xb1, + 0x90, 0xc5, 0x97, 0xf6, 0x7b, 0xa0, 0x79, 0x2c, 0xbc, 0xd3, 0x4d, 0x2c, + 0xbd, 0xc8, 0x15, 0x24, 0xf3, 0x41, 0x58, 0x99, 0x30, 0x54, 0xbe, 0x2b, + 0x22, 0xdf, 0x26, 0xd6, 0xea, 0xa2, 0x56, 0x47, 0xb7, 0x79, 0xa8, 0x25, + 0x97, 0xff, 0x76, 0x24, 0x7e, 0xce, 0x86, 0x18, 0xb2, 0xa1, 0x11, 0xae, + 0x5d, 0xbc, 0x72, 0xff, 0xdd, 0x31, 0xc1, 0x7b, 0x3e, 0xf2, 0xcb, 0xfc, + 0x50, 0xce, 0x70, 0x04, 0xb2, 0x82, 0x7e, 0x1c, 0x3e, 0xbf, 0xfd, 0x9d, + 0x3d, 0x75, 0xf3, 0x86, 0xfb, 0x2c, 0xbf, 0xf6, 0xcc, 0xc6, 0x61, 0x7b, + 0x02, 0xb2, 0xfa, 0x3d, 0x0c, 0x59, 0x5f, 0x23, 0x25, 0x84, 0x44, 0x91, + 0xe3, 0xeb, 0xfe, 0xec, 0x10, 0x7e, 0xe3, 0xee, 0xac, 0xbf, 0x48, 0x81, + 0xb1, 0x2c, 0xbf, 0x87, 0xcc, 0x64, 0x6e, 0xac, 0xbc, 0x07, 0x11, 0x65, + 0xdb, 0x7c, 0xb2, 0xce, 0x33, 0x6d, 0xf8, 0xed, 0x49, 0x1e, 0x3f, 0x1e, + 0x39, 0x43, 0x4c, 0xd7, 0xc4, 0x70, 0x2a, 0xcb, 0xc2, 0x47, 0xeb, 0x2b, + 0x63, 0x7e, 0xc2, 0x1b, 0xf0, 0x63, 0xb0, 0xc4, 0x97, 0xe2, 0x72, 0x2c, + 0x49, 0x76, 0x05, 0x25, 0xcd, 0x34, 0x92, 0xb0, 0xfe, 0xb8, 0x4f, 0xe2, + 0x46, 0x85, 0xaf, 0xf1, 0x09, 0x1f, 0xf7, 0x1b, 0xd2, 0x4f, 0x37, 0x97, + 0xff, 0xb6, 0x1e, 0x9c, 0x25, 0x9b, 0xf4, 0x7c, 0x59, 0x50, 0xac, 0x63, + 0x23, 0x2e, 0x37, 0xd7, 0x86, 0xc0, 0x12, 0x6f, 0xfe, 0x8f, 0xf9, 0x98, + 0x37, 0x27, 0x15, 0x65, 0xff, 0x17, 0xfd, 0x7f, 0x78, 0xff, 0x59, 0x7f, + 0xfe, 0xe9, 0xef, 0x32, 0x1f, 0x23, 0x47, 0x9f, 0x71, 0x65, 0xfc, 0x51, + 0x9a, 0x7f, 0xd6, 0x5f, 0xfa, 0x35, 0xd8, 0x3e, 0xc1, 0x1a, 0xcb, 0xa5, + 0xcc, 0x47, 0xb8, 0x4e, 0xbc, 0xac, 0xd1, 0x65, 0xfe, 0x82, 0xc6, 0x1f, + 0xd2, 0x59, 0x7f, 0xfd, 0xc2, 0xcf, 0xbf, 0x7e, 0x3e, 0x8f, 0xef, 0xd6, + 0x57, 0xc8, 0xcd, 0xf2, 0x4b, 0x46, 0x55, 0xd5, 0x47, 0x2f, 0x28, 0x1e, + 0xf6, 0xf1, 0x18, 0xb2, 0xfe, 0xe0, 0x83, 0x01, 0x49, 0x65, 0xfc, 0x61, + 0x1e, 0x3f, 0xeb, 0x2f, 0xff, 0xde, 0xe7, 0xd3, 0x87, 0x83, 0x87, 0xd6, + 0x17, 0xeb, 0x2f, 0xff, 0xfd, 0x3b, 0xd2, 0xcf, 0xf7, 0x32, 0x70, 0xf0, + 0x70, 0xfa, 0xc2, 0xfd, 0x08, 0x5f, 0xfd, 0x9e, 0x9c, 0x1e, 0x9f, 0x7a, + 0x7f, 0xaa, 0x10, 0xb5, 0x49, 0x19, 0x7c, 0x77, 0xbd, 0x1b, 0x4f, 0xe2, + 0x68, 0xde, 0x8c, 0x8e, 0xfc, 0xce, 0x34, 0xff, 0x2c, 0xb7, 0x06, 0x7d, + 0x02, 0x1f, 0x5f, 0xd9, 0x34, 0x8f, 0x5c, 0x59, 0x7f, 0x47, 0xc2, 0x72, + 0x31, 0x65, 0xfc, 0xfa, 0xd3, 0xff, 0x0b, 0x2a, 0x19, 0xfb, 0x43, 0x87, + 0xae, 0x47, 0x7e, 0x72, 0xc4, 0xb5, 0x39, 0x02, 0xf2, 0xa3, 0x3f, 0x2b, + 0x6d, 0x90, 0x11, 0x7f, 0x23, 0xdb, 0xf1, 0x48, 0x0b, 0x84, 0x2e, 0xbc, + 0xd3, 0x4d, 0x24, 0xbc, 0xe4, 0x34, 0x93, 0xcd, 0x05, 0xf6, 0x6b, 0x3c, + 0xb2, 0xbf, 0x3c, 0xee, 0x16, 0xdf, 0x74, 0xde, 0x4b, 0x2f, 0xff, 0x08, + 0x45, 0x9b, 0x47, 0xd2, 0x94, 0x31, 0x65, 0xfd, 0xc3, 0xd6, 0x8d, 0x8b, + 0x2a, 0x47, 0xf1, 0xe4, 0xbb, 0xcc, 0xd8, 0x6b, 0x28, 0x8f, 0x03, 0xc4, + 0x57, 0xa7, 0x0b, 0xb8, 0xb2, 0xf7, 0x9c, 0x6b, 0x2b, 0x46, 0xff, 0x84, + 0x77, 0xf0, 0x63, 0xf3, 0xd0, 0xa9, 0x2f, 0xe1, 0x33, 0x59, 0x93, 0x2c, + 0xbf, 0x3f, 0x67, 0x0e, 0x16, 0x54, 0x95, 0x01, 0x8c, 0x8f, 0x21, 0xb2, + 0x6c, 0x04, 0x43, 0xc2, 0xff, 0x17, 0x5f, 0x9f, 0x5a, 0xcf, 0x96, 0x5f, + 0xfe, 0xf7, 0x4d, 0xff, 0xcd, 0x0e, 0x0a, 0x4b, 0x2f, 0xff, 0x7d, 0x3b, + 0xef, 0xe0, 0x82, 0xfb, 0x13, 0xac, 0xa8, 0x45, 0xfe, 0x14, 0x12, 0x4d, + 0xfa, 0x38, 0x21, 0x49, 0x65, 0xf4, 0xe0, 0x9c, 0x96, 0x5f, 0xf8, 0x39, + 0xac, 0x3e, 0x76, 0x37, 0xac, 0xbf, 0xff, 0xf9, 0xcf, 0xc7, 0xd0, 0x9c, + 0xe9, 0x1f, 0x5c, 0xbd, 0x2c, 0xd6, 0x2c, 0xbd, 0xdc, 0x6f, 0x59, 0x5d, + 0x44, 0x7b, 0xb8, 0x5f, 0xf1, 0x47, 0xdc, 0x8f, 0x40, 0xd6, 0x5e, 0xe0, + 0x9c, 0x9c, 0x7b, 0x58, 0x45, 0x43, 0x4e, 0x0b, 0xe2, 0x4f, 0x46, 0x51, + 0x7f, 0xda, 0x89, 0x1f, 0x8c, 0xa4, 0xb2, 0xff, 0xff, 0xff, 0xa3, 0x91, + 0xed, 0xb1, 0xad, 0x67, 0x5c, 0x4e, 0x60, 0xae, 0x5f, 0xc1, 0x44, 0xdd, + 0x85, 0x97, 0xee, 0x75, 0xc3, 0x0b, 0x2f, 0xcf, 0xb3, 0x4f, 0x25, 0x95, + 0x09, 0x8e, 0x11, 0xbb, 0x50, 0x95, 0x10, 0x9e, 0xff, 0xb9, 0xd8, 0x7d, + 0x6b, 0x3e, 0x59, 0x7f, 0xff, 0xe1, 0x7e, 0x97, 0xb0, 0xbd, 0xc9, 0xdc, + 0xe6, 0x6b, 0x09, 0xe4, 0xb2, 0xb1, 0x15, 0x06, 0x73, 0x7f, 0xf4, 0xf1, + 0x94, 0x00, 0x38, 0x29, 0xe9, 0x65, 0xd8, 0xd2, 0xcb, 0x64, 0x1e, 0xef, + 0x11, 0xaf, 0xdd, 0x82, 0x7e, 0xac, 0xbf, 0xb6, 0xeb, 0xfb, 0x50, 0xb2, + 0xff, 0x0f, 0xb1, 0x33, 0xbf, 0xcb, 0x2f, 0x77, 0xfd, 0xeb, 0x2b, 0x47, + 0xa8, 0xde, 0x69, 0x7d, 0xdf, 0x9f, 0x75, 0x65, 0x49, 0x31, 0x91, 0x93, + 0x68, 0x99, 0xe1, 0x04, 0x44, 0xb7, 0xff, 0x66, 0xbf, 0x61, 0xf0, 0x4e, + 0x46, 0x2c, 0xbf, 0x0f, 0x51, 0xf6, 0xea, 0xcb, 0xff, 0x85, 0x6a, 0x35, + 0xd8, 0x37, 0xf7, 0x16, 0x5f, 0xff, 0xfb, 0xd1, 0xaf, 0xc3, 0xd3, 0x91, + 0xe9, 0xff, 0xf1, 0x43, 0x38, 0xb2, 0xed, 0xde, 0x2c, 0xa1, 0x51, 0x0e, + 0xed, 0xb5, 0x24, 0xd8, 0x31, 0x14, 0xcb, 0x1e, 0x19, 0x97, 0x9b, 0xa2, + 0xfd, 0x65, 0xfd, 0x2d, 0x44, 0x9f, 0x4b, 0x2e, 0xc6, 0x2c, 0xbf, 0xfb, + 0x0b, 0xf9, 0xc2, 0x6b, 0xf6, 0x1f, 0x16, 0x50, 0xcf, 0x7d, 0x82, 0xd7, + 0xdf, 0xfb, 0x3f, 0x59, 0x7e, 0x8e, 0x70, 0xf7, 0xac, 0xaf, 0x91, 0xf6, + 0x70, 0x8c, 0xd1, 0x17, 0x49, 0x2f, 0x6e, 0x7d, 0x0b, 0x2f, 0xf8, 0x3d, + 0x28, 0xf8, 0xe3, 0xab, 0x2a, 0x19, 0x4f, 0x32, 0x8c, 0x9c, 0x65, 0xb9, + 0x1d, 0x51, 0xc6, 0xa9, 0xa8, 0x75, 0xbc, 0x72, 0xe5, 0x1d, 0x77, 0x10, + 0x01, 0x18, 0xee, 0xe2, 0x10, 0x84, 0x17, 0xfe, 0x73, 0x18, 0x3d, 0xcd, + 0xb1, 0xa5, 0x97, 0x37, 0x44, 0xb2, 0xfd, 0xcc, 0x16, 0x38, 0xb2, 0xfe, + 0x8f, 0x98, 0xe5, 0xfa, 0xcb, 0xfb, 0x77, 0x86, 0x5f, 0x49, 0x65, 0xff, + 0x9f, 0x5b, 0x87, 0xdc, 0x7f, 0xbf, 0x59, 0x7f, 0xfe, 0x3f, 0x43, 0x33, + 0xef, 0x43, 0x04, 0xd3, 0xfe, 0xb2, 0xf8, 0xc9, 0xc6, 0xb2, 0xff, 0xb9, + 0x1a, 0xf4, 0x4f, 0x19, 0xac, 0xa9, 0x22, 0xc4, 0x6a, 0xfc, 0x20, 0xbf, + 0xff, 0xb3, 0xb3, 0xb1, 0x87, 0xd8, 0x9d, 0xce, 0x61, 0x7e, 0xb2, 0xff, + 0xe3, 0xd4, 0x4b, 0xb1, 0x31, 0x00, 0x55, 0x95, 0xd4, 0x51, 0xf1, 0x7a, + 0xe0, 0xee, 0x2c, 0xbf, 0x85, 0xf4, 0x76, 0x38, 0xb2, 0xff, 0xb8, 0x59, + 0xee, 0x46, 0xb6, 0x59, 0x7f, 0x74, 0xfe, 0xe3, 0xfc, 0xb2, 0xff, 0x60, + 0xf3, 0x52, 0x8d, 0x2c, 0xbd, 0xd3, 0xf2, 0xca, 0x92, 0x3f, 0x8c, 0x6a, + 0x62, 0xef, 0xce, 0x78, 0x5e, 0x21, 0x95, 0xff, 0xd8, 0xe5, 0xb3, 0x58, + 0x43, 0xec, 0x2c, 0xbc, 0x18, 0xdd, 0x59, 0x7f, 0xa6, 0xeb, 0xeb, 0x46, + 0x35, 0x95, 0x87, 0xa6, 0xe3, 0xf7, 0xfc, 0x4f, 0xf0, 0x9a, 0x36, 0x62, + 0xcb, 0xe3, 0xeb, 0xb1, 0x65, 0xff, 0x11, 0x66, 0xde, 0xf4, 0x31, 0x65, + 0x4c, 0x9a, 0x41, 0x42, 0x5b, 0x84, 0x1e, 0x39, 0x10, 0x86, 0xfd, 0xac, + 0xe1, 0xb4, 0xb2, 0xf4, 0x37, 0x17, 0x59, 0x7f, 0x09, 0x00, 0x08, 0x18, + 0xb2, 0xe3, 0x25, 0x97, 0xd2, 0x82, 0x0a, 0xca, 0x19, 0xb6, 0xc1, 0x5b, + 0x4c, 0xb2, 0xf9, 0xb0, 0xf1, 0xf2, 0xcb, 0x41, 0x1b, 0x8f, 0x09, 0x54, + 0xe3, 0xfd, 0x35, 0x8b, 0xe8, 0xff, 0x09, 0x65, 0x49, 0x7b, 0x3c, 0x65, + 0x18, 0x5c, 0x13, 0x13, 0x87, 0x9c, 0xd0, 0xd3, 0xd4, 0x64, 0x2c, 0x8e, + 0x85, 0xd4, 0x78, 0x50, 0x02, 0x16, 0xa1, 0xc5, 0xb8, 0x47, 0x7c, 0xc6, + 0xd1, 0xb8, 0xb7, 0x2b, 0x2e, 0xf7, 0x16, 0x51, 0x9e, 0x54, 0xc6, 0x77, + 0xc2, 0x43, 0x5c, 0x59, 0x77, 0xfe, 0x59, 0x77, 0xfd, 0x59, 0x7d, 0xad, + 0x67, 0x16, 0x5d, 0x93, 0x2c, 0xb4, 0xa7, 0x22, 0x37, 0x62, 0x46, 0x0c, + 0x38, 0xc0, 0x84, 0x57, 0xe3, 0xf3, 0x96, 0x2c, 0xbf, 0x68, 0x79, 0x84, + 0xb2, 0xff, 0xed, 0xd3, 0xce, 0xc6, 0xfe, 0x76, 0x3e, 0x59, 0x7f, 0x7d, + 0xa0, 0x7d, 0xe9, 0x2c, 0xa7, 0x45, 0x07, 0x09, 0x80, 0x93, 0x7e, 0x6b, + 0xde, 0xcd, 0x96, 0x52, 0xcb, 0xfc, 0x5a, 0xce, 0x61, 0xf5, 0x65, 0x36, + 0x0d, 0xe6, 0x05, 0xdf, 0xff, 0x4b, 0xc5, 0x8f, 0xe2, 0xcf, 0x7b, 0x1a, + 0x59, 0x7a, 0x4e, 0xde, 0xb2, 0xff, 0xfb, 0x06, 0x7e, 0xc6, 0x76, 0x20, + 0x2c, 0x75, 0x97, 0x66, 0xf5, 0x97, 0xfc, 0x1e, 0xe0, 0xd8, 0x7a, 0xc5, + 0x95, 0x08, 0x9d, 0xd9, 0x37, 0x06, 0x2f, 0xe8, 0x8d, 0x76, 0x37, 0xac, + 0xbf, 0x7e, 0x65, 0x36, 0xea, 0xcb, 0xff, 0xde, 0xe6, 0x4d, 0xd8, 0xdf, + 0x9d, 0xec, 0x2c, 0xbf, 0xba, 0x33, 0xdf, 0x03, 0x59, 0x58, 0x7f, 0x6e, + 0x99, 0x7d, 0xc3, 0xcf, 0xd6, 0x5f, 0xe3, 0x06, 0xbb, 0x9b, 0xf8, 0xb2, + 0xff, 0xff, 0x67, 0x8f, 0xe9, 0x14, 0x4e, 0xf1, 0xe3, 0x78, 0xfb, 0x8b, + 0x2f, 0xb3, 0xc7, 0xc5, 0x97, 0xf3, 0x75, 0x31, 0x37, 0x3b, 0x01, 0x65, + 0x6e, 0xa3, 0xd2, 0x63, 0x5e, 0x32, 0x78, 0x86, 0xff, 0xc0, 0x76, 0x70, + 0xc9, 0xf4, 0x2a, 0xca, 0x92, 0xea, 0x08, 0xe1, 0x8b, 0x85, 0xe1, 0x66, + 0xf8, 0x92, 0x64, 0xed, 0x42, 0xf3, 0xa5, 0xff, 0x97, 0x14, 0x29, 0xf8, + 0x41, 0xe8, 0xc5, 0x9a, 0x41, 0xbf, 0xff, 0x78, 0xf9, 0xb6, 0x35, 0xc3, + 0xd8, 0x9f, 0xef, 0x2c, 0xbc, 0xd6, 0x75, 0x65, 0xfc, 0x52, 0x69, 0xfb, + 0xc5, 0x97, 0xe1, 0x7a, 0xe4, 0x6b, 0x2d, 0xcc, 0x3d, 0x53, 0x2e, 0xbf, + 0x6c, 0x32, 0x71, 0x56, 0x5f, 0x1f, 0x30, 0x78, 0x98, 0xcb, 0xac, 0x79, + 0xc8, 0x42, 0x6b, 0xff, 0x3e, 0xef, 0xe0, 0xe1, 0x97, 0xd2, 0x59, 0x7f, + 0x87, 0x84, 0x6d, 0x74, 0x0b, 0x2f, 0xff, 0xba, 0x71, 0xe3, 0xfe, 0x25, + 0x3d, 0xa6, 0x9a, 0x49, 0x7f, 0xf1, 0xc7, 0xbf, 0x89, 0x4f, 0x69, 0xa6, + 0x92, 0x56, 0x22, 0x7f, 0xaa, 0xb5, 0xb2, 0x3d, 0x3d, 0x0d, 0x2b, 0xfd, + 0xd0, 0x3b, 0x06, 0xec, 0x59, 0x44, 0x7b, 0x9e, 0x29, 0xbe, 0x1e, 0x60, + 0xa9, 0x2f, 0x9f, 0xf7, 0xf2, 0xcb, 0xfe, 0xd3, 0x86, 0x77, 0x60, 0x42, + 0x59, 0x78, 0x11, 0xa5, 0x97, 0x7b, 0x83, 0x3d, 0x79, 0x8e, 0xef, 0x48, + 0x80, 0xa8, 0x86, 0x57, 0xbb, 0x1b, 0x2c, 0xbf, 0x7a, 0x24, 0x2b, 0x16, + 0x5e, 0x69, 0xa6, 0x92, 0x5e, 0xc2, 0x0a, 0x49, 0xe6, 0x82, 0xff, 0xd9, + 0xb6, 0x0d, 0xe4, 0x51, 0xb2, 0xca, 0x84, 0x5a, 0x7e, 0x92, 0x45, 0xb7, + 0xef, 0x75, 0xc8, 0x55, 0x97, 0xf7, 0xd2, 0xe1, 0x38, 0x56, 0x5e, 0x26, + 0xd6, 0xd9, 0x59, 0x58, 0x7a, 0x8e, 0x5d, 0x73, 0x6b, 0x6d, 0x6b, 0x2f, + 0xd9, 0xef, 0x03, 0x65, 0x97, 0xfe, 0x3d, 0xba, 0x6f, 0x2f, 0x1e, 0xcb, + 0x2d, 0x26, 0xd6, 0x88, 0xb2, 0x23, 0xf1, 0x4d, 0xe7, 0xdd, 0x85, 0x97, + 0xec, 0x1f, 0x5f, 0x75, 0x65, 0xf8, 0xb0, 0x70, 0xc5, 0x95, 0x0a, 0xf9, + 0x36, 0x21, 0x19, 0x16, 0x3c, 0xfc, 0x5f, 0x31, 0x4e, 0xa1, 0xa2, 0xc2, + 0xfe, 0xbe, 0x3c, 0x2a, 0xc0, 0x77, 0xbc, 0x79, 0xa2, 0xab, 0xf9, 0x98, + 0x7a, 0x9a, 0x4b, 0x2f, 0xff, 0x85, 0x11, 0xcb, 0xaf, 0x2e, 0x63, 0x23, + 0x75, 0x65, 0x42, 0x20, 0x4c, 0xba, 0xf7, 0x8e, 0x16, 0x5d, 0x84, 0xb2, + 0x8c, 0xd8, 0x00, 0x6e, 0xfc, 0x51, 0xf4, 0x71, 0x65, 0xff, 0xb0, 0xc9, + 0xfd, 0xc6, 0xa0, 0x96, 0x5e, 0xeb, 0xea, 0x0f, 0x8f, 0x84, 0xf7, 0xc7, + 0xa8, 0xf2, 0xcb, 0xee, 0x64, 0x49, 0x65, 0x0c, 0xf0, 0x88, 0x86, 0xfd, + 0x12, 0xee, 0x7c, 0xb2, 0xfa, 0x47, 0x01, 0x59, 0x77, 0xdf, 0xac, 0xbf, + 0x99, 0x1c, 0xfc, 0xc2, 0xb2, 0xf7, 0x20, 0x5f, 0xcf, 0x1f, 0x83, 0x37, + 0xf8, 0x19, 0xaf, 0xff, 0x32, 0x59, 0x6e, 0x2c, 0xb9, 0xb9, 0xd9, 0x65, + 0x48, 0xd7, 0x38, 0x8d, 0xff, 0xb1, 0x86, 0x3d, 0x60, 0xdd, 0x8b, 0x2f, + 0xb1, 0x82, 0x0d, 0x65, 0x74, 0xf8, 0x08, 0xf6, 0xff, 0xdd, 0x13, 0x99, + 0xa0, 0xbb, 0x85, 0x51, 0x06, 0x2f, 0xfe, 0xda, 0x05, 0xcd, 0x7b, 0xd1, + 0x9c, 0x59, 0x63, 0x1a, 0x24, 0x49, 0x32, 0xff, 0xdd, 0x03, 0x8b, 0x9e, + 0xf6, 0x75, 0x65, 0xff, 0xb9, 0xfb, 0xfd, 0xc1, 0x35, 0xd7, 0x59, 0x7c, + 0x0e, 0xe0, 0x56, 0x54, 0x91, 0x94, 0x32, 0x7f, 0x1f, 0xee, 0x21, 0x5f, + 0xf7, 0x39, 0x1a, 0x90, 0x4f, 0x65, 0x97, 0xf0, 0x05, 0x2c, 0xd8, 0x0b, + 0x2a, 0x0f, 0xa7, 0xa7, 0x57, 0xba, 0x0d, 0xd5, 0x97, 0xff, 0xb4, 0xfb, + 0xf0, 0x83, 0xd3, 0xfc, 0x4f, 0x2c, 0xa8, 0x4c, 0xde, 0x50, 0xa9, 0x6d, + 0x90, 0x80, 0x82, 0xbe, 0x5c, 0x10, 0xe9, 0xa9, 0x31, 0x72, 0x10, 0x1e, + 0x95, 0x67, 0x7e, 0xf1, 0x84, 0xc6, 0xb2, 0xfa, 0x3c, 0x73, 0x2c, 0xbf, + 0x80, 0xe2, 0x01, 0xc4, 0x59, 0x53, 0x1e, 0x8e, 0x88, 0xae, 0xdf, 0x8b, + 0x2b, 0x0d, 0xdb, 0x91, 0xdd, 0xff, 0xeb, 0x2f, 0xf8, 0x3d, 0x3d, 0x11, + 0xfb, 0x8b, 0x29, 0x87, 0xa3, 0xf8, 0xcd, 0xfe, 0xfc, 0xfb, 0xdc, 0xfd, + 0xd6, 0x5f, 0xee, 0x1e, 0x16, 0x7c, 0xd2, 0xcb, 0xff, 0xfd, 0x9e, 0xf3, + 0xe8, 0xa3, 0xe9, 0x09, 0xaf, 0xd8, 0x7c, 0x59, 0x5b, 0xa8, 0x96, 0x61, + 0x9d, 0xf8, 0x1f, 0x07, 0x18, 0xb2, 0xff, 0x98, 0x6d, 0x61, 0x0f, 0xb0, + 0xb2, 0xee, 0x81, 0x65, 0xff, 0xfa, 0x46, 0x43, 0xee, 0x7c, 0x23, 0x97, + 0x88, 0x6b, 0x2f, 0xf6, 0x0f, 0xb9, 0xf6, 0x71, 0x65, 0xe3, 0x6b, 0x75, + 0x65, 0xfe, 0xcd, 0xfc, 0xf7, 0xa1, 0x8b, 0x2b, 0x47, 0xab, 0xd2, 0x0a, + 0x84, 0xe7, 0x46, 0x4d, 0x85, 0x26, 0x71, 0x30, 0xb9, 0x2a, 0xf2, 0x11, + 0x17, 0x34, 0x6b, 0x2f, 0xcc, 0x0e, 0x10, 0x56, 0x54, 0x1b, 0xe3, 0x17, + 0xbf, 0xf9, 0xf6, 0xe3, 0x8e, 0x36, 0x89, 0x42, 0xcb, 0xfb, 0x39, 0xb9, + 0x9a, 0x85, 0x95, 0xa4, 0x49, 0x70, 0x7f, 0x71, 0x12, 0xf8, 0xe0, 0xa6, + 0x59, 0x52, 0x65, 0xa4, 0x8e, 0x10, 0x78, 0xe8, 0x12, 0x1f, 0x8a, 0x0e, + 0x71, 0xe2, 0x65, 0x96, 0x42, 0xcd, 0xdc, 0x3f, 0x23, 0xe4, 0xa6, 0x7f, + 0x46, 0x6e, 0xd1, 0x9d, 0xfe, 0xe7, 0x30, 0xbf, 0xdc, 0xc5, 0x97, 0xc4, + 0x6d, 0xf0, 0xb2, 0xf8, 0x42, 0xce, 0x2c, 0xb4, 0xcb, 0x2f, 0xee, 0x61, + 0x7f, 0xb9, 0x8b, 0x2a, 0x72, 0x2f, 0x70, 0xd9, 0xc8, 0xff, 0x22, 0xe0, + 0x95, 0xf7, 0x9d, 0xc9, 0x65, 0x6f, 0x3e, 0xb6, 0x92, 0xef, 0xf8, 0x1e, + 0xfc, 0x0c, 0x8c, 0xf2, 0xcb, 0xff, 0xc5, 0xb4, 0xe9, 0x8c, 0xb0, 0x78, + 0x42, 0xac, 0xbf, 0x8f, 0xe6, 0xfe, 0xc7, 0x96, 0x5f, 0x81, 0xc3, 0x3f, + 0x96, 0x5e, 0x13, 0x21, 0x65, 0xfe, 0xc1, 0xe9, 0xc3, 0xef, 0xd6, 0x5f, + 0xb0, 0x87, 0xd8, 0x59, 0x5d, 0x3d, 0xa6, 0x8d, 0x2a, 0x13, 0x3e, 0xdd, + 0x4c, 0x98, 0xc5, 0xca, 0x38, 0xed, 0x7f, 0xff, 0xb0, 0x9f, 0xdc, 0xcd, + 0x7f, 0xfc, 0x67, 0xde, 0xe1, 0xac, 0xbb, 0x37, 0x16, 0x59, 0xc6, 0x7f, + 0x5e, 0x61, 0xbd, 0x1a, 0x99, 0x65, 0x4e, 0x74, 0xf7, 0x4d, 0xda, 0x04, + 0x4f, 0x75, 0x6d, 0x18, 0xe0, 0xe1, 0x5f, 0x93, 0xb2, 0x81, 0x8f, 0x97, + 0xe5, 0x33, 0x9d, 0x77, 0xec, 0x68, 0x4f, 0x4b, 0x9a, 0xfe, 0x3f, 0xe2, + 0x25, 0x04, 0x6f, 0x0d, 0x43, 0x1f, 0x70, 0x9e, 0xf7, 0xdb, 0x6f, 0x59, + 0x7e, 0x0f, 0x63, 0xe6, 0xf5, 0x97, 0x01, 0xb6, 0xb2, 0xfd, 0xd7, 0xd3, + 0x0d, 0x65, 0xfc, 0x20, 0x7b, 0x1f, 0x37, 0xac, 0xa9, 0xc8, 0xa1, 0x91, + 0x60, 0x46, 0xc0, 0x4f, 0x7a, 0x77, 0xed, 0x2c, 0xaf, 0x8f, 0x83, 0xc7, + 0xf7, 0xf6, 0x35, 0x98, 0x42, 0xac, 0xbc, 0xf9, 0xc5, 0x97, 0xe7, 0xd8, + 0xc1, 0x25, 0x97, 0xbf, 0xfe, 0x16, 0x53, 0x0f, 0x87, 0xa3, 0x64, 0x51, + 0x46, 0x8b, 0xc7, 0x84, 0x75, 0xff, 0xf0, 0x63, 0x9c, 0x86, 0x67, 0x8f, + 0x9d, 0x75, 0x97, 0xf8, 0x8a, 0x24, 0xc8, 0x35, 0x97, 0xec, 0xde, 0x59, + 0xc5, 0x97, 0xfb, 0xc7, 0xbc, 0xfd, 0x28, 0x49, 0x66, 0x2c, 0xbf, 0xb0, + 0x85, 0xd4, 0x4f, 0x33, 0xc5, 0x10, 0xd2, 0xb1, 0x33, 0x13, 0x4e, 0x23, + 0x0e, 0x36, 0xde, 0x07, 0xd2, 0x59, 0x7d, 0x2d, 0x3e, 0xf5, 0x95, 0xa3, + 0xc2, 0x21, 0xeb, 0xfc, 0x52, 0x2c, 0x64, 0x05, 0x65, 0xf8, 0xfa, 0x51, + 0x25, 0x97, 0x9f, 0x86, 0xb2, 0xd8, 0xb2, 0xf6, 0x60, 0xab, 0x2c, 0xc1, + 0x9a, 0xc6, 0xf1, 0x0a, 0x84, 0x74, 0xe1, 0x0e, 0x8c, 0x7a, 0x4c, 0xe8, + 0xf7, 0xfc, 0x7b, 0xf3, 0x41, 0x77, 0x0a, 0xa3, 0x0d, 0x5e, 0xdc, 0x07, + 0x96, 0x5c, 0x7b, 0xd6, 0x5f, 0x3e, 0x9c, 0x45, 0x97, 0x60, 0xab, 0x2f, + 0xfe, 0x86, 0x18, 0xf0, 0x85, 0xec, 0x31, 0x65, 0x74, 0xf6, 0xbc, 0x2f, + 0x43, 0x4c, 0x70, 0x28, 0xcc, 0x20, 0xe0, 0xc7, 0x9f, 0x2f, 0x0a, 0x27, + 0x56, 0x5f, 0xff, 0x1f, 0xbb, 0x1c, 0x8e, 0xc1, 0xed, 0x02, 0xac, 0xbf, + 0xdd, 0x89, 0xa4, 0x7a, 0x92, 0xcb, 0xfd, 0xe3, 0x6a, 0x62, 0x76, 0x96, + 0x5f, 0xf6, 0x6f, 0x81, 0xf7, 0x0f, 0xcb, 0x2f, 0x71, 0xff, 0x59, 0x6f, + 0x11, 0xeb, 0x78, 0xe6, 0xfd, 0x0c, 0xf6, 0x05, 0x65, 0xfa, 0x25, 0xf9, + 0x62, 0xcb, 0x8f, 0x65, 0x95, 0x09, 0xcd, 0x0d, 0x3f, 0xe3, 0x43, 0x84, + 0x5f, 0x49, 0xc8, 0x9f, 0xc4, 0xf7, 0xe6, 0x8c, 0x6d, 0xe6, 0xb2, 0xff, + 0xbb, 0x12, 0x32, 0xc6, 0x42, 0xcb, 0xfe, 0xcf, 0x77, 0x18, 0x4f, 0xe5, + 0x97, 0xf6, 0xf3, 0xd7, 0xd1, 0xba, 0xb2, 0xc4, 0x33, 0xea, 0xc3, 0x7b, + 0xf3, 0x20, 0x3b, 0x0d, 0x65, 0xf4, 0xa1, 0x8e, 0xb2, 0xfd, 0xaf, 0xd8, + 0x7c, 0x59, 0x77, 0xb9, 0x87, 0xe6, 0xe5, 0x22, 0x10, 0xd4, 0x23, 0x4c, + 0x10, 0x99, 0xb7, 0x16, 0x5f, 0xd1, 0xb6, 0x11, 0x8a, 0xb2, 0xb4, 0x6f, + 0xb8, 0x23, 0x7f, 0xf4, 0x13, 0xf6, 0x3f, 0x9f, 0xae, 0x71, 0x25, 0xec, + 0x0c, 0x2c, 0xad, 0x95, 0x2d, 0x0e, 0x37, 0x3c, 0x65, 0x61, 0x0e, 0xf4, + 0x6b, 0xf3, 0xcc, 0x79, 0xc5, 0x97, 0xdc, 0x8d, 0x49, 0x65, 0xce, 0x39, + 0xc7, 0x93, 0xc2, 0x7b, 0x81, 0xb2, 0xcb, 0xfd, 0xf4, 0xbe, 0xe1, 0xfa, + 0x16, 0x5e, 0x3f, 0xb8, 0xb2, 0xb0, 0xf4, 0x8c, 0xd6, 0x8d, 0x11, 0x5d, + 0x6a, 0xbb, 0x02, 0xb2, 0xf6, 0xb3, 0x8b, 0x3c, 0x5b, 0x5f, 0xff, 0x0e, + 0x73, 0x9e, 0x72, 0x36, 0xc2, 0x31, 0x56, 0x5f, 0xed, 0x32, 0x3e, 0xf3, + 0x85, 0x65, 0xff, 0xfc, 0x59, 0xee, 0xe4, 0xb0, 0x30, 0x1f, 0x13, 0xb1, + 0x65, 0x62, 0x37, 0x0d, 0x43, 0x86, 0x97, 0xc6, 0xc8, 0x99, 0x65, 0xff, + 0xdc, 0x3f, 0x8b, 0x26, 0xd4, 0x7b, 0x8b, 0x2f, 0xb3, 0x60, 0x49, 0x65, + 0x4c, 0x88, 0xaf, 0xc8, 0x9a, 0x45, 0xbf, 0xdc, 0x89, 0x3e, 0xce, 0xc5, + 0x97, 0xf7, 0xfb, 0x3c, 0xa3, 0x75, 0x65, 0xe1, 0x8e, 0x16, 0x57, 0xc7, + 0x9c, 0x03, 0x2a, 0x84, 0x6b, 0x99, 0x9b, 0xc2, 0x06, 0xec, 0x69, 0x65, + 0x27, 0x10, 0xc2, 0xfe, 0xe0, 0x91, 0xa8, 0x62, 0x71, 0x0c, 0x29, 0x38, + 0x86, 0x14, 0x9c, 0x43, 0x0a, 0x4e, 0x21, 0x85, 0x27, 0x10, 0xc2, 0xa4, + 0x8b, 0x93, 0x19, 0xfc, 0xf0, 0x03, 0x3b, 0x83, 0x2d, 0xe3, 0x37, 0x77, + 0x13, 0x88, 0x61, 0x7f, 0x3b, 0xfa, 0x68, 0x62, 0x71, 0x0c, 0x27, 0x1a, + 0x4b, 0x36, 0xd3, 0x88, 0x61, 0x49, 0xc4, 0x30, 0xa4, 0xe2, 0x18, 0x54, + 0x8d, 0x91, 0x8c, 0xd2, 0x71, 0x0c, 0x29, 0x38, 0x86, 0x14, 0x9c, 0x43, + 0x0a, 0x4e, 0x21, 0x85, 0x27, 0x10, 0xc2, 0x93, 0x88, 0x61, 0x5b, 0x22, + 0x58, 0x63, 0x26, 0x33, 0xf8, 0xcf, 0x06, 0x77, 0x8c, 0xd2, 0x71, 0x0c, + 0x29, 0x38, 0x86, 0x15, 0x23, 0x65, 0xc1, 0x9a, 0x4e, 0x21, 0x85, 0x27, + 0x10, 0xc2, 0x93, 0x88, 0x61, 0x49, 0xc4, 0x30, 0xa9, 0x1f, 0x27, 0xe3, + 0x3e, 0x19, 0x6f, 0x19, 0xa4, 0xe2, 0x18, 0x52, 0x71, 0x0c, 0x29, 0x38, + 0x86, 0x14, 0x9c, 0x43, 0x0a, 0xd8, 0xf9, 0x05, 0x19, 0xd0, 0xcf, 0x46, + 0x6c, 0x2a, 0x71, 0x0c, 0x29, 0x38, 0x86, 0x14, 0x9c, 0x43, 0x0a, 0x4e, + 0x21, 0x85, 0x27, 0x10, 0xc2, 0x86, 0x7c, 0x9f, 0x0c, 0xfe, 0x32, 0x01, + 0x9a, 0x4e, 0x21, 0x85, 0x27, 0x10, 0xc2, 0x93, 0x88, 0x61, 0x7e, 0xec, + 0x7f, 0xcc, 0x4e, 0x21, 0x85, 0x27, 0x10, 0xc2, 0xa4, 0x89, 0xa0, 0x8c, + 0xf4, 0x65, 0xc6, 0x7f, 0x36, 0xb0, 0x53, 0x88, 0x61, 0x49, 0xc4, 0x30, + 0xa4, 0xe2, 0x18, 0x52, 0x71, 0x0c, 0x29, 0x38, 0x86, 0x15, 0x23, 0xe4, + 0xf8, 0x64, 0xc6, 0x77, 0x8c, 0xd2, 0x71, 0x0c, 0x29, 0x38, 0x86, 0x14, + 0x9c, 0x43, 0x0a, 0x4e, 0x21, 0x85, 0x48, 0xf9, 0x06, 0x33, 0xd1, 0x92, + 0x19, 0xb7, 0x53, 0x88, 0x61, 0x49, 0xc4, 0x30, 0xa4, 0xe2, 0x18, 0x5a, + 0x49, 0xc4, 0x30, 0xa4, 0xe2, 0x18, 0x7c, 0x5f, 0xd2, 0x71, 0x0c, 0x29, + 0x38, 0x86, 0x14, 0x9c, 0x43, 0x0a, 0x4e, 0x21, 0x85, 0x6c, 0x8d, 0xe9, + 0x0c, 0x8a, 0x70, 0x12, 0x99, 0x86, 0x7f, 0x19, 0xf0, 0xcd, 0xb1, 0x38, + 0x86, 0x14, 0x9c, 0x43, 0x0a, 0x4e, 0x21, 0x85, 0xa4, 0x9c, 0x43, 0x0a, + 0x4e, 0x21, 0x87, 0xc5, 0xfd, 0x27, 0x10, 0xc2, 0x93, 0x88, 0x61, 0x50, + 0x8a, 0xc9, 0x0c, 0x99, 0xc6, 0x8a, 0x58, 0x33, 0x49, 0xc4, 0x30, 0xa4, + 0xe2, 0x18, 0x52, 0x71, 0x0c, 0x29, 0x38, 0x86, 0x14, 0x9c, 0x43, 0x0a, + 0x83, 0xfd, 0xf8, 0x67, 0x43, 0x2c, 0x19, 0x21, 0x9a, 0x4e, 0x21, 0x85, + 0x27, 0x10, 0xc2, 0x93, 0x88, 0x61, 0x5a, 0x3c, 0xbe, 0x0c, 0xf8, 0x66, + 0x93, 0x88, 0x61, 0x49, 0xc4, 0x30, 0xa4, 0xe2, 0x18, 0x53, 0x0f, 0x2c, + 0x86, 0x7c, 0x33, 0x66, 0x27, 0x10, 0xc2, 0x93, 0x88, 0x61, 0x49, 0xc4, + 0x30, 0xaf, 0xcd, 0x90, 0x06, 0x69, 0x38, 0x86, 0x14, 0x9c, 0x43, 0x0a, + 0x4e, 0x21, 0x85, 0x27, 0x10, 0xc2, 0xa0, 0xf9, 0x26, 0x19, 0xe8, 0xc8, + 0x06, 0x6a, 0x19, 0x82, 0x9b, 0x42, 0x06, 0x49, 0xa3, 0x55, 0xc8, 0x5b, + 0x06, 0x11, 0x9f, 0x42, 0x14, 0xe1, 0x49, 0xba, 0x7d, 0x34, 0x21, 0x35, + 0x0d, 0x86, 0x25, 0x76, 0x10, 0x6f, 0x0a, 0x2f, 0xce, 0xca, 0x1f, 0xbc, + 0x68, 0xf4, 0x32, 0x81, 0x0c, 0x5d, 0xf0, 0x93, 0x69, 0xeb, 0x70, 0xb8, + 0x45, 0x16, 0xf8, 0x43, 0x5f, 0xa4, 0x51, 0x9c, 0x4e, 0x21, 0x84, 0xf4, + 0xe5, 0xef, 0x1c, 0x31, 0x38, 0x86, 0x17, 0xc6, 0x17, 0xd2, 0xf1, 0x0c, + 0x5e, 0x31, 0xe2, 0xf1, 0x0c, 0x5a, 0x7f, 0xc8, 0xc8, 0xd2, 0x4f, 0x4a, + 0x7c, 0x5d, 0x68, 0xde, 0xcf, 0x89, 0x12, 0x9e, 0x87, 0x78, 0xcb, 0x65, + 0x97, 0xf1, 0xb4, 0x3d, 0x46, 0xcb, 0x2a, 0x47, 0x97, 0xd1, 0xcb, 0x9f, + 0xe5, 0x97, 0xd1, 0xb9, 0x1e, 0x59, 0x78, 0xf7, 0xb6, 0xd6, 0x57, 0xc9, + 0x81, 0x4d, 0x08, 0x3e, 0x91, 0x10, 0xbf, 0x89, 0x2f, 0xd9, 0x93, 0x38, + 0x8b, 0x2f, 0xf3, 0x90, 0x93, 0x48, 0xc9, 0x65, 0xdf, 0xc2, 0xcb, 0xfb, + 0x4e, 0x42, 0x47, 0xeb, 0x2e, 0x7d, 0x2c, 0xb1, 0xac, 0x09, 0x6d, 0x60, + 0xac, 0xb3, 0x16, 0x5a, 0x79, 0xa2, 0x73, 0x42, 0xfd, 0x44, 0x71, 0xf1, + 0x04, 0x69, 0x89, 0x90, 0x6e, 0x43, 0x3e, 0xff, 0xbb, 0x0c, 0xc9, 0xa0, + 0xb6, 0x59, 0x7f, 0xf4, 0xe7, 0x08, 0xfb, 0x1f, 0xe1, 0x7e, 0xb2, 0xef, + 0xe1, 0x65, 0x61, 0xef, 0x7e, 0x8f, 0x58, 0x8e, 0x5f, 0xcb, 0x01, 0x09, + 0x7b, 0xff, 0x88, 0xa3, 0x62, 0xc3, 0xdf, 0x1b, 0x8b, 0x2f, 0x47, 0xdc, + 0x59, 0x4e, 0x7c, 0x7c, 0x46, 0xbc, 0xfa, 0x85, 0x97, 0xe3, 0xdc, 0x72, + 0xfd, 0x65, 0xf8, 0xfe, 0xe3, 0xfc, 0xb2, 0xa4, 0x7d, 0xcc, 0x1b, 0xe1, + 0x55, 0xf6, 0xf6, 0x41, 0xac, 0xbf, 0xe1, 0x1c, 0x7c, 0xc6, 0x46, 0xea, + 0xcb, 0xd9, 0xf3, 0x4b, 0x2e, 0xff, 0x34, 0x7b, 0x44, 0x79, 0x7f, 0xf8, + 0xf7, 0x40, 0x29, 0xfd, 0xcc, 0x9a, 0x3c, 0xb2, 0xbe, 0x3f, 0xc6, 0x16, + 0xdf, 0x6f, 0xcd, 0x49, 0x65, 0xe1, 0xb9, 0x2c, 0xa3, 0x37, 0xee, 0x49, + 0x7e, 0x80, 0xb9, 0x0a, 0xb2, 0xff, 0xe7, 0xd6, 0x9f, 0xf8, 0x9e, 0xd3, + 0x4d, 0x2c, 0xbf, 0xf0, 0xb9, 0xf7, 0x8f, 0xda, 0x03, 0x16, 0x5a, 0x27, + 0x22, 0x2f, 0xc9, 0x55, 0x0a, 0xa1, 0x70, 0xbd, 0xe1, 0xf3, 0xc6, 0x2f, + 0x0f, 0x82, 0x16, 0x57, 0xff, 0x00, 0x49, 0xa7, 0x40, 0x8e, 0x18, 0xea, + 0xca, 0x6c, 0x3a, 0x6c, 0x68, 0x8c, 0x8b, 0x68, 0x6f, 0xca, 0x35, 0x71, + 0xc6, 0xcd, 0x91, 0xb1, 0x8a, 0x96, 0x18, 0xee, 0x7e, 0x68, 0x39, 0x50, + 0xbb, 0xb0, 0x9d, 0x9a, 0x17, 0x3a, 0x38, 0x64, 0x60, 0xfd, 0x8e, 0x3d, + 0xeb, 0x0b, 0xdf, 0xd4, 0x4a, 0x51, 0x6f, 0x21, 0x31, 0xe9, 0x62, 0x82, + 0x30, 0x5e, 0x67, 0x02, 0xb2, 0xf1, 0x06, 0x16, 0x54, 0xe3, 0x70, 0x63, + 0xb7, 0xd2, 0xcd, 0x42, 0xcb, 0xf9, 0xa7, 0xd6, 0x9f, 0xe5, 0x97, 0xff, + 0xee, 0x6b, 0x47, 0x37, 0x35, 0x1e, 0x30, 0x98, 0xd6, 0x53, 0x11, 0x91, + 0xf9, 0x11, 0x10, 0xb4, 0x5f, 0x7c, 0xcf, 0x47, 0x16, 0x5e, 0xd8, 0xc6, + 0xb2, 0xc0, 0x59, 0x6f, 0xcc, 0xd7, 0x10, 0xed, 0xf6, 0x8c, 0x85, 0x59, + 0x7f, 0xbd, 0x00, 0x0f, 0x4f, 0x4b, 0x2f, 0xec, 0x0f, 0x63, 0xe9, 0x2c, + 0xbf, 0x99, 0xc3, 0x17, 0xcd, 0x2c, 0xbf, 0x47, 0xdd, 0x89, 0x2c, 0xad, + 0x23, 0x6c, 0x88, 0xbc, 0x66, 0x21, 0x73, 0x79, 0x85, 0xff, 0x67, 0xc5, + 0x9e, 0xf6, 0x6c, 0xb2, 0xef, 0xbc, 0xb2, 0xfd, 0x85, 0xb1, 0xe9, 0x65, + 0xfb, 0xce, 0x40, 0xc5, 0x97, 0xfb, 0x98, 0xc3, 0xf7, 0x5d, 0x65, 0xa3, + 0x11, 0x2f, 0xa1, 0x82, 0x27, 0xf1, 0x35, 0xe9, 0xcc, 0x35, 0x97, 0x13, + 0x16, 0x54, 0x8d, 0xa7, 0x07, 0xaf, 0x37, 0xea, 0x16, 0x5f, 0xf7, 0x4f, + 0x5d, 0x76, 0xc3, 0x4d, 0x2c, 0xbf, 0xda, 0x39, 0x8b, 0x37, 0xba, 0xcb, + 0x72, 0x72, 0x2c, 0xe0, 0x87, 0x07, 0xf4, 0x7f, 0x7c, 0xe4, 0x0c, 0x59, + 0x5f, 0x1f, 0x1f, 0xe8, 0x77, 0xfc, 0x50, 0xfb, 0x76, 0x35, 0xfa, 0xcb, + 0xfc, 0x7a, 0x2f, 0x7b, 0x36, 0x59, 0x73, 0xef, 0x59, 0x7f, 0x48, 0x8e, + 0x5d, 0xc5, 0x97, 0xed, 0x8f, 0x51, 0x25, 0x94, 0x2a, 0x27, 0xe6, 0x33, + 0xd0, 0xc1, 0x16, 0x5f, 0x81, 0xed, 0xcc, 0xf2, 0xcb, 0xc3, 0x31, 0x56, + 0x54, 0x1e, 0x46, 0x15, 0xdf, 0xcf, 0xd1, 0x34, 0xff, 0xac, 0xbd, 0xaf, + 0xc4, 0x59, 0x7f, 0xf1, 0xfa, 0x3d, 0xce, 0xb9, 0xf4, 0x0b, 0x2a, 0x0f, + 0x89, 0xc7, 0xef, 0x88, 0x81, 0x25, 0x97, 0xf8, 0x81, 0xcc, 0x64, 0x05, + 0x65, 0xff, 0xbb, 0x1a, 0xfc, 0xb1, 0xa7, 0xfd, 0x65, 0xec, 0xc9, 0x96, + 0x5b, 0x05, 0x44, 0x77, 0x4c, 0xbf, 0x40, 0xbd, 0x1f, 0x34, 0xb2, 0xfd, + 0xa0, 0x31, 0xc9, 0x65, 0x78, 0xf1, 0x40, 0x3d, 0x7c, 0xc8, 0xcd, 0x96, + 0x5f, 0xb3, 0x79, 0x47, 0xcb, 0x28, 0xcf, 0x2f, 0x84, 0x57, 0xd0, 0x5e, + 0x0a, 0xca, 0x1a, 0xe0, 0x4e, 0x43, 0x63, 0x50, 0x86, 0x61, 0x07, 0x61, + 0x22, 0xe4, 0x05, 0x0a, 0xfe, 0x3e, 0x79, 0xb7, 0x70, 0x86, 0xfd, 0xb9, + 0xdc, 0xfd, 0xd6, 0x5f, 0xef, 0xc4, 0xc2, 0x1f, 0x61, 0x65, 0x42, 0x60, + 0x2c, 0x85, 0x13, 0x95, 0xdf, 0xdc, 0xc6, 0x1f, 0x61, 0x65, 0xef, 0xa5, + 0xc5, 0x95, 0xf1, 0xe5, 0x68, 0xb2, 0xf7, 0x3f, 0x69, 0x65, 0xf7, 0xdc, + 0x8f, 0x96, 0x5f, 0xcf, 0x2f, 0x72, 0x05, 0x59, 0x69, 0x19, 0xe9, 0x30, + 0x92, 0xa1, 0x17, 0x78, 0x46, 0xee, 0x37, 0xfe, 0x36, 0x8b, 0x35, 0xce, + 0xe0, 0x56, 0x5f, 0x01, 0xf5, 0x25, 0x97, 0xd0, 0x06, 0xdf, 0x12, 0x5f, + 0xa5, 0x3d, 0xa6, 0x9a, 0x59, 0x44, 0x7a, 0x80, 0x26, 0xbe, 0x7f, 0x33, + 0xcb, 0x2f, 0xdc, 0xd4, 0x38, 0x56, 0x5f, 0xa0, 0x83, 0x1b, 0xd6, 0x56, + 0x1e, 0x7f, 0x49, 0xe8, 0x69, 0x94, 0xe3, 0xb7, 0xe4, 0x3e, 0x71, 0xbf, + 0xdf, 0x96, 0x6f, 0xd1, 0xf1, 0x65, 0xfe, 0x10, 0x89, 0xda, 0x7e, 0xac, + 0xa8, 0x66, 0x6b, 0xe1, 0xf7, 0xca, 0x07, 0x18, 0x0e, 0x93, 0x59, 0x0d, + 0x07, 0x8e, 0x2b, 0xf9, 0xd2, 0xe2, 0x8c, 0xe7, 0x85, 0xa0, 0x8d, 0x9f, + 0x79, 0xf3, 0x46, 0xb7, 0x9b, 0xb6, 0xe2, 0xd8, 0x59, 0x7a, 0x44, 0xeb, + 0x2d, 0xf3, 0x76, 0x78, 0xf0, 0x59, 0x7e, 0x6f, 0x89, 0x6a, 0x16, 0x5e, + 0xf3, 0xfe, 0xb2, 0xfe, 0x8d, 0x6d, 0x1a, 0xd9, 0x65, 0xff, 0xa0, 0xbd, + 0xd0, 0x3c, 0xa5, 0x0b, 0x2f, 0xc0, 0xff, 0x08, 0x2b, 0x2f, 0x6a, 0x26, + 0x59, 0x78, 0x9e, 0x65, 0x97, 0xee, 0x34, 0xff, 0x71, 0x65, 0x19, 0xe3, + 0x38, 0xe5, 0xff, 0x8a, 0x05, 0xeb, 0xf8, 0x4c, 0xfd, 0x65, 0xee, 0x6b, + 0x16, 0x5e, 0x2c, 0x92, 0xcb, 0xf6, 0xbf, 0x20, 0x7e, 0xb2, 0xa0, 0xf1, + 0x70, 0x6e, 0x8d, 0x10, 0x3c, 0x61, 0xb6, 0xea, 0xcb, 0xfb, 0x04, 0x89, + 0x8f, 0x8b, 0x28, 0x8f, 0x0b, 0xc2, 0x95, 0x0a, 0xa9, 0x36, 0x2a, 0x90, + 0xe8, 0xcb, 0xf4, 0x7a, 0xc2, 0x8e, 0xb1, 0x91, 0x07, 0xa1, 0x83, 0xbd, + 0x92, 0xff, 0xa0, 0xfb, 0x0c, 0xdb, 0x1a, 0x59, 0x7f, 0xee, 0x41, 0x8c, + 0xa2, 0x47, 0xfa, 0xcb, 0xf7, 0x4f, 0x67, 0x25, 0x97, 0xe0, 0x0a, 0xe5, + 0xfa, 0xcb, 0xfb, 0x9a, 0x8c, 0x19, 0xac, 0xa8, 0x3f, 0xce, 0x93, 0xef, + 0x29, 0xbf, 0xed, 0x8b, 0x25, 0xdc, 0xff, 0x8b, 0x2f, 0xfd, 0x85, 0xf4, + 0xb9, 0xa0, 0x47, 0xeb, 0x2f, 0xd9, 0xee, 0x60, 0xab, 0x28, 0xcf, 0xa1, + 0x88, 0x17, 0xfe, 0xd7, 0x5a, 0x71, 0xef, 0xf6, 0x05, 0x65, 0xfb, 0xd3, + 0xbb, 0x8d, 0xeb, 0x29, 0xcf, 0xbc, 0x90, 0xaf, 0x0e, 0x37, 0xac, 0xbf, + 0xfc, 0x45, 0x0d, 0x0c, 0xa3, 0xe9, 0x19, 0x2c, 0xbf, 0x33, 0x3a, 0xed, + 0xeb, 0x2b, 0x0f, 0xc8, 0xd2, 0x2f, 0xff, 0x3c, 0xe9, 0xa5, 0x1a, 0xda, + 0x73, 0x59, 0xd5, 0x95, 0x09, 0x90, 0x8c, 0x83, 0xb0, 0x90, 0x22, 0x0b, + 0xfe, 0x67, 0x73, 0xd8, 0x0d, 0x6c, 0xb2, 0xff, 0xef, 0x70, 0xca, 0x68, + 0x0e, 0xb3, 0xe5, 0x97, 0xe1, 0x8a, 0x28, 0x3e, 0x59, 0x61, 0x5c, 0xfc, + 0x40, 0x8b, 0x7f, 0xd1, 0xec, 0xd0, 0x5d, 0xc2, 0xa8, 0xbe, 0x17, 0xec, + 0xd4, 0x7d, 0x25, 0x97, 0x43, 0x02, 0x7d, 0x9e, 0x44, 0xbf, 0xe7, 0x17, + 0x87, 0xc3, 0xfb, 0xcb, 0x2b, 0xa7, 0xce, 0x45, 0xb7, 0xff, 0xe2, 0x0c, + 0xee, 0xc1, 0xe8, 0xd8, 0x7b, 0x90, 0xc5, 0x97, 0x9f, 0x5b, 0x2a, 0x2f, + 0xf5, 0x42, 0x28, 0xf0, 0x84, 0x2b, 0x17, 0xde, 0xf1, 0xb4, 0xb2, 0xff, + 0x6b, 0x59, 0x33, 0x23, 0x8b, 0x2f, 0xf9, 0xfd, 0xc3, 0x2f, 0xa4, 0xc5, + 0x97, 0xfd, 0x19, 0xa9, 0xd2, 0x3f, 0xa4, 0xb2, 0xa4, 0x8c, 0xbc, 0x23, + 0xfc, 0xd3, 0xc7, 0x37, 0xff, 0xfb, 0xaf, 0xc3, 0x8e, 0x4e, 0xf7, 0x71, + 0x98, 0x17, 0xd2, 0xcb, 0xa1, 0xbd, 0x65, 0xf7, 0x38, 0xec, 0x59, 0x5d, + 0x44, 0xe7, 0xec, 0x3e, 0x19, 0xbf, 0xdf, 0x78, 0x4e, 0xf7, 0x37, 0x56, + 0x5f, 0xb0, 0xf6, 0x81, 0x56, 0x5b, 0x6c, 0x3e, 0x1e, 0x9c, 0xdf, 0x7d, + 0x2f, 0x3a, 0xcb, 0xff, 0xe1, 0x87, 0xa6, 0x59, 0xbd, 0xe5, 0xc3, 0x1a, + 0xcb, 0xfb, 0x9e, 0x28, 0xcf, 0x96, 0x56, 0x22, 0x81, 0xc8, 0xc0, 0xa1, + 0x7e, 0xff, 0x9e, 0xce, 0xac, 0xbf, 0x9a, 0xf6, 0x76, 0x58, 0xb2, 0xa0, + 0xf5, 0xdc, 0xa6, 0xa1, 0x36, 0xd9, 0x43, 0x20, 0xa1, 0x0b, 0x7f, 0x4e, + 0x1e, 0x67, 0xfc, 0x59, 0x7f, 0xfe, 0xf6, 0x6b, 0x63, 0xe1, 0xef, 0xe9, + 0xe7, 0xde, 0x59, 0x68, 0x62, 0x22, 0x08, 0xc2, 0xf8, 0xd9, 0xad, 0x96, + 0x5f, 0xfb, 0xd1, 0xce, 0x41, 0xec, 0xfe, 0x59, 0x7f, 0xc7, 0x84, 0x31, + 0x4f, 0x34, 0xb2, 0x8d, 0x17, 0xfa, 0x27, 0xf1, 0x1b, 0x79, 0xf5, 0xef, + 0x67, 0xcb, 0x2f, 0xe7, 0xd7, 0xd2, 0xcf, 0x2c, 0xbf, 0xf7, 0xb8, 0x7a, + 0xf1, 0x01, 0xe4, 0xb2, 0xff, 0xfc, 0x7c, 0xc1, 0xf7, 0x3c, 0x79, 0xcd, + 0xb1, 0xa5, 0x97, 0xff, 0x99, 0x1b, 0x98, 0x02, 0xcc, 0xdf, 0x1f, 0x2c, + 0xbf, 0xf4, 0x66, 0xb3, 0x5f, 0xb0, 0xf8, 0xb2, 0xf3, 0xfc, 0xde, 0xb2, + 0xfe, 0x7f, 0x72, 0x33, 0x65, 0x95, 0x09, 0xcc, 0xe1, 0x70, 0x4f, 0x8d, + 0x54, 0x93, 0x77, 0x9f, 0x34, 0x41, 0x7f, 0x47, 0xef, 0xf4, 0xb1, 0x65, + 0xff, 0x02, 0x19, 0xcc, 0x64, 0x6e, 0xac, 0xbf, 0xf6, 0xb6, 0xc1, 0xe7, + 0x7b, 0x9b, 0xab, 0x2c, 0x2a, 0xcb, 0xfd, 0xee, 0x09, 0xbe, 0x33, 0xe5, + 0x96, 0xc8, 0x3c, 0x92, 0x12, 0xac, 0x45, 0x87, 0x21, 0x17, 0x7f, 0x71, + 0xe4, 0x50, 0xc5, 0x97, 0x8a, 0x37, 0x56, 0x5f, 0xff, 0x4a, 0x35, 0xb7, + 0x8c, 0x5e, 0x71, 0xca, 0x4b, 0x2f, 0xed, 0xb9, 0x8c, 0x8d, 0xd5, 0x95, + 0x32, 0x20, 0x84, 0x51, 0xad, 0x23, 0xc7, 0x85, 0x8d, 0x42, 0x82, 0xf1, + 0xf4, 0xd6, 0x5c, 0x39, 0x2c, 0xbc, 0x59, 0x25, 0x96, 0x96, 0x8d, 0x97, + 0x85, 0xef, 0x99, 0xe3, 0xd9, 0x65, 0x61, 0xe5, 0x19, 0x3d, 0xff, 0xdb, + 0xfc, 0x2c, 0x14, 0xb3, 0xa6, 0xc5, 0x97, 0x6d, 0xe5, 0x97, 0xfb, 0x7f, + 0x5e, 0x51, 0x84, 0xb2, 0xa0, 0xf2, 0xf0, 0x62, 0xff, 0xfd, 0x2e, 0xc6, + 0x9f, 0xc0, 0xf1, 0xfb, 0x9d, 0x35, 0x97, 0xf6, 0x34, 0x27, 0x5f, 0xcb, + 0x2f, 0xe9, 0x33, 0xc4, 0x09, 0x96, 0x5f, 0xff, 0x09, 0x28, 0xde, 0x65, + 0xfe, 0x8e, 0x19, 0x89, 0x2b, 0x48, 0x80, 0xf1, 0x7d, 0xf7, 0x44, 0xfb, + 0xcb, 0x2f, 0xd8, 0xcc, 0x3d, 0xeb, 0x2f, 0x6d, 0x36, 0xea, 0xcb, 0x34, + 0xb2, 0xa1, 0x3a, 0x8d, 0x95, 0x72, 0x15, 0xe1, 0x23, 0x32, 0x50, 0x14, + 0x6e, 0x11, 0x5d, 0xec, 0x59, 0x7e, 0xd1, 0xec, 0xec, 0x54, 0xc2, 0x6b, + 0xef, 0x02, 0x1d, 0x53, 0x09, 0xae, 0xfe, 0x15, 0x40, 0x9a, 0xff, 0x13, + 0x8b, 0xe8, 0xd7, 0xea, 0xa0, 0x4d, 0x7f, 0xb9, 0x9d, 0x3e, 0x03, 0x65, + 0x4c, 0x26, 0xbb, 0x06, 0xa9, 0x84, 0xd7, 0x34, 0xd2, 0xe6, 0x13, 0x56, + 0x26, 0xa5, 0xf1, 0xa9, 0x97, 0x30, 0x93, 0x88, 0x3b, 0xd0, 0x5a, 0x23, + 0xb7, 0x93, 0x30, 0x99, 0x3c, 0xf9, 0xeb, 0xe5, 0x40, 0x2d, 0x47, 0x9f, + 0x7d, 0x83, 0x01, 0x2c, 0xa3, 0x3c, 0xe7, 0x2d, 0xa8, 0x5e, 0x20, 0x33, + 0x6e, 0xc2, 0x5d, 0xc8, 0x0a, 0x12, 0x3c, 0x8f, 0x23, 0xd2, 0xae, 0xaf, + 0x9f, 0x7e, 0x34, 0xb2, 0xff, 0xfd, 0xd7, 0x97, 0x62, 0x0f, 0xdc, 0x32, + 0xfa, 0x4b, 0x2f, 0x17, 0xec, 0x59, 0x7f, 0xd0, 0x0f, 0x11, 0xef, 0x11, + 0x8b, 0x2e, 0xce, 0x61, 0xec, 0x68, 0x76, 0xb4, 0x8f, 0xc7, 0x24, 0x28, + 0x56, 0x5f, 0x61, 0xe8, 0x55, 0x97, 0x6d, 0xa5, 0x97, 0x7f, 0x32, 0xcb, + 0xff, 0x99, 0x34, 0x9c, 0xb6, 0x1c, 0x16, 0xcb, 0x2a, 0x0f, 0xdc, 0x63, + 0x18, 0x33, 0x7c, 0x7d, 0x76, 0x2c, 0xbe, 0xd4, 0x73, 0x65, 0x95, 0xe3, + 0xc4, 0x10, 0x86, 0xa1, 0xb7, 0xae, 0xda, 0x14, 0x43, 0x8e, 0xc7, 0x10, + 0x45, 0x85, 0x58, 0x63, 0x9e, 0xfa, 0x1f, 0x27, 0x0d, 0x99, 0xa3, 0xff, + 0xd4, 0x70, 0x0c, 0x3f, 0xec, 0x76, 0xdf, 0xb2, 0x11, 0x77, 0x21, 0xd7, + 0xe9, 0xf3, 0x8d, 0xf1, 0xbb, 0x6e, 0x19, 0x89, 0x09, 0x96, 0xf7, 0x1b, + 0xed, 0x99, 0xee, 0x2c, 0xbe, 0x94, 0x61, 0x2c, 0xbf, 0xb2, 0x44, 0x07, + 0xe2, 0xcb, 0xef, 0xb8, 0x70, 0xb2, 0xff, 0x61, 0x37, 0xf8, 0xc8, 0x55, + 0x95, 0xa4, 0x41, 0xf4, 0xb3, 0xf2, 0x2b, 0xec, 0xd1, 0x8a, 0xb2, 0xf3, + 0x5b, 0x31, 0x65, 0x41, 0xf9, 0x0c, 0xc7, 0x08, 0xaf, 0xee, 0xc0, 0x85, + 0xf7, 0xeb, 0x2f, 0x37, 0x38, 0xde, 0xb2, 0xf6, 0x63, 0x4b, 0x2e, 0x31, + 0x56, 0x56, 0xc6, 0xcc, 0xc7, 0x2f, 0xde, 0xc9, 0x8d, 0x8b, 0x2f, 0xd1, + 0xf7, 0xff, 0xc2, 0xca, 0x83, 0xd2, 0x22, 0x8b, 0xf4, 0x6f, 0x82, 0xf2, + 0xcb, 0xf1, 0xef, 0xf1, 0xec, 0xb2, 0xff, 0xcc, 0x23, 0x16, 0x3d, 0xc3, + 0xd2, 0xcb, 0xe9, 0x7b, 0x02, 0xb2, 0xb0, 0xf8, 0x1c, 0xfa, 0xff, 0xba, + 0xf2, 0x89, 0x8a, 0x18, 0xb2, 0xfc, 0x58, 0x26, 0x4c, 0xb2, 0xff, 0xf8, + 0x82, 0x6c, 0x18, 0x1f, 0x52, 0xcf, 0xbc, 0xb2, 0xff, 0xce, 0x5f, 0xfd, + 0xed, 0x46, 0x34, 0xb2, 0xff, 0xdc, 0xe9, 0xce, 0xfa, 0x51, 0x9b, 0x2c, + 0xb6, 0x6e, 0xa2, 0x0b, 0xf4, 0x0b, 0xfe, 0xeb, 0xb3, 0xa7, 0x1f, 0x49, + 0x65, 0xf8, 0xba, 0xee, 0xc5, 0x97, 0xe2, 0x96, 0xe3, 0xec, 0xb2, 0xa0, + 0xf4, 0x44, 0x26, 0xa8, 0x4e, 0xaa, 0x50, 0xd2, 0x32, 0xcf, 0xe1, 0x15, + 0x5b, 0x2b, 0x43, 0x19, 0x00, 0x4a, 0x35, 0x08, 0xae, 0x90, 0x11, 0xc7, + 0xa3, 0xd2, 0xbf, 0xdd, 0xfa, 0x5c, 0xee, 0x6c, 0xb2, 0xff, 0x9f, 0xb3, + 0x19, 0x77, 0x3e, 0x59, 0x50, 0x7d, 0xf8, 0x6d, 0x7f, 0x7f, 0x34, 0xa3, + 0xdc, 0x59, 0x7f, 0xff, 0xfd, 0xdc, 0x2f, 0xf0, 0xbd, 0xdc, 0xec, 0x64, + 0xc7, 0xa9, 0xba, 0x7f, 0x79, 0x65, 0xfe, 0x66, 0x8c, 0x3d, 0xc9, 0x96, + 0x56, 0x22, 0xc9, 0xdf, 0xaf, 0x8a, 0x31, 0xa5, 0x97, 0xd1, 0xf7, 0x1d, + 0x65, 0x43, 0xa2, 0xb2, 0xda, 0x12, 0x72, 0x39, 0x1c, 0x2e, 0x72, 0xb7, + 0xde, 0x0c, 0x6c, 0xdf, 0x12, 0x1c, 0x62, 0xbb, 0xa5, 0xb3, 0x18, 0x69, + 0x5d, 0xe5, 0xdb, 0x14, 0x38, 0x3c, 0x40, 0x08, 0x71, 0x6f, 0x21, 0x10, + 0x86, 0xff, 0xf8, 0xcb, 0x19, 0x02, 0x10, 0x24, 0x58, 0xc5, 0x97, 0xfc, + 0x33, 0xc2, 0x04, 0xb3, 0x8b, 0x2f, 0xfb, 0x5a, 0x80, 0xf7, 0xe7, 0xdd, + 0x59, 0x78, 0xa3, 0x8b, 0x2f, 0xb0, 0xb1, 0x8b, 0x29, 0x65, 0x41, 0xe3, + 0x48, 0x6c, 0x04, 0x17, 0xf0, 0x40, 0xe3, 0x64, 0x2c, 0xbf, 0xee, 0x9c, + 0xba, 0xf2, 0x36, 0x2c, 0xbf, 0xf7, 0x0c, 0xbe, 0x97, 0x8f, 0x86, 0xb2, + 0xb0, 0xfd, 0xbc, 0x71, 0x7f, 0x3f, 0xbb, 0x00, 0x6d, 0xac, 0xbf, 0xf1, + 0xb3, 0x07, 0xd3, 0xe1, 0x62, 0xcb, 0xe6, 0x40, 0xe1, 0x65, 0x11, 0xee, + 0xf0, 0xf2, 0xa4, 0xaa, 0xa3, 0x13, 0x4c, 0xde, 0x68, 0x41, 0xe8, 0xb9, + 0x90, 0xa3, 0x22, 0x1f, 0x42, 0x3a, 0xfb, 0xb9, 0xfb, 0xac, 0xbe, 0x28, + 0xd4, 0x96, 0x5f, 0xf7, 0x62, 0x46, 0x44, 0x0f, 0x96, 0x5f, 0xf4, 0x48, + 0xfd, 0x28, 0x2f, 0xd6, 0x5f, 0xf4, 0x67, 0x84, 0xff, 0xf8, 0xf9, 0x65, + 0xec, 0x21, 0x56, 0x5b, 0x50, 0x8e, 0x9c, 0x21, 0xd1, 0xc3, 0x0e, 0x1b, + 0x67, 0x97, 0xf1, 0x40, 0x75, 0x12, 0x59, 0x7f, 0xf9, 0xcf, 0xd2, 0x01, + 0x7b, 0x9d, 0x79, 0x2c, 0x10, 0xd6, 0x5d, 0x1d, 0x59, 0x5d, 0x3f, 0x0d, + 0xeb, 0x57, 0xfe, 0xe0, 0x9e, 0x32, 0x04, 0xb3, 0x8b, 0x2e, 0x1f, 0x16, + 0x56, 0xe9, 0xfd, 0x74, 0x90, 0x8f, 0xef, 0xff, 0xec, 0xfb, 0x38, 0xe5, + 0xd3, 0x8f, 0x74, 0x0e, 0xc5, 0x95, 0x39, 0x57, 0xec, 0x46, 0x16, 0xf1, + 0xb4, 0x11, 0x8d, 0xf8, 0x0c, 0x3e, 0xc2, 0xcb, 0xf6, 0x68, 0x31, 0x8b, + 0x28, 0x8f, 0x34, 0x42, 0x7b, 0xfe, 0xc6, 0x66, 0x8f, 0x67, 0x62, 0xcb, + 0xff, 0x9d, 0x85, 0x1f, 0x6e, 0x0b, 0xec, 0xea, 0xcb, 0xff, 0xf3, 0x97, + 0x9d, 0xfa, 0x51, 0xee, 0x35, 0x9d, 0x59, 0x7f, 0x84, 0xd6, 0x6f, 0x82, + 0x92, 0xcb, 0xff, 0x99, 0xc7, 0x96, 0xa3, 0x90, 0x5b, 0x2c, 0xbf, 0xe8, + 0xf7, 0x71, 0x99, 0xac, 0x59, 0x7e, 0xf7, 0x4e, 0x38, 0xb2, 0xf6, 0xce, + 0x5a, 0x3d, 0xee, 0x1b, 0xdf, 0xf4, 0x7f, 0xc1, 0x81, 0xf5, 0x25, 0x97, + 0xb5, 0xce, 0x2e, 0x20, 0x35, 0xf0, 0x5d, 0xc2, 0xa8, 0x80, 0xd3, 0xcd, + 0x55, 0xb2, 0x48, 0xa4, 0xd3, 0x25, 0xff, 0x47, 0x42, 0x7c, 0x73, 0xd9, + 0x65, 0xdd, 0x89, 0xc7, 0xc1, 0xa2, 0x8b, 0x9f, 0xf5, 0x96, 0xd4, 0x1e, + 0x37, 0x8b, 0xeb, 0x15, 0x23, 0x3c, 0x28, 0x84, 0x8d, 0xf6, 0x86, 0xae, + 0x2b, 0xa7, 0x1f, 0xa4, 0x12, 0x9f, 0xa5, 0x3d, 0xdf, 0x0f, 0xb1, 0xb8, + 0xb2, 0xff, 0xfe, 0x31, 0x96, 0x72, 0x35, 0x3b, 0x9d, 0x71, 0xc0, 0xd6, + 0x5e, 0xdf, 0x1d, 0x59, 0x58, 0xb9, 0x3a, 0x72, 0xeb, 0x1d, 0x4f, 0x84, + 0xa2, 0x2d, 0xdc, 0xff, 0x2c, 0xbd, 0xd7, 0xdd, 0x59, 0x7d, 0x1f, 0xee, + 0x62, 0xcb, 0xe6, 0x31, 0xfc, 0xb2, 0x98, 0x7f, 0xbf, 0x8b, 0xf8, 0x7c, + 0x42, 0x5b, 0xfb, 0x1b, 0xdd, 0xfb, 0xc5, 0x97, 0xc5, 0xef, 0xc0, 0xb2, + 0xfc, 0xc6, 0xed, 0xbb, 0x6e, 0xdb, 0xa5, 0x97, 0xff, 0xf4, 0xb3, 0x87, + 0xad, 0x1b, 0x04, 0xf7, 0x71, 0xaf, 0x2c, 0xac, 0x45, 0xe9, 0x91, 0xb9, + 0xed, 0xfb, 0x6e, 0xbf, 0x61, 0x65, 0xff, 0xd8, 0x5e, 0xc2, 0x96, 0x70, + 0x46, 0x2c, 0xa7, 0x3e, 0xb6, 0x8a, 0x2f, 0xff, 0x4b, 0x3e, 0x90, 0x91, + 0xfc, 0xf6, 0x9a, 0x69, 0x25, 0xf9, 0x8d, 0x61, 0xef, 0x59, 0x7a, 0x58, + 0x53, 0x1f, 0xe8, 0x8a, 0x75, 0x08, 0xd3, 0x78, 0x4f, 0xdf, 0xff, 0x9f, + 0x52, 0x1f, 0x63, 0x85, 0x8d, 0x3e, 0x85, 0x59, 0x50, 0xac, 0x44, 0x67, + 0xdd, 0x87, 0x61, 0x46, 0xd6, 0x02, 0x6b, 0xfe, 0x32, 0x97, 0x1b, 0x5b, + 0x74, 0xdd, 0xb7, 0x4b, 0x2f, 0xa6, 0xe6, 0x4c, 0xb2, 0xfd, 0xfc, 0x7b, + 0x37, 0x56, 0x5f, 0xe8, 0xcd, 0x05, 0xdc, 0x2a, 0x88, 0x25, 0x7f, 0xd1, + 0xec, 0xd0, 0x5d, 0xc2, 0xa8, 0xbe, 0x57, 0xe7, 0x1f, 0x60, 0x55, 0x97, + 0xff, 0xfd, 0x87, 0xac, 0x1f, 0x63, 0xe9, 0x6a, 0x3d, 0xc1, 0x0a, 0x4b, + 0x2f, 0x16, 0x70, 0x69, 0x88, 0x84, 0xf9, 0x88, 0x84, 0x51, 0x44, 0x9c, + 0x4e, 0xf8, 0xcf, 0x2f, 0xfe, 0x8e, 0x98, 0xb9, 0xad, 0x98, 0x0f, 0x96, + 0x5f, 0xf0, 0xf5, 0x8c, 0xc9, 0x38, 0xd6, 0x56, 0x2a, 0x57, 0x38, 0xeb, + 0x7a, 0x56, 0xe8, 0xf7, 0xe9, 0x67, 0xe2, 0x79, 0x65, 0xfd, 0xdd, 0xce, + 0x98, 0x7a, 0xb2, 0x9c, 0xf6, 0xc0, 0x55, 0x7f, 0xef, 0x43, 0x39, 0x07, + 0xb3, 0xf9, 0x65, 0xff, 0xb6, 0x7f, 0xb7, 0x33, 0xc4, 0xfb, 0xd6, 0x5f, + 0xff, 0x67, 0xa0, 0xbd, 0xcc, 0xc1, 0x45, 0x79, 0x2c, 0xbf, 0x85, 0xcf, + 0x7b, 0x06, 0xb2, 0xff, 0xd8, 0x38, 0x94, 0x77, 0x3f, 0x75, 0x97, 0xf3, + 0xc8, 0x12, 0x71, 0xac, 0xbf, 0xba, 0x7b, 0x73, 0x8e, 0xb2, 0xf3, 0x4d, + 0x34, 0x92, 0xfd, 0xdc, 0x0b, 0xe9, 0x24, 0xf3, 0x41, 0x7f, 0xff, 0xa6, + 0xd4, 0x6f, 0x9c, 0x2b, 0xce, 0x12, 0x6e, 0x4e, 0xcf, 0xbc, 0xb2, 0xa1, + 0x1e, 0xde, 0x4e, 0x10, 0xe6, 0xff, 0xf1, 0xe8, 0xfc, 0x0c, 0xf3, 0xb3, + 0x09, 0x65, 0x6c, 0xaa, 0x60, 0x28, 0x9a, 0x4f, 0x61, 0x77, 0xe7, 0xa5, + 0x19, 0x1f, 0x8c, 0x29, 0x65, 0x2c, 0xba, 0x5c, 0x68, 0xb6, 0x6f, 0x0b, + 0xbf, 0xf3, 0x23, 0xee, 0x16, 0x6c, 0x24, 0x96, 0x5f, 0xff, 0xe3, 0xeb, + 0x97, 0xd2, 0x12, 0x50, 0x52, 0x76, 0x60, 0xd6, 0x5f, 0xfe, 0xcc, 0xe8, + 0xfb, 0x1c, 0xce, 0x9f, 0xeb, 0x2f, 0xd3, 0x4a, 0x35, 0xc5, 0x97, 0xfb, + 0x08, 0x12, 0xe6, 0xce, 0xb2, 0xc2, 0xce, 0x3d, 0xc1, 0x94, 0xd4, 0x27, + 0x43, 0xb1, 0x84, 0x90, 0x46, 0xc0, 0x70, 0xa5, 0xbe, 0x9c, 0x7d, 0x02, + 0xcb, 0xf6, 0x4b, 0xb1, 0xa5, 0x94, 0x13, 0xcb, 0xdd, 0x24, 0xbf, 0xde, + 0x83, 0xe8, 0xb1, 0xf2, 0xcb, 0xff, 0xbd, 0xc7, 0x97, 0x30, 0x30, 0xc3, + 0x59, 0x7f, 0xfb, 0xe2, 0x9c, 0x1e, 0x9f, 0xff, 0xc6, 0xa4, 0xb2, 0xa1, + 0x1d, 0x66, 0x4a, 0x03, 0x41, 0x10, 0xef, 0xfd, 0xb7, 0xd0, 0x6c, 0xc2, + 0xcd, 0xd5, 0x97, 0xf1, 0xf3, 0x06, 0x26, 0x2c, 0xbf, 0x37, 0x99, 0x66, + 0xf5, 0x97, 0xf6, 0x0c, 0xc0, 0x1e, 0x84, 0xf6, 0x1c, 0xb6, 0xfe, 0xe4, + 0x8d, 0x8f, 0x25, 0x95, 0xa3, 0xf0, 0xfd, 0x0e, 0xff, 0x70, 0xb3, 0x7f, + 0x5e, 0x4b, 0x2f, 0x72, 0x5b, 0xd6, 0x51, 0x9e, 0x9e, 0xe9, 0xa5, 0xff, + 0xe8, 0xd8, 0x4e, 0xc7, 0xde, 0xcd, 0x88, 0x6b, 0x2b, 0x13, 0xf0, 0x38, + 0xc2, 0x5d, 0xd8, 0x89, 0x2f, 0xff, 0x75, 0xe5, 0x83, 0x23, 0x7e, 0xc3, + 0x16, 0x5f, 0xe8, 0xc2, 0xf3, 0x61, 0xa0, 0xac, 0xbf, 0xdd, 0xcd, 0xf3, + 0xb9, 0x20, 0xac, 0xae, 0x1f, 0x7f, 0x8d, 0xeb, 0xc8, 0xd8, 0x04, 0x2d, + 0xaf, 0xe2, 0x9c, 0x26, 0xba, 0xeb, 0x2f, 0xfc, 0x07, 0x94, 0xe8, 0x31, + 0xe3, 0x16, 0x53, 0x9f, 0x79, 0x18, 0x5f, 0xfb, 0x47, 0xfe, 0xdd, 0x8e, + 0x03, 0x8b, 0x2f, 0xd9, 0xa7, 0xf9, 0xa5, 0x96, 0x92, 0xcb, 0xff, 0xf3, + 0x45, 0x83, 0xd1, 0x83, 0x61, 0xf6, 0x0b, 0x65, 0x96, 0xda, 0x0f, 0xa3, + 0x04, 0x6b, 0x64, 0x5c, 0x72, 0x12, 0x37, 0xfa, 0x62, 0x76, 0xbd, 0x9d, + 0x59, 0x7b, 0xb8, 0x15, 0x97, 0x9a, 0x69, 0xa4, 0x97, 0xf7, 0xf0, 0x59, + 0xf7, 0x92, 0x4f, 0x34, 0x15, 0x39, 0x16, 0x1b, 0x86, 0x82, 0x1e, 0x5f, + 0xff, 0xcd, 0xb9, 0xc1, 0xe9, 0x8c, 0x78, 0xd4, 0xef, 0x73, 0x36, 0x59, + 0x5d, 0x44, 0xe0, 0x0d, 0xaa, 0x15, 0x48, 0x9c, 0x3e, 0x5e, 0x37, 0x5b, + 0xfe, 0x12, 0x39, 0x8d, 0x08, 0x5e, 0x59, 0x5b, 0x36, 0x1c, 0x72, 0x95, + 0x4a, 0x38, 0x4e, 0xfc, 0x42, 0x72, 0xb5, 0xb5, 0x28, 0x91, 0x91, 0xc2, + 0xf6, 0x51, 0x61, 0x46, 0x31, 0xc8, 0x4b, 0xfa, 0x55, 0x88, 0x87, 0x57, + 0xfe, 0xc3, 0x2d, 0x9c, 0xbd, 0x8c, 0x59, 0x7f, 0xf0, 0xa2, 0x78, 0xf8, + 0x59, 0xbc, 0xc6, 0xb2, 0xfe, 0x2c, 0x1f, 0x5d, 0xa5, 0x95, 0xa3, 0xf4, + 0x62, 0x3d, 0xe2, 0x76, 0x2c, 0xbf, 0x87, 0xdc, 0xf6, 0xe6, 0x2c, 0xb1, + 0xf4, 0xf2, 0xda, 0x1b, 0xa8, 0x44, 0xaf, 0x5b, 0x6f, 0x89, 0xfe, 0xf2, + 0xcb, 0xd8, 0x5f, 0xac, 0xbe, 0xcf, 0x4d, 0x25, 0x97, 0xff, 0x37, 0x94, + 0x37, 0xf1, 0xc8, 0x4f, 0xf8, 0xb2, 0xba, 0x7d, 0xce, 0x47, 0x7f, 0xec, + 0xf4, 0x6b, 0x9d, 0x82, 0xf2, 0xe2, 0x08, 0x5f, 0xd9, 0xa0, 0xbb, 0x85, + 0x51, 0x04, 0x27, 0x9e, 0x55, 0xe8, 0x19, 0xac, 0xa8, 0x3e, 0x7e, 0x26, + 0x5d, 0xbc, 0x6b, 0x2f, 0x6f, 0x86, 0x2c, 0xbf, 0x6d, 0x9a, 0x89, 0x2c, + 0xbe, 0xd6, 0x8d, 0xa5, 0x96, 0x76, 0x1e, 0x5f, 0x4a, 0x2f, 0xed, 0xd1, + 0xb4, 0xe5, 0x25, 0x95, 0xb2, 0x36, 0xb0, 0x64, 0x9a, 0x40, 0x4f, 0x7f, + 0xfa, 0x69, 0x19, 0x7a, 0x3f, 0x98, 0x8e, 0x65, 0x97, 0x14, 0xcb, 0x2d, + 0x03, 0x3e, 0x3c, 0x4c, 0xad, 0x95, 0x9f, 0x0a, 0x45, 0xd8, 0x45, 0x7f, + 0x0d, 0x22, 0x87, 0xde, 0xf8, 0x4f, 0xdf, 0xdd, 0xcf, 0x78, 0xd8, 0xb2, + 0xfe, 0xf0, 0x99, 0xd7, 0xf9, 0x65, 0x7c, 0x7b, 0x84, 0x5b, 0x7f, 0xc5, + 0xb6, 0x6b, 0xf2, 0x07, 0xeb, 0x2f, 0xec, 0xfb, 0xda, 0xd4, 0x2c, 0xbf, + 0xfb, 0x84, 0xfe, 0x76, 0x09, 0x1b, 0x62, 0xca, 0x19, 0xf9, 0x70, 0xba, + 0xa1, 0x1e, 0x26, 0x44, 0x08, 0x56, 0xdf, 0xd8, 0x11, 0x37, 0xf7, 0x16, + 0x59, 0x8b, 0x2f, 0xf4, 0x78, 0x7d, 0x03, 0xf1, 0x60, 0x85, 0x8d, 0xff, + 0xfc, 0x64, 0x3d, 0x60, 0x7b, 0x1d, 0xcd, 0x6a, 0x05, 0x59, 0x74, 0x0a, + 0xb2, 0xff, 0x66, 0x8f, 0xf6, 0x3c, 0x96, 0x5c, 0x64, 0xb2, 0xcd, 0x2c, + 0xa1, 0x9a, 0x71, 0x05, 0x6f, 0x10, 0x36, 0x59, 0x7b, 0x62, 0x85, 0x97, + 0xee, 0xbc, 0xb0, 0x96, 0x5f, 0xc7, 0xe2, 0xce, 0x9a, 0xcb, 0xb3, 0xb3, + 0x8f, 0x46, 0x09, 0xae, 0x76, 0xa7, 0x26, 0x96, 0x31, 0x7c, 0x5a, 0xe9, + 0x13, 0x8e, 0xf9, 0xb6, 0xfe, 0x8d, 0xbd, 0xcc, 0xf2, 0xca, 0x92, 0xae, + 0xec, 0x33, 0xd2, 0x0f, 0x50, 0xca, 0x3a, 0x56, 0x99, 0x2f, 0xee, 0x18, + 0xc7, 0x84, 0xb2, 0xff, 0xfe, 0xf7, 0x73, 0x9c, 0xcc, 0x06, 0xb6, 0xc0, + 0x17, 0x96, 0x5f, 0xf7, 0x63, 0x5e, 0x28, 0xcf, 0x96, 0x5f, 0xff, 0xf1, + 0xed, 0x12, 0xe6, 0xb4, 0x7f, 0x4d, 0x27, 0xd3, 0x33, 0xe5, 0x97, 0xfa, + 0x1f, 0x67, 0xd3, 0x88, 0xb2, 0xf7, 0x70, 0x86, 0x8d, 0x5e, 0x9c, 0x79, + 0xaa, 0xb1, 0x39, 0xc3, 0x2c, 0xf4, 0x66, 0x17, 0xe8, 0xd4, 0xdc, 0xd9, + 0x65, 0xff, 0x76, 0x33, 0x52, 0xe0, 0x18, 0xb2, 0xb6, 0x3e, 0x30, 0x95, + 0x5c, 0x7c, 0x59, 0x7f, 0xd9, 0xb3, 0xfb, 0xf1, 0x0a, 0x4b, 0x2f, 0xe7, + 0xf4, 0xe8, 0x90, 0xab, 0x2f, 0xe1, 0x19, 0xc6, 0x9f, 0xe5, 0x95, 0x09, + 0xb6, 0xe4, 0x26, 0x05, 0x23, 0xd0, 0xb3, 0x9d, 0xf8, 0xc2, 0xf6, 0xb3, + 0xab, 0x2f, 0x70, 0xd8, 0xb2, 0xb4, 0x6e, 0x3c, 0x39, 0x71, 0xec, 0xb2, + 0xa0, 0xdc, 0x37, 0x90, 0xdf, 0xfd, 0xd3, 0x82, 0x9c, 0xe5, 0x23, 0x62, + 0xcb, 0xe3, 0x98, 0xda, 0x59, 0x7f, 0xf3, 0x1f, 0xe1, 0x3c, 0x7a, 0x80, + 0x36, 0xd6, 0x5f, 0xff, 0x81, 0xb1, 0x46, 0x76, 0x7c, 0x7b, 0x3a, 0x0d, + 0x2c, 0xbe, 0xf7, 0x04, 0xe4, 0xe4, 0xc1, 0xc6, 0x87, 0x84, 0x62, 0x25, + 0x5c, 0x4d, 0x2c, 0xbf, 0x71, 0x99, 0xee, 0x2c, 0xbf, 0xf8, 0xc5, 0xcf, + 0x1f, 0x73, 0xd1, 0xa5, 0x97, 0xe7, 0x91, 0x1c, 0x2c, 0xbf, 0x39, 0x7b, + 0x09, 0x65, 0xff, 0x85, 0x27, 0xf7, 0x33, 0x7f, 0x4d, 0x65, 0x41, 0xf2, + 0xb9, 0x2d, 0xf8, 0x9c, 0x50, 0x9a, 0xca, 0x92, 0xad, 0x6c, 0x8c, 0xa8, + 0x2b, 0x26, 0x2f, 0xa2, 0x86, 0x21, 0x94, 0x22, 0x80, 0x41, 0x7d, 0xf0, + 0x4c, 0x6b, 0x2f, 0xdd, 0x3d, 0xc3, 0x15, 0x65, 0xf6, 0x7e, 0x7b, 0xd6, + 0x5f, 0x7f, 0xf8, 0x3f, 0x59, 0x41, 0x3f, 0x52, 0x2b, 0x10, 0x92, 0xf8, + 0x1a, 0xf1, 0xac, 0xbf, 0xfb, 0xf8, 0xe3, 0x20, 0xf5, 0xa3, 0x69, 0x65, + 0xe7, 0x79, 0x2c, 0xa1, 0xa2, 0x08, 0xc8, 0xbf, 0x45, 0xbf, 0x30, 0xfd, + 0xe8, 0x59, 0x78, 0xf1, 0xa5, 0x97, 0xc7, 0xcc, 0x19, 0x9e, 0x19, 0x13, + 0xdf, 0xc5, 0xcc, 0x64, 0x6e, 0xac, 0xbe, 0xdd, 0xee, 0x6c, 0xb2, 0xff, + 0x40, 0xf3, 0xc7, 0xd0, 0x2c, 0xa8, 0x3d, 0x81, 0x93, 0x54, 0x22, 0xa1, + 0x90, 0x87, 0xbf, 0xf7, 0x84, 0xfe, 0x04, 0x8f, 0xe3, 0xf5, 0x97, 0xff, + 0xfe, 0x63, 0x97, 0xf2, 0x3e, 0x01, 0x9d, 0x38, 0xf7, 0x40, 0xec, 0x59, + 0x7f, 0xfc, 0x40, 0xf4, 0x8f, 0xfe, 0xb9, 0xf9, 0xd8, 0xb2, 0xe9, 0xdb, + 0xab, 0x2f, 0xff, 0xce, 0x7e, 0x31, 0xe0, 0xf3, 0xc6, 0xc3, 0xd2, 0xcb, + 0xff, 0xd0, 0x11, 0xe0, 0x9e, 0x3d, 0x40, 0x1b, 0x6b, 0x2f, 0x03, 0x06, + 0xb2, 0xf6, 0x9f, 0x98, 0x99, 0x3e, 0x93, 0xfa, 0x38, 0x4a, 0x5b, 0x89, + 0xd6, 0xf3, 0xa7, 0xe0, 0x08, 0xe4, 0xeb, 0xe5, 0x4c, 0x47, 0x28, 0xce, + 0xe9, 0x42, 0xcb, 0xff, 0xdb, 0x0f, 0xb1, 0xdc, 0xfb, 0xfc, 0xf7, 0x16, + 0x53, 0x9f, 0x18, 0x05, 0xaa, 0x17, 0x74, 0xc7, 0x09, 0x8c, 0x85, 0x88, + 0x5c, 0xce, 0x1b, 0xcf, 0x2a, 0x24, 0xa1, 0x1f, 0x7f, 0x6a, 0x36, 0x32, + 0xf2, 0xcb, 0xc3, 0x11, 0x8b, 0x2f, 0xc5, 0x03, 0xc9, 0x96, 0x5f, 0x70, + 0x1a, 0x15, 0x65, 0xfa, 0x3b, 0xe8, 0x92, 0xcb, 0xe1, 0x83, 0xdc, 0x83, + 0xf2, 0xf8, 0x9f, 0xf2, 0x4b, 0xfd, 0x04, 0xfd, 0x01, 0x6c, 0xb2, 0xff, + 0xff, 0xe3, 0xe4, 0x4b, 0x3a, 0x7a, 0xeb, 0xc1, 0x0a, 0xf3, 0x3b, 0xec, + 0xb2, 0xf6, 0xc3, 0x85, 0x97, 0xef, 0xf1, 0x91, 0xd5, 0x97, 0xff, 0xff, + 0xb3, 0x6e, 0x40, 0xaf, 0xcf, 0x4b, 0x05, 0x17, 0x3e, 0xf6, 0xa3, 0x3e, + 0x59, 0x7e, 0x89, 0xda, 0x29, 0x2c, 0xae, 0x22, 0x94, 0x0f, 0x97, 0x9b, + 0x7d, 0xc5, 0x94, 0x35, 0x5a, 0x98, 0x5a, 0x70, 0x90, 0x62, 0x47, 0x4c, + 0x9d, 0xc0, 0x87, 0x7d, 0x0c, 0xd0, 0x11, 0xde, 0xd0, 0x9c, 0x59, 0x7e, + 0xc6, 0xbc, 0x23, 0x16, 0x5f, 0x78, 0x7c, 0xd9, 0x65, 0xff, 0x76, 0x3e, + 0xf4, 0x75, 0xf7, 0x56, 0x52, 0xca, 0x9c, 0x78, 0xed, 0xaa, 0x79, 0x6f, + 0x96, 0x5d, 0x8d, 0x2c, 0xbb, 0xde, 0x33, 0x53, 0xe1, 0x2a, 0x84, 0x40, + 0x1a, 0xa5, 0xff, 0x9c, 0x83, 0x9a, 0x0b, 0xb8, 0x55, 0x10, 0x8a, 0xe9, + 0x6c, 0xb2, 0xa1, 0x3b, 0x5c, 0x1e, 0x32, 0xaf, 0xe1, 0xd6, 0x02, 0x1d, + 0xe9, 0x37, 0xec, 0xdb, 0x9f, 0xba, 0xcb, 0xff, 0xff, 0xdd, 0xc0, 0x68, + 0x5e, 0x9f, 0xd1, 0xe0, 0x74, 0xb3, 0xef, 0x01, 0xf8, 0xb2, 0xff, 0xec, + 0xf8, 0x4f, 0x19, 0x02, 0x59, 0xc5, 0x97, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xec, 0x2d, 0x89, 0xc7, 0x05, 0xb4, 0x68, 0x78, 0x59, 0xee, 0x18, 0x70, + 0x84, 0xdb, 0x35, 0x1c, 0x27, 0x17, 0x98, 0x7f, 0xfe, 0x0f, 0xc9, 0xc7, + 0x05, 0xb4, 0x69, 0x65, 0xfd, 0x22, 0xcc, 0x03, 0x6d, 0x65, 0x42, 0x6f, + 0xf8, 0x8a, 0xf1, 0x85, 0x5f, 0xfd, 0xe7, 0x2d, 0xbe, 0x91, 0x46, 0x71, + 0x65, 0xff, 0xfa, 0x3f, 0x9a, 0x51, 0xb1, 0x38, 0xbc, 0x28, 0x92, 0xcb, + 0xff, 0x09, 0x9d, 0x76, 0x4f, 0x69, 0xa6, 0x96, 0x5f, 0xff, 0xb0, 0x3d, + 0x82, 0x19, 0x1e, 0xd8, 0x46, 0x2a, 0xcb, 0x3e, 0xc8, 0x98, 0x92, 0x2d, + 0x49, 0x31, 0x87, 0x87, 0x7d, 0xff, 0xfd, 0x31, 0x47, 0xfc, 0x0f, 0x4f, + 0x53, 0x14, 0x7f, 0xc5, 0x97, 0xff, 0xf7, 0xb9, 0x02, 0xc8, 0xfa, 0xe5, + 0xe9, 0x66, 0xb1, 0x65, 0xff, 0x8f, 0x98, 0x39, 0xcf, 0xfe, 0xe6, 0x2c, + 0xbf, 0xd0, 0xcf, 0xbd, 0x19, 0xf2, 0xcb, 0xff, 0x74, 0xf7, 0xf5, 0xe5, + 0xa8, 0x15, 0x65, 0x62, 0x62, 0x41, 0x5a, 0xea, 0x1f, 0x8d, 0x2f, 0xe0, + 0x78, 0xc0, 0x42, 0xac, 0xbf, 0xb1, 0xac, 0x20, 0x7e, 0xb2, 0xfd, 0x2c, + 0xf4, 0x7e, 0xb2, 0xe8, 0x66, 0xc7, 0xad, 0xf1, 0x75, 0xff, 0xff, 0xdf, + 0xb1, 0xe5, 0xd7, 0x3f, 0x18, 0xf0, 0x79, 0xe3, 0x61, 0xe9, 0x65, 0x71, + 0x13, 0xe0, 0x2f, 0xbf, 0xff, 0x16, 0x73, 0x3a, 0xed, 0xe1, 0xe9, 0xb2, + 0x02, 0xb2, 0xfd, 0xb3, 0x20, 0x70, 0xb2, 0xa4, 0xbe, 0x44, 0x38, 0xfe, + 0x7e, 0x34, 0x9a, 0x35, 0xcd, 0x14, 0x76, 0x37, 0x0e, 0x1e, 0xfa, 0x32, + 0x3d, 0xe4, 0x62, 0x2b, 0x5f, 0xfa, 0x05, 0x16, 0x0b, 0x3d, 0xd3, 0x59, + 0x7f, 0xa3, 0x9c, 0x8d, 0xb1, 0xa5, 0x97, 0xfb, 0xb8, 0xcc, 0xe8, 0x09, + 0x65, 0x0c, 0xf9, 0xbc, 0x69, 0x7d, 0x9a, 0x14, 0xd6, 0x54, 0x32, 0x37, + 0xb2, 0x7d, 0x2c, 0xe1, 0x56, 0xf0, 0xa4, 0x01, 0x15, 0xe6, 0x9a, 0x69, + 0x25, 0xff, 0x67, 0xef, 0xac, 0xdf, 0x83, 0x49, 0x3c, 0xd0, 0x5c, 0xd3, + 0x49, 0x2f, 0x34, 0xd3, 0x49, 0x2f, 0xe7, 0xd8, 0x7d, 0x8e, 0x24, 0x9e, + 0x68, 0x28, 0x91, 0x8a, 0xd2, 0x66, 0xe1, 0xcd, 0xf8, 0x26, 0x31, 0x18, + 0x92, 0x79, 0xb3, 0xbc, 0xd3, 0x4d, 0x24, 0xbd, 0xc8, 0xd2, 0x49, 0xe6, + 0x82, 0xf9, 0xcb, 0xef, 0x2c, 0xb7, 0xe6, 0x8a, 0xbf, 0x2d, 0xb4, 0x5d, + 0x7f, 0x0c, 0xa2, 0x4e, 0x15, 0x97, 0xee, 0x03, 0x6d, 0xc2, 0x59, 0x7e, + 0x19, 0xef, 0x81, 0xac, 0xbe, 0xc2, 0xcd, 0xd5, 0x95, 0xa3, 0xcc, 0x61, + 0x4d, 0x1a, 0x26, 0x84, 0x78, 0xbf, 0xfb, 0xaf, 0x22, 0x71, 0x66, 0x23, + 0x99, 0x65, 0xff, 0x6d, 0x1f, 0x70, 0xcb, 0x3f, 0x59, 0x7c, 0xf2, 0x3f, + 0xd6, 0x56, 0x8f, 0x73, 0xa7, 0x57, 0xfd, 0x81, 0x8d, 0x87, 0xd8, 0xe2, + 0xca, 0xc3, 0xdb, 0xdc, 0x22, 0xbf, 0xbb, 0x9b, 0xf3, 0xdc, 0x59, 0x41, + 0x4d, 0x3f, 0xf8, 0x7e, 0x78, 0x92, 0xb4, 0xa9, 0xbf, 0xb0, 0xc6, 0x28, + 0xdc, 0xae, 0xdb, 0xcb, 0x2a, 0x15, 0x7d, 0x64, 0xaa, 0x62, 0x3c, 0xbf, + 0x6d, 0xb9, 0xdc, 0x0a, 0xcb, 0x9b, 0x5b, 0x74, 0xb2, 0xf7, 0x23, 0xcb, + 0x2e, 0xfd, 0xa5, 0x96, 0xe4, 0xc6, 0xd5, 0xc7, 0x2b, 0x11, 0x55, 0xf1, + 0x67, 0x95, 0xef, 0xc1, 0x8e, 0xc3, 0x16, 0x5c, 0xfe, 0x59, 0x7e, 0xcd, + 0xd7, 0x2f, 0xf0, 0xde, 0x91, 0x3d, 0xff, 0x41, 0x48, 0x87, 0xd8, 0xd9, + 0x65, 0xfc, 0x3c, 0xd6, 0xe3, 0x06, 0xb2, 0xf7, 0x4e, 0x64, 0x95, 0xa3, + 0xce, 0xe1, 0x8d, 0xff, 0x3f, 0xde, 0xc9, 0x81, 0xa1, 0x56, 0x58, 0x26, + 0x7b, 0xc0, 0x22, 0xbf, 0xc5, 0x9f, 0x4b, 0x86, 0x2a, 0xcb, 0xe7, 0x7d, + 0x0a, 0xb2, 0xc2, 0xac, 0xbf, 0xfb, 0x03, 0xd8, 0xee, 0x6b, 0x50, 0x2a, + 0xcb, 0xc7, 0xff, 0x20, 0xf5, 0xb4, 0x25, 0x53, 0x91, 0xbf, 0xb1, 0xa1, + 0x3c, 0x5f, 0xf6, 0x60, 0x7f, 0x8c, 0xfa, 0x4b, 0x2f, 0xfe, 0xf6, 0x81, + 0xce, 0xbc, 0xbf, 0x31, 0xac, 0xbe, 0x87, 0x66, 0xf4, 0x97, 0xff, 0x74, + 0xdf, 0xff, 0xe3, 0xf8, 0xef, 0x16, 0x5f, 0xdd, 0xc6, 0x31, 0xe4, 0xb2, + 0xf3, 0x4d, 0x34, 0x92, 0xff, 0x17, 0xba, 0x70, 0x5b, 0x24, 0x9e, 0x68, + 0x2f, 0x47, 0xf9, 0x24, 0x48, 0xe2, 0x6d, 0x79, 0x30, 0xa1, 0x21, 0xaf, + 0x41, 0x4d, 0x5d, 0x91, 0x96, 0xdf, 0xf3, 0xfe, 0x59, 0x34, 0xa3, 0xe5, + 0x95, 0x0a, 0x80, 0x72, 0x39, 0xd3, 0x2a, 0xbf, 0xce, 0x42, 0x68, 0x81, + 0x25, 0x97, 0xf7, 0xf1, 0xfc, 0x77, 0x8b, 0x2f, 0xe1, 0x35, 0xa3, 0xf7, + 0x16, 0x5f, 0xfb, 0xfd, 0xcc, 0x89, 0x1f, 0x8a, 0x16, 0x54, 0x1f, 0x7b, + 0x97, 0xdf, 0xa2, 0x47, 0x2e, 0x2c, 0xa8, 0x5e, 0x4e, 0x93, 0x68, 0xa7, + 0xdf, 0x43, 0x90, 0xe3, 0x06, 0x98, 0xcb, 0xb2, 0x8e, 0x9c, 0xd7, 0xf3, + 0x32, 0x84, 0xf7, 0x08, 0x2f, 0xdf, 0xe1, 0xf4, 0x55, 0x97, 0xff, 0xd8, + 0x18, 0x27, 0xf7, 0x06, 0x07, 0xd4, 0x96, 0x57, 0xc7, 0xee, 0xc2, 0x9b, + 0xfa, 0x08, 0x2d, 0xdb, 0x71, 0x6e, 0x56, 0x5f, 0xa1, 0x9a, 0x8d, 0xeb, + 0x2f, 0xfe, 0x80, 0xf8, 0xa1, 0xac, 0xf7, 0x38, 0xb2, 0xff, 0xee, 0xbf, + 0x75, 0x1e, 0x30, 0x98, 0xd6, 0x56, 0x91, 0x0f, 0xfa, 0x25, 0xff, 0xff, + 0xc4, 0xec, 0x8d, 0x04, 0x7d, 0x8e, 0x01, 0xce, 0x5c, 0xeb, 0xc9, 0x65, + 0xe0, 0x7b, 0x8b, 0x2f, 0xcd, 0x3f, 0x61, 0x8b, 0x2f, 0x06, 0x38, 0xb2, + 0xff, 0xe1, 0x25, 0x9d, 0x7e, 0x9e, 0xb5, 0x0b, 0x2a, 0x11, 0x11, 0x85, + 0x1f, 0x8e, 0x5f, 0x7b, 0x9b, 0xf1, 0x65, 0xfd, 0x9b, 0x73, 0x74, 0xc2, + 0xb2, 0xa0, 0xf5, 0x48, 0x92, 0xfc, 0x0d, 0x0b, 0xd3, 0x59, 0x50, 0xac, + 0x58, 0x64, 0x61, 0x3d, 0xd4, 0x2c, 0x1c, 0x93, 0xf7, 0x02, 0x85, 0x2f, + 0xa1, 0x09, 0xb8, 0x41, 0x7f, 0x89, 0xda, 0xc2, 0x71, 0x56, 0x5f, 0xfd, + 0x9e, 0xe0, 0x9c, 0x61, 0x46, 0xa1, 0x65, 0xed, 0xf8, 0x43, 0x3f, 0x66, + 0x19, 0x5f, 0xfc, 0xd4, 0x68, 0x9f, 0x68, 0xd4, 0x49, 0x65, 0x19, 0xfc, + 0x74, 0xd2, 0xff, 0xff, 0x74, 0xda, 0xc6, 0xf3, 0x63, 0xfb, 0x80, 0x96, + 0x7d, 0xe5, 0x97, 0xff, 0x68, 0xff, 0x13, 0xb0, 0xc7, 0x7f, 0x2c, 0xa1, + 0xa2, 0xab, 0x4c, 0xb5, 0x88, 0xee, 0x78, 0x65, 0xdf, 0xf4, 0xc1, 0xe9, + 0xb2, 0x34, 0x2a, 0xcb, 0xf6, 0xd3, 0x81, 0x13, 0x2c, 0xb4, 0x96, 0x5e, + 0x10, 0xa6, 0x59, 0x52, 0x35, 0xff, 0x88, 0xd6, 0x22, 0xe1, 0xce, 0xf8, + 0xb7, 0x50, 0xfb, 0x03, 0x3b, 0x4b, 0x7d, 0x94, 0xe9, 0xa0, 0xe5, 0xf0, + 0x65, 0x62, 0x70, 0x2c, 0x39, 0x03, 0x1a, 0x29, 0xcb, 0x60, 0x9a, 0x72, + 0xb3, 0x52, 0xd9, 0xd9, 0x2e, 0x87, 0xb3, 0xc9, 0xcf, 0x2d, 0x47, 0xf9, + 0x47, 0x65, 0x49, 0x3b, 0xe4, 0xe8, 0xcf, 0xa7, 0xcb, 0x81, 0x38, 0x7e, + 0xd4, 0xa6, 0xc1, 0x21, 0xbd, 0x7b, 0x7c, 0x12, 0xcb, 0xff, 0xec, 0x29, + 0xfe, 0x14, 0xfe, 0xe7, 0x73, 0xf7, 0x59, 0x52, 0x3f, 0x01, 0x8e, 0xde, + 0x77, 0x69, 0x65, 0xdf, 0xc2, 0xcb, 0xf0, 0x73, 0xdd, 0x35, 0x96, 0x71, + 0x9e, 0xd1, 0x8e, 0x10, 0xbd, 0xff, 0xff, 0x67, 0x5c, 0x4e, 0x60, 0xae, + 0x5f, 0xc1, 0x44, 0xdd, 0x85, 0x96, 0x85, 0x97, 0xff, 0xe8, 0xd7, 0x61, + 0x8d, 0xe0, 0x82, 0x89, 0xbb, 0x0b, 0x2f, 0xc7, 0xa9, 0xa3, 0xba, 0x46, + 0x6f, 0xec, 0xc4, 0x21, 0x5f, 0x27, 0x90, 0xc7, 0xc1, 0x21, 0xff, 0x66, + 0xd5, 0x59, 0x7f, 0xef, 0x75, 0xe5, 0xe9, 0x8a, 0x18, 0xb2, 0xff, 0xce, + 0x5f, 0xce, 0x18, 0x1f, 0x52, 0x59, 0x7c, 0x65, 0xb4, 0x2c, 0xbd, 0xed, + 0x42, 0xcb, 0xfe, 0x28, 0x61, 0x96, 0x32, 0x16, 0x5e, 0xe9, 0xc9, 0x65, + 0xc6, 0x3c, 0x3e, 0xd9, 0x87, 0x3c, 0x6b, 0x5b, 0xa9, 0x84, 0xe9, 0x04, + 0xa1, 0x1d, 0x7f, 0xf1, 0x7b, 0x9d, 0x79, 0x4e, 0xcf, 0xbc, 0xb2, 0x9b, + 0x8a, 0x7b, 0xf0, 0x31, 0x91, 0xa4, 0x00, 0xe2, 0xff, 0x9f, 0x76, 0x6e, + 0x47, 0x5f, 0x75, 0x65, 0xff, 0x09, 0x13, 0x09, 0x1a, 0x79, 0x96, 0x5e, + 0x82, 0xd9, 0x65, 0xf1, 0xf4, 0xd8, 0xb2, 0xdd, 0x33, 0x7b, 0x30, 0xe5, + 0xee, 0x78, 0xd6, 0x5d, 0x30, 0x16, 0x5d, 0x01, 0x83, 0x68, 0x43, 0x97, + 0xfd, 0x1e, 0xeb, 0xfe, 0xff, 0x71, 0x65, 0x0c, 0xf9, 0x08, 0xaa, 0xff, + 0xff, 0x10, 0x1c, 0x3c, 0x03, 0x9c, 0xa0, 0x83, 0x9f, 0x79, 0x65, 0xff, + 0x7f, 0x3b, 0xa6, 0x10, 0x6b, 0xf5, 0x97, 0x9b, 0xe3, 0x75, 0x65, 0x68, + 0xf8, 0x1b, 0xcf, 0xaf, 0x4c, 0x0d, 0x2c, 0xbf, 0xf3, 0x9e, 0xb3, 0xe9, + 0xed, 0x34, 0xd2, 0xca, 0x84, 0x43, 0xb9, 0x2f, 0x07, 0xaf, 0xff, 0x8a, + 0x25, 0x38, 0x4f, 0x19, 0x02, 0x59, 0xc5, 0x97, 0xff, 0xee, 0x83, 0x8c, + 0x8f, 0x83, 0xd3, 0x61, 0x1e, 0xcb, 0x28, 0x6a, 0xdd, 0x71, 0xe4, 0x30, + 0xbf, 0x61, 0x0f, 0x63, 0x46, 0xfc, 0xbb, 0x8a, 0x37, 0x70, 0x0b, 0x2f, + 0x7e, 0xec, 0x59, 0x76, 0x7e, 0xb2, 0xa0, 0xda, 0x60, 0xed, 0xe7, 0xc6, + 0x2c, 0xb8, 0xa5, 0xb2, 0x21, 0x49, 0x2d, 0xbc, 0x7e, 0xfa, 0x3a, 0x0d, + 0x2c, 0xbf, 0xb8, 0x58, 0x32, 0x75, 0x94, 0x47, 0x9a, 0xd1, 0x15, 0xc1, + 0x35, 0x97, 0xe2, 0x8d, 0xa3, 0xe5, 0x96, 0xe0, 0x4d, 0xf1, 0x8b, 0x54, + 0x26, 0x22, 0x70, 0x8b, 0x76, 0x0b, 0xf6, 0xb8, 0x51, 0xb2, 0xcb, 0xff, + 0xe6, 0xb0, 0x3c, 0xcf, 0x4d, 0x82, 0x96, 0x7e, 0xb2, 0xb0, 0xfe, 0x8c, + 0xa2, 0xff, 0xb1, 0xac, 0xd0, 0x5d, 0xc2, 0xa8, 0xc3, 0x97, 0xff, 0x03, + 0x83, 0xeb, 0xb3, 0xe9, 0x19, 0x2c, 0xbf, 0x7b, 0xae, 0x5f, 0xac, 0xad, + 0x91, 0x65, 0xd4, 0x57, 0x45, 0xbf, 0xf3, 0xfb, 0x26, 0x78, 0x28, 0x99, + 0x65, 0xff, 0xba, 0x78, 0x26, 0x4c, 0xd4, 0x7c, 0xb2, 0xc7, 0xa4, 0x57, + 0x74, 0xc3, 0x87, 0xb7, 0x04, 0x2a, 0x8c, 0x11, 0x52, 0x4f, 0x64, 0x31, + 0xc0, 0x7e, 0x6b, 0x7f, 0x9b, 0xae, 0x0c, 0xb3, 0xad, 0x85, 0x97, 0x61, + 0x2c, 0xbf, 0xfd, 0xe8, 0x20, 0xe7, 0xba, 0x7a, 0xfc, 0x2b, 0x2f, 0xc3, + 0x3e, 0x74, 0xd6, 0x5f, 0xc6, 0x59, 0xee, 0x9a, 0xcb, 0x46, 0x1e, 0x97, + 0x09, 0xe8, 0x68, 0xd7, 0xc1, 0x50, 0x42, 0x72, 0xff, 0x43, 0x39, 0xc7, + 0x2d, 0x96, 0x5f, 0xf7, 0xfc, 0x91, 0xf5, 0xcf, 0x65, 0x97, 0xdc, 0xc2, + 0xf2, 0xcb, 0xcd, 0xf1, 0xa5, 0x94, 0x67, 0xf4, 0xe7, 0x40, 0x21, 0xbd, + 0xe7, 0xdd, 0x59, 0x7f, 0xbd, 0xd3, 0x9f, 0xfb, 0x9a, 0xcb, 0xfc, 0x2f, + 0x62, 0x40, 0x7d, 0x2c, 0xb1, 0x2c, 0xa3, 0x3c, 0x40, 0x1a, 0x5c, 0x26, + 0x2c, 0xad, 0x95, 0x78, 0x8e, 0x31, 0x3e, 0x9a, 0x14, 0x2b, 0x7c, 0x5a, + 0x01, 0xfd, 0xc7, 0x91, 0x08, 0x6f, 0xc2, 0xfe, 0x73, 0x71, 0x65, 0xf7, + 0x4d, 0xe4, 0xb2, 0xf0, 0xde, 0x4b, 0x2a, 0x0d, 0xee, 0x10, 0xd8, 0x10, + 0x88, 0x7f, 0xda, 0x2f, 0xff, 0x4e, 0x27, 0xf4, 0x68, 0x12, 0xd4, 0x49, + 0x65, 0xde, 0xe2, 0xcb, 0xf3, 0x8a, 0xd4, 0x69, 0x65, 0x1a, 0x22, 0xdd, + 0x2c, 0x85, 0xef, 0xfe, 0x30, 0x96, 0x32, 0x26, 0x1c, 0x6c, 0xb2, 0xff, + 0xe9, 0x16, 0x31, 0xcb, 0x3a, 0xec, 0x59, 0x7f, 0xc1, 0xcf, 0x46, 0xf3, + 0x2f, 0xd6, 0x5f, 0xff, 0xc0, 0x8f, 0x73, 0x0a, 0x76, 0xa0, 0xc6, 0x4f, + 0x25, 0x97, 0xe0, 0xf7, 0xe7, 0xdd, 0x59, 0x7f, 0xb9, 0x12, 0x14, 0x5c, + 0xdd, 0x59, 0x7f, 0xe1, 0x90, 0x3d, 0xc8, 0x28, 0xe2, 0xca, 0x83, 0xf5, + 0x33, 0x8a, 0x0a, 0x7b, 0x5f, 0x22, 0x1a, 0x09, 0x1d, 0x01, 0x6b, 0x7c, + 0x28, 0x6f, 0xfc, 0xfa, 0xcd, 0xf8, 0x3d, 0x13, 0x4b, 0x2f, 0xff, 0xc0, + 0x29, 0x61, 0x78, 0xf7, 0x33, 0xc4, 0xf2, 0x59, 0x7f, 0xa3, 0xf8, 0xee, + 0x7d, 0x25, 0x94, 0x68, 0x89, 0x25, 0x5a, 0xfd, 0x1d, 0x5e, 0x86, 0x4d, + 0xff, 0x75, 0xcb, 0x26, 0x94, 0x7c, 0xb2, 0xff, 0xee, 0x9e, 0xb3, 0x85, + 0x9b, 0xfa, 0x6b, 0x2f, 0xc5, 0x9c, 0x04, 0xec, 0x3f, 0xd9, 0x8e, 0x6f, + 0xda, 0x0b, 0xb8, 0x55, 0x10, 0x32, 0xfe, 0x7d, 0xbf, 0x72, 0x1a, 0x2b, + 0x07, 0xaf, 0x67, 0x01, 0x87, 0xe1, 0xb8, 0x69, 0x7b, 0xaf, 0x29, 0xc8, + 0xe5, 0x28, 0x58, 0x5f, 0xf7, 0x4f, 0x0b, 0x02, 0x3c, 0x59, 0x4c, 0x4f, + 0xef, 0xd1, 0xc5, 0xef, 0x3a, 0xbd, 0xe0, 0x42, 0xcb, 0xef, 0xf5, 0xce, + 0x2c, 0xbf, 0xdf, 0xf8, 0xf6, 0x64, 0x05, 0x65, 0x7c, 0x7e, 0xae, 0x38, + 0x44, 0x97, 0xe1, 0xb7, 0x2e, 0x36, 0xe5, 0x65, 0xff, 0xf9, 0xe5, 0xc3, + 0x1c, 0xec, 0xcf, 0xbf, 0x72, 0xf2, 0xca, 0x85, 0xca, 0x8c, 0x96, 0x86, + 0x70, 0xae, 0x72, 0xe0, 0x19, 0x5c, 0x72, 0x59, 0x7f, 0x7d, 0xe1, 0xe6, + 0x0a, 0xb2, 0x86, 0x78, 0xb8, 0x2d, 0x68, 0x59, 0x7d, 0x04, 0x7f, 0xac, + 0xb6, 0x74, 0xd8, 0xf8, 0x42, 0xff, 0x68, 0x9d, 0xa1, 0x3e, 0x69, 0x65, + 0xdf, 0xef, 0x59, 0x43, 0x3d, 0x1e, 0x9b, 0xde, 0x7d, 0x6c, 0xa8, 0xc1, + 0x57, 0xfe, 0x7d, 0x61, 0x7f, 0xcf, 0x73, 0xe5, 0x97, 0xff, 0xff, 0xf6, + 0x7b, 0xae, 0x42, 0xce, 0xe6, 0x9d, 0xfd, 0xbf, 0x07, 0x3b, 0x18, 0xe5, + 0xf4, 0x97, 0x10, 0x5a, 0xff, 0xce, 0xe2, 0x85, 0xc7, 0x38, 0x56, 0x97, + 0x10, 0x5a, 0xff, 0xee, 0x9f, 0x4e, 0x0b, 0xd3, 0x85, 0x69, 0x71, 0x05, + 0xaf, 0xf4, 0x19, 0x7a, 0x70, 0xad, 0x2e, 0x20, 0xb5, 0xfc, 0xcc, 0x1c, + 0xe1, 0x5a, 0x5c, 0x41, 0x6b, 0xff, 0xfe, 0x72, 0x23, 0x64, 0xee, 0x07, + 0xa7, 0xa3, 0x17, 0x6c, 0x69, 0x71, 0x05, 0xae, 0xfa, 0x70, 0xd3, 0x9c, + 0x0a, 0x86, 0x95, 0x1d, 0x0c, 0x8f, 0xea, 0x15, 0x67, 0xf5, 0x00, 0xa5, + 0x1b, 0xdf, 0xe3, 0x81, 0x79, 0xee, 0x7c, 0xb2, 0xf9, 0xf5, 0xfb, 0xac, + 0xbf, 0xfb, 0xa7, 0xd3, 0x82, 0xf4, 0xe1, 0x5a, 0x5c, 0x41, 0x6b, 0xfe, + 0x9b, 0x81, 0x3d, 0xa7, 0x0a, 0xd2, 0xe2, 0x0b, 0x5f, 0xbd, 0xc8, 0x64, + 0xe0, 0xa2, 0x84, 0x45, 0x4b, 0xff, 0xd3, 0x83, 0xd3, 0x0c, 0x7b, 0x93, + 0x85, 0x69, 0x71, 0x05, 0xaf, 0xff, 0xfe, 0x22, 0x36, 0x4e, 0x06, 0x4e, + 0xe0, 0x7a, 0x7a, 0x31, 0x76, 0xc6, 0x97, 0x10, 0x5a, 0xb1, 0x32, 0x5f, + 0x90, 0xdd, 0x7a, 0xff, 0xba, 0x7a, 0x31, 0x76, 0xc6, 0x97, 0x10, 0x5a, + 0xff, 0xf9, 0xdf, 0xe9, 0x73, 0xa6, 0x31, 0xc6, 0xa1, 0x25, 0xff, 0xb2, + 0x52, 0x07, 0x34, 0x5b, 0x6e, 0x2e, 0x20, 0xb5, 0x05, 0x1c, 0xfa, 0x48, + 0xe2, 0x7d, 0xff, 0x82, 0x7a, 0xf3, 0xff, 0xc9, 0xcd, 0x2e, 0x20, 0xb5, + 0xfd, 0xd3, 0xef, 0x4f, 0xf5, 0x40, 0x16, 0xbf, 0x67, 0xf3, 0x85, 0x69, + 0x71, 0x05, 0xae, 0xcf, 0x04, 0xfd, 0x7a, 0x77, 0x5f, 0x23, 0xcb, 0x90, + 0xc5, 0xbf, 0x99, 0x83, 0x9c, 0x2b, 0x4b, 0x88, 0x2d, 0x7f, 0xe0, 0xf4, + 0xf4, 0x62, 0xed, 0x8d, 0x2e, 0x20, 0xb5, 0xd9, 0x39, 0xd1, 0x1b, 0xc3, + 0xfb, 0xfc, 0x03, 0x63, 0x97, 0xd2, 0x5c, 0x41, 0x6b, 0xff, 0x61, 0xef, + 0xc2, 0xc1, 0xbc, 0x97, 0x10, 0x59, 0x87, 0x81, 0x43, 0x5e, 0x0d, 0xd1, + 0xbf, 0xe6, 0xa5, 0x1f, 0x47, 0x23, 0x17, 0xf4, 0x64, 0x40, 0x85, 0xb3, + 0x4d, 0xf7, 0x7f, 0x0a, 0x88, 0x2d, 0x3d, 0x11, 0x97, 0x38, 0x56, 0x5b, + 0x81, 0x64, 0xf0, 0x7f, 0x49, 0x92, 0xf1, 0xc5, 0xd2, 0x6f, 0x59, 0x7a, + 0x24, 0xde, 0xb2, 0xa0, 0xdc, 0x90, 0xd5, 0x6c, 0xcb, 0x67, 0x1a, 0x97, + 0xce, 0xff, 0xd2, 0x80, 0x89, 0xf6, 0xff, 0xec, 0x91, 0x67, 0xba, 0x79, + 0xf7, 0x96, 0x5f, 0xe8, 0xe9, 0xb5, 0xf4, 0xb8, 0xb2, 0xfd, 0x1e, 0xe7, + 0x4d, 0x65, 0xff, 0xb5, 0x82, 0xf7, 0x18, 0x0d, 0x6c, 0xb2, 0xff, 0xbe, + 0x2c, 0x36, 0x61, 0x7e, 0xb2, 0xfd, 0x2f, 0x73, 0x09, 0x65, 0xff, 0xe7, + 0x0c, 0x10, 0xcb, 0x37, 0xe8, 0xf8, 0xb2, 0xff, 0xdc, 0x9a, 0x40, 0x1c, + 0xd2, 0x00, 0xd6, 0x56, 0xc9, 0xc4, 0x48, 0xd4, 0x64, 0xf8, 0x83, 0xf1, + 0xc7, 0x49, 0xfc, 0x93, 0x7f, 0xf4, 0x7d, 0x21, 0x19, 0xcf, 0x47, 0xcd, + 0x2c, 0xbf, 0x49, 0xbd, 0xbc, 0x1b, 0x2c, 0xb7, 0x4c, 0xfe, 0x5d, 0x26, + 0xfd, 0xa8, 0xfa, 0x5c, 0x59, 0x52, 0x3c, 0xfd, 0x13, 0x5e, 0x63, 0xf9, + 0x65, 0xff, 0x81, 0xcd, 0xcc, 0xd7, 0xec, 0x3e, 0x2c, 0xbf, 0xfb, 0x7e, + 0xf8, 0xe3, 0xf7, 0xe9, 0x67, 0x96, 0x57, 0xe8, 0x8c, 0x11, 0x0e, 0xff, + 0x7e, 0x0f, 0x14, 0x7b, 0x8b, 0x2a, 0x49, 0x80, 0xff, 0x0a, 0x8e, 0x12, + 0xd4, 0x2a, 0x88, 0xc8, 0xcb, 0x9e, 0x32, 0x3b, 0xf9, 0xe5, 0x1b, 0xdf, + 0xab, 0x2f, 0xfe, 0xcf, 0xbd, 0xc3, 0x28, 0xfd, 0xd8, 0xb2, 0xff, 0x71, + 0xfa, 0x7c, 0x89, 0x2c, 0xbf, 0xf3, 0x6f, 0x08, 0xb0, 0x48, 0x2f, 0xd6, + 0x5f, 0xec, 0xe9, 0xf0, 0xc1, 0x25, 0x95, 0xb2, 0x3a, 0x7c, 0x88, 0x03, + 0x26, 0xf4, 0x1b, 0xef, 0xb9, 0x1f, 0x2c, 0xbf, 0xf4, 0xb3, 0xe9, 0x6a, + 0x3c, 0xfe, 0x59, 0x79, 0x91, 0x25, 0x97, 0xec, 0x1f, 0x40, 0xd2, 0xca, + 0x9c, 0x8a, 0x89, 0x89, 0x1c, 0xfc, 0x87, 0x2f, 0xf8, 0x3d, 0x31, 0xf6, + 0x3d, 0xc5, 0x97, 0x86, 0xfe, 0x59, 0x7f, 0xee, 0x41, 0x44, 0xbd, 0xdc, + 0x25, 0x95, 0xa4, 0x67, 0xb0, 0xf9, 0xce, 0x78, 0x39, 0x78, 0xf7, 0x31, + 0x65, 0xfd, 0xc3, 0x1e, 0x35, 0xc5, 0x97, 0x6b, 0xf5, 0x97, 0x63, 0x4b, + 0x29, 0xcd, 0x7f, 0x86, 0x2d, 0xf4, 0x22, 0x6f, 0xe1, 0xef, 0x2e, 0xdf, + 0x35, 0x9d, 0x75, 0x97, 0xc2, 0xe8, 0xda, 0x59, 0x7e, 0xd9, 0xfb, 0x1b, + 0xab, 0x29, 0xba, 0x3c, 0xfc, 0x24, 0xbf, 0x85, 0xec, 0x7d, 0xec, 0x59, + 0x7f, 0x8b, 0x07, 0xd8, 0x68, 0x96, 0x54, 0x1f, 0x0e, 0x8b, 0xea, 0x17, + 0x3d, 0xb2, 0x31, 0x73, 0x8e, 0xe1, 0xe1, 0xaf, 0xf9, 0xb9, 0x38, 0x82, + 0x10, 0xf7, 0xe9, 0x66, 0xde, 0x85, 0x97, 0xff, 0x14, 0x6c, 0xce, 0x9e, + 0xb4, 0xf2, 0x59, 0x4b, 0x2a, 0x63, 0xf7, 0x22, 0x8d, 0xc4, 0x4b, 0xfd, + 0xb6, 0xd0, 0x5f, 0x67, 0x96, 0x5f, 0x87, 0x98, 0x41, 0x59, 0x74, 0x4c, + 0xb2, 0xb6, 0x37, 0xbf, 0x93, 0x56, 0x23, 0x1c, 0xcc, 0x80, 0xe5, 0x7f, + 0xf6, 0x88, 0x1f, 0x78, 0xb3, 0x67, 0x25, 0x97, 0xff, 0xf0, 0xfa, 0x0d, + 0x8f, 0x35, 0xac, 0x8f, 0xa4, 0x6c, 0x59, 0x79, 0xf5, 0xb2, 0xcb, 0xbf, + 0x85, 0x97, 0xc7, 0x0c, 0xc5, 0x94, 0xb2, 0xfe, 0x71, 0x7d, 0x1a, 0xfd, + 0x65, 0x0c, 0xdd, 0x10, 0x5d, 0xff, 0xfe, 0x83, 0x19, 0x40, 0x03, 0xec, + 0x08, 0xe0, 0x22, 0x31, 0x65, 0xdf, 0xc2, 0xcb, 0xa0, 0x55, 0x97, 0xfd, + 0x9e, 0xe4, 0x30, 0x4c, 0x99, 0x65, 0xfe, 0xe6, 0x74, 0xf8, 0x0d, 0x96, + 0x5c, 0xd3, 0x49, 0x2f, 0xf8, 0xb3, 0x7b, 0xcb, 0x86, 0x35, 0x94, 0x14, + 0xff, 0x0c, 0x77, 0x42, 0xec, 0x5a, 0xe9, 0x07, 0xec, 0x0d, 0xb1, 0x72, + 0x17, 0xe1, 0xd3, 0x46, 0x82, 0x0c, 0xde, 0x69, 0xa6, 0x92, 0x59, 0x89, + 0x27, 0x9a, 0x0b, 0xe9, 0x9d, 0xf4, 0x92, 0x7a, 0x38, 0x44, 0x85, 0xf5, + 0x6c, 0xaf, 0x18, 0x28, 0x8f, 0x2c, 0xe6, 0xfe, 0xf4, 0x67, 0x73, 0x65, + 0x97, 0x63, 0x16, 0x57, 0xc7, 0x87, 0xc2, 0xda, 0x87, 0x64, 0xbb, 0x29, + 0x42, 0xe3, 0x48, 0xc9, 0x76, 0x82, 0xca, 0x07, 0xfa, 0x54, 0x31, 0xcb, + 0x29, 0xd4, 0x61, 0x2c, 0x85, 0xa7, 0x67, 0xab, 0xde, 0x98, 0x03, 0xfa, + 0xc9, 0x4e, 0x29, 0xf2, 0x74, 0xc7, 0xd1, 0xdb, 0x82, 0x5f, 0xa6, 0xf7, + 0xcb, 0x84, 0xf2, 0xcb, 0xfb, 0x3f, 0xfc, 0xf5, 0x25, 0x97, 0x07, 0x16, + 0x50, 0xcf, 0x15, 0xcb, 0xee, 0xc6, 0x96, 0x5d, 0x1e, 0x59, 0x5b, 0x1a, + 0xd0, 0x8b, 0xd9, 0x8b, 0x2b, 0x0d, 0x9f, 0x88, 0xaf, 0xf4, 0x8c, 0xb1, + 0x80, 0xea, 0xcb, 0xff, 0x67, 0xb9, 0xd3, 0x63, 0xe6, 0x96, 0x54, 0x1f, + 0x79, 0x19, 0x5f, 0xb2, 0x76, 0x7f, 0xe5, 0x97, 0xd3, 0xbd, 0x1b, 0xd6, + 0x5f, 0x63, 0x33, 0xcb, 0x2f, 0x79, 0xc5, 0x59, 0x7c, 0xec, 0x79, 0x96, + 0x5f, 0x89, 0xfd, 0xf7, 0x16, 0x5f, 0xff, 0xf9, 0xe6, 0x04, 0x80, 0x19, + 0xdd, 0x3f, 0x7a, 0x3e, 0x8d, 0xa3, 0x8b, 0x2f, 0xc4, 0xfb, 0xbb, 0x4c, + 0xb2, 0xfa, 0x6e, 0x47, 0x96, 0x50, 0x51, 0x81, 0x33, 0x88, 0x0b, 0x2f, + 0xff, 0xf1, 0x3b, 0xef, 0x89, 0x76, 0x35, 0xb4, 0x7b, 0x8f, 0x25, 0x97, + 0xf4, 0x07, 0xdc, 0x7f, 0x96, 0x56, 0xea, 0x23, 0xc9, 0x86, 0xf1, 0xfd, + 0x32, 0xcb, 0xe0, 0x36, 0xd8, 0x6b, 0x2f, 0xd9, 0x9b, 0x03, 0x8b, 0x2f, + 0xb4, 0x47, 0xfa, 0xcb, 0xe3, 0x0b, 0xe9, 0x65, 0xd1, 0xfa, 0xcb, 0xe0, + 0x6c, 0x09, 0xfd, 0x37, 0x02, 0x10, 0xd1, 0xa2, 0x5f, 0xab, 0x56, 0xfd, + 0x65, 0xd8, 0x15, 0x95, 0xba, 0x6a, 0x3a, 0x25, 0x7e, 0x78, 0xfb, 0x02, + 0xb2, 0xff, 0xba, 0xfc, 0xe9, 0xec, 0xe4, 0xb2, 0xf9, 0xf6, 0x12, 0x4b, + 0x29, 0xb0, 0xbb, 0xfc, 0xd9, 0x5d, 0x88, 0x40, 0xca, 0x11, 0xe3, 0x20, + 0xc2, 0xaf, 0x89, 0x8c, 0x87, 0x74, 0x76, 0x62, 0x2d, 0x43, 0xa1, 0xe1, + 0x81, 0xf9, 0x2b, 0x6c, 0x7b, 0x84, 0xde, 0x85, 0xf8, 0x12, 0x9a, 0x24, + 0x10, 0x9d, 0xbc, 0xe2, 0xfe, 0x20, 0x0d, 0x8f, 0x25, 0x97, 0x8f, 0x60, + 0x2c, 0xbf, 0x47, 0xe7, 0xf6, 0x2c, 0xb9, 0x9b, 0xd6, 0x58, 0x70, 0x78, + 0x24, 0x51, 0x7f, 0xfa, 0x45, 0x13, 0x98, 0x50, 0x2f, 0x8f, 0x65, 0x97, + 0xe7, 0x66, 0x75, 0x8b, 0x2b, 0xe3, 0xf3, 0xf2, 0x65, 0xef, 0x6a, 0x16, + 0x5f, 0x8b, 0x36, 0x12, 0x4b, 0x2f, 0xef, 0x6f, 0xc2, 0xc1, 0xac, 0xa9, + 0x8f, 0x5f, 0x85, 0x37, 0xf6, 0x73, 0x24, 0x7a, 0x59, 0x7b, 0xb1, 0xbd, + 0x65, 0xee, 0x4b, 0x65, 0x95, 0x86, 0xf0, 0x41, 0xea, 0x85, 0x4c, 0xd2, + 0x2d, 0xc5, 0xe3, 0x84, 0xcb, 0x08, 0xdd, 0xcc, 0x88, 0xfc, 0xd1, 0x79, + 0xe7, 0x08, 0xb2, 0xf4, 0xc7, 0xd5, 0x97, 0xf4, 0x69, 0xe6, 0x3e, 0xac, + 0xbf, 0x70, 0x70, 0x5b, 0x39, 0xe5, 0x70, 0x76, 0xfe, 0xcd, 0xa3, 0xbd, + 0x85, 0x97, 0xec, 0x9b, 0xb8, 0x4b, 0x2f, 0xe8, 0xc1, 0x08, 0x1f, 0xac, + 0xad, 0x22, 0x0b, 0xa5, 0xa4, 0x4f, 0x79, 0x90, 0xc5, 0x95, 0xf2, 0x61, + 0x7a, 0x86, 0x03, 0x0b, 0xef, 0xff, 0x8a, 0x53, 0xb0, 0x67, 0xcf, 0xbc, + 0x07, 0xe2, 0xcb, 0xf7, 0x40, 0x51, 0xbd, 0x65, 0xfc, 0x4f, 0xe9, 0x40, + 0xab, 0x2a, 0x0f, 0x58, 0x42, 0x9b, 0xec, 0xcf, 0xa4, 0xb2, 0xf7, 0x0e, + 0x65, 0x96, 0x14, 0x8d, 0xff, 0x08, 0xaf, 0xfb, 0x47, 0x1e, 0xcd, 0xee, + 0x35, 0x97, 0xfe, 0xd8, 0xa3, 0xe3, 0x19, 0x46, 0xcb, 0x2f, 0xf9, 0xd9, + 0x1d, 0x7e, 0x46, 0xea, 0xca, 0x73, 0xf9, 0x23, 0xfa, 0xd2, 0x3e, 0x7a, + 0x4e, 0x50, 0xb2, 0xbf, 0x4e, 0xec, 0x6a, 0x4b, 0x2a, 0x72, 0xe0, 0x5c, + 0x46, 0xe9, 0x86, 0xe1, 0x85, 0x43, 0xc6, 0xb4, 0xd1, 0xa5, 0xe6, 0x72, + 0x16, 0x5f, 0xdb, 0x4d, 0x26, 0xce, 0xb6, 0x59, 0x7c, 0xcc, 0x7e, 0xac, + 0xb6, 0xcb, 0x2f, 0xde, 0xe9, 0xb3, 0x4b, 0x2a, 0x46, 0xeb, 0x42, 0x57, + 0xba, 0x33, 0x59, 0x7e, 0xee, 0x1c, 0xb8, 0xb2, 0xff, 0xfb, 0xb0, 0x24, + 0xff, 0x13, 0xff, 0xce, 0x47, 0xe9, 0x2f, 0xd9, 0xe7, 0x03, 0x6d, 0x65, + 0xfb, 0x41, 0x77, 0x0a, 0xe2, 0x04, 0x5e, 0xe4, 0x7c, 0xb2, 0xf8, 0xf9, + 0xa9, 0x2c, 0xb7, 0xf8, 0x7e, 0x7f, 0x1a, 0x30, 0x76, 0xf8, 0xb1, 0xa6, + 0xf5, 0x97, 0x1e, 0xcb, 0x28, 0xcd, 0xe7, 0x89, 0x6f, 0xb6, 0x27, 0x62, + 0xcb, 0x9c, 0x96, 0x54, 0x1b, 0x7d, 0x88, 0xaa, 0x4a, 0x80, 0xc6, 0x4f, + 0xf2, 0xa6, 0xa1, 0x3c, 0xc7, 0x2f, 0x2b, 0xdf, 0xcf, 0xac, 0xdf, 0x83, + 0x59, 0x7e, 0x0b, 0x8b, 0xd3, 0x59, 0x5f, 0x9e, 0xb1, 0x17, 0x5e, 0x1b, + 0xc9, 0x65, 0xa4, 0xb2, 0xa0, 0xd6, 0xb7, 0x8e, 0x5f, 0x7b, 0x67, 0x25, + 0x97, 0x99, 0x01, 0x59, 0x73, 0x8a, 0xb2, 0xb0, 0xd9, 0x90, 0xe5, 0xfe, + 0x17, 0x36, 0x07, 0xb7, 0xf9, 0x65, 0xff, 0x3c, 0xb5, 0x1b, 0x3e, 0x82, + 0xb2, 0xf0, 0xa7, 0xe5, 0x97, 0xb8, 0xfe, 0x59, 0x42, 0x9b, 0x9f, 0x87, + 0x6e, 0x9d, 0xd5, 0x97, 0xf3, 0x3c, 0x63, 0x04, 0x2c, 0xbc, 0xcf, 0x05, + 0x65, 0xbd, 0x07, 0x95, 0x85, 0xb7, 0xf4, 0x33, 0x05, 0x8e, 0x2c, 0xad, + 0x95, 0x0d, 0x61, 0x18, 0x55, 0x74, 0x3e, 0xc3, 0x8e, 0xb9, 0x7e, 0x46, + 0x4c, 0x7e, 0x26, 0xbf, 0xf0, 0x3f, 0xee, 0x7d, 0x2f, 0x1c, 0xcb, 0x2e, + 0xd0, 0x16, 0x5f, 0xe2, 0x76, 0xb9, 0xc8, 0xfd, 0x65, 0xe8, 0x7d, 0x2c, + 0xbf, 0xed, 0x68, 0xfe, 0x97, 0x9f, 0xe5, 0x97, 0xb7, 0x1c, 0x55, 0x97, + 0xfd, 0x0c, 0x96, 0x6d, 0x80, 0x6d, 0xac, 0xbf, 0xe8, 0xfc, 0xe5, 0xd3, + 0x2f, 0xd6, 0x5b, 0x65, 0x97, 0x3f, 0xb4, 0x79, 0x6d, 0xb3, 0x9a, 0xc4, + 0x6c, 0x99, 0x03, 0xc2, 0x22, 0xf3, 0x50, 0x22, 0xcb, 0xce, 0x43, 0x5d, + 0x5f, 0x4b, 0xe9, 0x02, 0x05, 0x59, 0x6f, 0xd6, 0x56, 0x1b, 0x57, 0x23, + 0xa8, 0x54, 0x8c, 0x31, 0x71, 0x4d, 0x0c, 0x6f, 0x51, 0x8a, 0x74, 0xcb, + 0xf1, 0xef, 0x2e, 0xdf, 0xef, 0x77, 0x25, 0xd3, 0xde, 0xb2, 0xf9, 0x9a, + 0x06, 0xcb, 0x2f, 0xff, 0x88, 0xc5, 0x9f, 0xcf, 0x74, 0x0f, 0x29, 0x42, + 0xca, 0x83, 0xf6, 0xc2, 0x4b, 0xf7, 0x73, 0xdc, 0x85, 0x95, 0xb2, 0x6d, + 0x72, 0x79, 0x16, 0x15, 0x61, 0x20, 0xbe, 0xc1, 0xbc, 0x96, 0x5f, 0x9c, + 0x88, 0xd8, 0xb2, 0xf6, 0x6f, 0x11, 0x65, 0xc7, 0xd5, 0x97, 0x86, 0xf2, + 0x59, 0x7c, 0xec, 0xc6, 0x2c, 0xbe, 0x36, 0x46, 0xea, 0xcb, 0x8f, 0x53, + 0x8f, 0x17, 0x08, 0x68, 0x68, 0xa5, 0xc1, 0x6e, 0xb0, 0xdf, 0x8d, 0x8e, + 0x58, 0xb2, 0xa7, 0x33, 0x08, 0x5b, 0xb1, 0xc8, 0x36, 0x92, 0xd8, 0xc8, + 0x72, 0x50, 0xf8, 0xb0, 0xb5, 0x39, 0x4d, 0x3d, 0x84, 0x03, 0xcb, 0xf3, + 0xfd, 0x14, 0x88, 0x78, 0x4a, 0x08, 0x62, 0x6e, 0x17, 0xdf, 0xc0, 0x1c, + 0x76, 0x04, 0x59, 0x7f, 0x67, 0x70, 0x20, 0xc5, 0x97, 0xe3, 0xf4, 0x7b, + 0x89, 0x2f, 0x83, 0x1e, 0xe2, 0x4b, 0x9a, 0x69, 0x25, 0x48, 0xf8, 0xb0, + 0x9d, 0xa2, 0x2b, 0x34, 0x92, 0x79, 0xaf, 0xbc, 0xe5, 0xfa, 0xca, 0xc3, + 0xc0, 0x14, 0x92, 0xfa, 0x62, 0x76, 0x96, 0x5e, 0x9b, 0xa6, 0xb2, 0xff, + 0xfb, 0xd0, 0x1c, 0xc2, 0xf7, 0x4e, 0x0b, 0x65, 0x94, 0xb2, 0xb0, 0xf6, + 0x38, 0x9b, 0x43, 0x54, 0x0d, 0x31, 0x77, 0xf0, 0xfd, 0x22, 0x2e, 0x11, + 0xb4, 0xeb, 0x7f, 0xf8, 0xa3, 0xef, 0xf0, 0xa2, 0x5a, 0xd4, 0x2c, 0xbf, + 0xf7, 0xb9, 0x81, 0xeb, 0x97, 0xb8, 0xb2, 0xf1, 0x97, 0xeb, 0x27, 0x1b, + 0xea, 0x62, 0x2d, 0x77, 0xc2, 0x1e, 0xff, 0xf4, 0x0a, 0xc3, 0xc6, 0x7b, + 0x80, 0x2f, 0x2c, 0xa8, 0x3f, 0x4e, 0x95, 0x5f, 0xd1, 0xd8, 0xec, 0x6c, + 0xb2, 0xff, 0xf6, 0x48, 0xdf, 0xe9, 0x7b, 0x84, 0x62, 0xac, 0xad, 0x8f, + 0xde, 0x45, 0xb7, 0x3f, 0x16, 0x5b, 0xb0, 0x6e, 0x5c, 0x8e, 0xfd, 0x2e, + 0x82, 0x34, 0xb2, 0xff, 0xe7, 0x66, 0xa3, 0x79, 0xef, 0x20, 0x71, 0x65, + 0x7c, 0x7d, 0xfd, 0x28, 0xbf, 0x60, 0x19, 0x1c, 0x59, 0x4b, 0x2e, 0xc9, + 0xb4, 0x6c, 0xb8, 0x4f, 0x7f, 0xc6, 0x06, 0xdf, 0x60, 0x42, 0xd9, 0x65, + 0xff, 0x46, 0xd1, 0xf7, 0x8b, 0x36, 0x59, 0x58, 0x8a, 0x50, 0x96, 0x99, + 0xf5, 0xff, 0xc2, 0x70, 0xf9, 0x31, 0x8f, 0x0b, 0xf5, 0x97, 0xcc, 0x28, + 0xf9, 0x65, 0x0c, 0xfa, 0x1d, 0x1a, 0xa6, 0x4e, 0xc7, 0x50, 0xfa, 0xec, + 0x25, 0xaf, 0xb3, 0xb9, 0xb2, 0xcb, 0xd2, 0x7d, 0x2c, 0xbf, 0xbf, 0x63, + 0xcb, 0x06, 0xb2, 0xfb, 0x3d, 0x83, 0x49, 0x7f, 0xce, 0x42, 0xe1, 0x3f, + 0xb8, 0xb2, 0xf9, 0xc5, 0xfd, 0xa5, 0x95, 0x23, 0xfd, 0xe9, 0x09, 0x1b, + 0xdf, 0x41, 0x14, 0x2c, 0xa9, 0x93, 0x14, 0xd0, 0xe7, 0xa1, 0x56, 0x21, + 0x75, 0xf7, 0xfc, 0x66, 0x96, 0x50, 0xa9, 0xcf, 0x9c, 0x66, 0xde, 0x45, + 0xbf, 0xe2, 0xce, 0xe4, 0xee, 0xe6, 0xcb, 0x2f, 0xff, 0x8b, 0x3c, 0x78, + 0x5d, 0xcf, 0x74, 0xc2, 0xb2, 0xff, 0xbc, 0x6c, 0xe7, 0x60, 0x42, 0x59, + 0x7f, 0xef, 0xe0, 0x82, 0xfe, 0x7f, 0xbf, 0x9c, 0x88, 0x5f, 0x93, 0x2f, + 0xe0, 0x36, 0xcf, 0x5a, 0xc5, 0x97, 0xfb, 0xb8, 0x2b, 0xc1, 0xee, 0x2c, + 0xba, 0x36, 0x59, 0x7b, 0xb1, 0x32, 0xcb, 0xfd, 0x06, 0x59, 0xb0, 0x92, + 0x59, 0x6f, 0x86, 0x7c, 0xf8, 0x2f, 0xd1, 0xdb, 0x70, 0x28, 0xd1, 0x04, + 0x27, 0x2f, 0xbc, 0x2e, 0x75, 0x65, 0xda, 0x92, 0xcb, 0xff, 0x16, 0x7b, + 0xc0, 0xdb, 0xd8, 0x15, 0x97, 0xe1, 0x81, 0xf5, 0x25, 0x96, 0xe2, 0xcb, + 0x8f, 0xf5, 0x97, 0x74, 0xd6, 0x5c, 0x0e, 0x4e, 0x35, 0xb3, 0x0b, 0xd3, + 0x9f, 0x77, 0xe7, 0xd7, 0x7f, 0x0b, 0x2e, 0xfe, 0x16, 0x5f, 0x81, 0x2c, + 0x29, 0xe6, 0x6b, 0xbf, 0x17, 0xa8, 0x4e, 0x78, 0x64, 0x62, 0x8b, 0x99, + 0xff, 0xf0, 0x96, 0x25, 0x0b, 0xff, 0xec, 0x27, 0xfb, 0x82, 0x8a, 0xf3, + 0x82, 0xcf, 0xd6, 0x5f, 0xf6, 0x1f, 0xde, 0xd4, 0x67, 0xcb, 0x2f, 0xfe, + 0xf7, 0x71, 0x82, 0x47, 0xf9, 0xf7, 0x96, 0x5f, 0xef, 0x82, 0x7a, 0x12, + 0x06, 0xb2, 0xfb, 0xf6, 0x3c, 0xa7, 0x26, 0x14, 0x4a, 0xbc, 0x39, 0xf2, + 0x3d, 0xc0, 0xf2, 0xcb, 0xfb, 0xf6, 0x09, 0xc1, 0x36, 0x59, 0x7f, 0x70, + 0xc8, 0xa3, 0xe5, 0x97, 0x67, 0xcb, 0x2b, 0xe3, 0xf6, 0xf1, 0x9e, 0xe1, + 0x65, 0xff, 0xe1, 0x21, 0xa8, 0x9a, 0x4e, 0x59, 0xf7, 0x96, 0x5f, 0x7f, + 0xa3, 0xd2, 0xca, 0x84, 0xe1, 0xa4, 0xae, 0xf0, 0x8d, 0xe1, 0x9b, 0x49, + 0x97, 0xfe, 0x0e, 0xa1, 0x87, 0x34, 0x3e, 0xea, 0xcb, 0xc0, 0xfb, 0xcb, + 0x2c, 0xeb, 0x28, 0x8f, 0xbf, 0x88, 0x3e, 0x1e, 0xbb, 0x1a, 0x59, 0x7f, + 0xd1, 0xf6, 0x7f, 0x1b, 0xf3, 0x65, 0x97, 0xf1, 0x67, 0xb8, 0xff, 0xac, + 0xad, 0x22, 0x03, 0xf1, 0x7e, 0x1e, 0x5f, 0xe2, 0xd8, 0xf5, 0xf7, 0x76, + 0x59, 0x7f, 0xd1, 0xb7, 0x35, 0x81, 0x8d, 0x96, 0x5f, 0xec, 0x2d, 0xb0, + 0x6f, 0xd5, 0x95, 0x31, 0xf6, 0x34, 0x75, 0x7f, 0x63, 0x30, 0x66, 0xd2, + 0xcb, 0x99, 0x0b, 0x29, 0x87, 0x86, 0xe5, 0xb7, 0xf1, 0x64, 0xdd, 0x3f, + 0x2c, 0xbe, 0xcc, 0xef, 0x16, 0x54, 0x26, 0xf1, 0x90, 0xa2, 0x76, 0x7f, + 0x10, 0xb7, 0x96, 0xde, 0x69, 0xa6, 0x92, 0x5f, 0xb0, 0x52, 0x07, 0x12, + 0x4f, 0x34, 0x17, 0xd3, 0xda, 0x69, 0xa5, 0x97, 0x67, 0xeb, 0x2b, 0x0d, + 0xff, 0x8a, 0x2a, 0x11, 0x33, 0xe7, 0x9b, 0xff, 0xe3, 0x93, 0xf1, 0x8c, + 0x79, 0x38, 0xbd, 0x35, 0x97, 0xc7, 0xaf, 0xf8, 0xb2, 0xff, 0xe8, 0x03, + 0x6f, 0x37, 0x0b, 0x1a, 0x7f, 0xd6, 0x5f, 0xf7, 0x35, 0x00, 0xf1, 0x1e, + 0xf5, 0x97, 0xfe, 0x2c, 0xe0, 0x7a, 0x61, 0x82, 0x59, 0x7f, 0xff, 0x85, + 0x69, 0xf4, 0x2c, 0xfe, 0x64, 0x88, 0x0f, 0xcc, 0x25, 0x95, 0x08, 0xda, + 0xc3, 0xa3, 0x3c, 0xbf, 0xb4, 0x00, 0xf4, 0xf8, 0xb2, 0xf9, 0xa7, 0x29, + 0x2c, 0xbf, 0xef, 0x47, 0xdf, 0xbf, 0x7a, 0x6b, 0x2d, 0xd5, 0x95, 0x87, + 0x96, 0x13, 0xab, 0xee, 0x1b, 0x21, 0x65, 0xf8, 0xb3, 0xd1, 0xa5, 0x97, + 0x9a, 0x69, 0xa4, 0x97, 0xe7, 0x17, 0xa7, 0xe4, 0x93, 0xcd, 0x05, 0x42, + 0x20, 0x0d, 0x1a, 0xf6, 0xf8, 0x62, 0xcb, 0xde, 0x36, 0x96, 0x5e, 0xe3, + 0xe9, 0x65, 0x7c, 0x6e, 0x7c, 0x3b, 0x7b, 0xb0, 0x35, 0x95, 0x88, 0x95, + 0x35, 0x77, 0x22, 0xbe, 0xff, 0x32, 0x65, 0x97, 0xdc, 0xc2, 0xf2, 0xca, + 0xc3, 0xc4, 0x72, 0x3b, 0x72, 0x72, 0xa0, 0x9f, 0x88, 0x75, 0x0a, 0x1e, + 0xc2, 0xd8, 0x9c, 0x6d, 0x21, 0xaa, 0xd4, 0xc9, 0x4e, 0xd4, 0xd9, 0x56, + 0x66, 0x09, 0x60, 0x57, 0xe6, 0xdf, 0x63, 0x60, 0x2c, 0xbf, 0xf8, 0xfd, + 0x1a, 0xc2, 0xf3, 0xb9, 0x2c, 0xa9, 0x97, 0x51, 0x74, 0x47, 0xd8, 0xc9, + 0x4a, 0x5b, 0x00, 0x0c, 0x37, 0x96, 0xdf, 0x07, 0x51, 0x25, 0x97, 0x6f, + 0x85, 0x97, 0xfe, 0x3d, 0x07, 0xa6, 0x1e, 0x99, 0x2c, 0xbf, 0xff, 0xfc, + 0xe5, 0xff, 0xbb, 0x8c, 0xf7, 0x33, 0x7f, 0x4c, 0x3d, 0x31, 0x01, 0xb2, + 0xca, 0xd9, 0x17, 0x3f, 0x9e, 0xd4, 0x23, 0xdb, 0x21, 0xa3, 0x58, 0xbe, + 0x76, 0x73, 0xb2, 0x8e, 0xd2, 0x51, 0x8c, 0x5e, 0x28, 0xde, 0xb2, 0xff, + 0xed, 0x40, 0x7a, 0x4f, 0xe2, 0x86, 0x96, 0x5c, 0xdb, 0x35, 0x97, 0x1f, + 0x56, 0x56, 0xc6, 0xc3, 0x43, 0x55, 0x08, 0x95, 0x77, 0x3b, 0xd3, 0x3e, + 0xcb, 0x2f, 0x70, 0x1b, 0xab, 0x2b, 0x0d, 0xf7, 0x87, 0xaf, 0xf4, 0x14, + 0x88, 0xe3, 0xe5, 0x95, 0x0d, 0xd5, 0x64, 0xa3, 0x89, 0x1c, 0x34, 0x72, + 0x52, 0x28, 0xb1, 0xed, 0x84, 0xdf, 0xe8, 0x5f, 0x9a, 0xdc, 0xd1, 0x81, + 0x6a, 0x3c, 0xce, 0xca, 0xec, 0x78, 0x5f, 0x7f, 0x0a, 0xe2, 0x8e, 0xa7, + 0x91, 0x84, 0xfa, 0x7d, 0x77, 0x7a, 0x56, 0xe4, 0x2c, 0x84, 0x5f, 0x6f, + 0x20, 0xbf, 0x1c, 0xd2, 0x32, 0x59, 0x73, 0x74, 0x6b, 0x2f, 0xfa, 0x6f, + 0x37, 0xf2, 0x26, 0x06, 0x96, 0x5f, 0xe1, 0xc1, 0x32, 0x07, 0x0b, 0x2a, + 0x0f, 0xc1, 0xcf, 0xef, 0xfe, 0x22, 0x7f, 0xbd, 0xd8, 0x0e, 0x4c, 0xb2, + 0xfe, 0xda, 0x08, 0xd9, 0x8b, 0x2f, 0xfe, 0xc3, 0xec, 0x0f, 0xa0, 0x8f, + 0xb8, 0xb2, 0xf0, 0xc5, 0xfd, 0x65, 0xf9, 0x9a, 0xd3, 0xf9, 0x65, 0x4e, + 0x3c, 0x78, 0x1f, 0xbf, 0xfa, 0x67, 0x0f, 0x62, 0x5e, 0x2c, 0x62, 0xcb, + 0xfb, 0x58, 0x44, 0xfb, 0x2c, 0xa0, 0x9f, 0x81, 0xa2, 0x5f, 0xfd, 0x0d, + 0x7d, 0x2e, 0x4e, 0xce, 0xe1, 0x2c, 0xbf, 0xfe, 0x36, 0x7d, 0x2e, 0x4e, + 0xc2, 0x2c, 0x3f, 0xd6, 0x5e, 0x3e, 0x81, 0x65, 0x4e, 0x56, 0x6a, 0xdd, + 0x93, 0xca, 0x11, 0x78, 0x40, 0x68, 0x9a, 0x2c, 0xec, 0x22, 0xde, 0x12, + 0x64, 0x43, 0xe4, 0x7d, 0xea, 0x36, 0x9e, 0xdd, 0xca, 0x68, 0x69, 0x6e, + 0xa1, 0x34, 0xd8, 0x8e, 0x29, 0xb9, 0x8e, 0xf9, 0xb3, 0x0c, 0x16, 0xd5, + 0x8d, 0xad, 0xb8, 0xc6, 0xdc, 0xda, 0xd2, 0x9b, 0x48, 0x50, 0xc5, 0x75, + 0x5f, 0xb4, 0xff, 0xbc, 0xa9, 0xca, 0x43, 0xac, 0x76, 0x32, 0xf4, 0x34, + 0xc5, 0x9c, 0xa0, 0x0d, 0x67, 0x11, 0xf5, 0x3f, 0xd8, 0xeb, 0x0e, 0xed, + 0xd9, 0x4a, 0xb3, 0x56, 0xb4, 0x9a, 0xad, 0x82, 0x59, 0x4d, 0xc8, 0xed, + 0xa8, 0x8b, 0x7b, 0x4f, 0xef, 0xfd, 0x3d, 0x71, 0xb7, 0x19, 0x11, 0x5a, + 0x58, 0x3e, 0x5e, 0xdf, 0x17, 0xad, 0xb1, 0xa8, 0x27, 0xd1, 0xb7, 0xcb, + 0xa2, 0x6a, 0x71, 0xfb, 0x72, 0x99, 0x18, 0x25, 0x7b, 0x5a, 0xdf, 0x39, + 0x45, 0x53, 0xe5, 0x36, 0x27, 0xcb, 0x53, 0x48, 0x9d, 0xe6, 0x67, 0x96, + 0x5f, 0xe7, 0x64, 0x78, 0xf8, 0x6b, 0x2f, 0xd9, 0xa1, 0x3d, 0xc5, 0x96, + 0x9f, 0xf9, 0xfb, 0x10, 0xe7, 0x0c, 0x6f, 0xf4, 0xfc, 0xd0, 0x5d, 0xc2, + 0xa8, 0xb8, 0xd7, 0xfa, 0x7e, 0x68, 0x2e, 0xe1, 0x54, 0x5d, 0x6b, 0xff, + 0xa7, 0xbc, 0xa7, 0xe6, 0x82, 0xee, 0x15, 0x44, 0xa2, 0xa8, 0x94, 0xe9, + 0x29, 0x28, 0x54, 0x0c, 0xa8, 0x58, 0x49, 0x84, 0xa4, 0xe5, 0xe8, 0x6e, + 0xc3, 0x31, 0xf5, 0x36, 0x54, 0xff, 0x0b, 0x4e, 0x1b, 0xf9, 0x05, 0xbd, + 0x06, 0xff, 0xf4, 0xf6, 0x3c, 0xa7, 0xe6, 0x82, 0xee, 0x15, 0x44, 0xb4, + 0xbf, 0xe6, 0xe1, 0xd3, 0xdd, 0x78, 0xf9, 0xbd, 0x65, 0xe7, 0x70, 0xaa, + 0x23, 0x75, 0xfb, 0xe9, 0x8a, 0x06, 0xb2, 0xda, 0x09, 0xe8, 0xb9, 0x45, + 0xfe, 0xd1, 0xb6, 0xc3, 0xd8, 0x69, 0x65, 0xf6, 0x81, 0x1f, 0xac, 0xa3, + 0x3d, 0xb1, 0x0e, 0x2f, 0xff, 0xff, 0xb7, 0x96, 0x73, 0x83, 0x8c, 0xd0, + 0x5d, 0xc3, 0x3e, 0x47, 0xe8, 0xf7, 0x15, 0x18, 0x7a, 0xdd, 0x84, 0x57, + 0x19, 0x15, 0xfb, 0x50, 0xd3, 0x06, 0xb2, 0xff, 0xcf, 0x29, 0xf9, 0xa0, + 0xbb, 0x85, 0x51, 0x2f, 0xaf, 0xde, 0x13, 0xaf, 0xe5, 0x97, 0xf0, 0x87, + 0xf3, 0x7e, 0x9a, 0x59, 0x50, 0x7b, 0xa6, 0x53, 0x7f, 0x41, 0xee, 0xe7, + 0xd2, 0x59, 0x7e, 0xd0, 0xbd, 0x07, 0x16, 0x57, 0x4f, 0x68, 0x43, 0x0b, + 0xd1, 0xa8, 0x59, 0x58, 0x6f, 0x8c, 0x8e, 0xf4, 0x9f, 0xab, 0x2f, 0x7f, + 0x0d, 0x2c, 0xbf, 0xd8, 0x7a, 0x97, 0x4d, 0xa5, 0x95, 0xba, 0x7a, 0x3d, + 0x1e, 0xbe, 0x07, 0x4f, 0x4b, 0x2f, 0xf4, 0x6d, 0x05, 0xb6, 0x37, 0xac, + 0xbb, 0x9a, 0x59, 0x5b, 0x1e, 0x6c, 0xc6, 0xd6, 0x9e, 0xda, 0xd7, 0x2e, + 0xf2, 0x12, 0xc1, 0x8c, 0xc3, 0x44, 0xec, 0x29, 0xec, 0x2a, 0x4a, 0x17, + 0x1c, 0x1f, 0xf3, 0x6e, 0xe1, 0x28, 0x8d, 0xf7, 0xff, 0xe2, 0x80, 0xcf, + 0xf7, 0xc1, 0x3e, 0x16, 0x6f, 0x75, 0x97, 0xff, 0x4b, 0xc7, 0x34, 0xf1, + 0x9e, 0xf8, 0x1a, 0xcb, 0xfd, 0x3f, 0xf7, 0xfb, 0xf3, 0xf9, 0x65, 0x0d, + 0x1b, 0x5f, 0x2c, 0x12, 0x4d, 0xfe, 0x9f, 0x9a, 0x0b, 0xb8, 0x55, 0x15, + 0x5a, 0xe3, 0x6f, 0x59, 0x76, 0x69, 0x65, 0xf1, 0xb1, 0xf7, 0xac, 0xa1, + 0x4f, 0x49, 0xc6, 0x7c, 0x2d, 0x78, 0x9b, 0xda, 0x59, 0x7f, 0x76, 0x37, + 0x80, 0x78, 0xb2, 0xfe, 0x7e, 0xcc, 0x50, 0x35, 0x97, 0xff, 0x7b, 0xb1, + 0xc2, 0x70, 0x36, 0xcf, 0x4b, 0x2f, 0x44, 0xb1, 0x65, 0xfc, 0x60, 0x09, + 0x44, 0xcb, 0x2a, 0x48, 0xeb, 0x19, 0x7f, 0xc5, 0xb3, 0x23, 0xf4, 0x6e, + 0xff, 0x85, 0xc2, 0xcf, 0xbc, 0xec, 0x59, 0x79, 0xbe, 0x3c, 0xb2, 0xff, + 0x6a, 0x18, 0x24, 0x10, 0x56, 0x5e, 0xf9, 0xfe, 0x59, 0x7b, 0xcf, 0xf2, + 0xcb, 0xff, 0xf6, 0x4b, 0xaf, 0x21, 0x5f, 0x98, 0x0e, 0x70, 0xd6, 0x53, + 0x9f, 0x91, 0x0e, 0xdc, 0x33, 0x59, 0x7f, 0x66, 0x82, 0xee, 0x15, 0x44, + 0x80, 0xa9, 0xc7, 0x9f, 0x3c, 0x5a, 0xfd, 0xc7, 0x27, 0xf9, 0x65, 0xd8, + 0x4b, 0x2e, 0x04, 0x2c, 0xa9, 0x1f, 0xc7, 0xc4, 0xdb, 0xa4, 0xfa, 0x15, + 0xbf, 0xa3, 0x5b, 0x46, 0xb6, 0x59, 0x7c, 0x6c, 0x8e, 0x2c, 0xa9, 0x1e, + 0x80, 0xa5, 0xf7, 0xfb, 0x5b, 0x32, 0x0a, 0x5c, 0x59, 0x50, 0x7a, 0xf8, + 0x47, 0x7b, 0x67, 0x1a, 0xcb, 0xfc, 0x13, 0xc6, 0x80, 0x5e, 0x59, 0x58, + 0x7a, 0x1f, 0x0e, 0xde, 0xe7, 0x24, 0xb2, 0xe6, 0xc7, 0x56, 0x5f, 0xfe, + 0xc9, 0xba, 0xec, 0xf7, 0x63, 0xc0, 0x62, 0xcb, 0xcd, 0xf1, 0xe5, 0x95, + 0xb2, 0xed, 0x18, 0xcb, 0xf2, 0x30, 0xb1, 0x53, 0x37, 0x4e, 0x66, 0x1f, + 0x61, 0x9f, 0x61, 0x20, 0xf0, 0xe7, 0x28, 0x73, 0xf9, 0xc0, 0x04, 0x5b, + 0x83, 0xa2, 0x0d, 0xb7, 0xa5, 0xdf, 0xfa, 0x51, 0x9f, 0xf7, 0x30, 0x82, + 0xb2, 0xfd, 0x04, 0x59, 0xe5, 0x97, 0xda, 0xd1, 0x85, 0x65, 0xf1, 0x66, + 0xd3, 0xf1, 0x10, 0x9b, 0x87, 0xa2, 0x12, 0xdf, 0xe9, 0xfd, 0x76, 0x64, + 0x0d, 0x65, 0x4f, 0x4f, 0xcb, 0x51, 0xb9, 0x6e, 0x26, 0x5f, 0xe9, 0xf9, + 0xa0, 0xbb, 0x85, 0x51, 0x64, 0x2f, 0xf8, 0xf8, 0x7b, 0xe7, 0xf2, 0x3e, + 0x59, 0x7f, 0xa7, 0xe6, 0x82, 0xee, 0x15, 0x45, 0xae, 0xbf, 0xfd, 0x82, + 0x46, 0xd3, 0xf2, 0x6f, 0x0e, 0x09, 0x65, 0xfe, 0x9f, 0x9a, 0x0b, 0xb8, + 0x55, 0x17, 0x22, 0xfd, 0xa0, 0xbb, 0x85, 0x51, 0x76, 0x2f, 0xfc, 0xf2, + 0x9f, 0x9a, 0x0b, 0xb8, 0x55, 0x14, 0x72, 0xd3, 0xf1, 0x10, 0x0c, 0x34, + 0xbe, 0x28, 0x93, 0x16, 0x5f, 0xf9, 0xb2, 0xd8, 0x64, 0x6a, 0x58, 0x7b, + 0xd6, 0x5a, 0x4b, 0x2f, 0xda, 0x0b, 0xb8, 0x55, 0x14, 0xaa, 0xff, 0x83, + 0xd3, 0x9b, 0xb1, 0xb6, 0x2c, 0xbf, 0xfd, 0xd8, 0xda, 0x3a, 0x7b, 0xdc, + 0x7d, 0x35, 0x93, 0xcd, 0xd5, 0xd2, 0x9f, 0x88, 0xcb, 0x99, 0xba, 0xbe, + 0x4c, 0x35, 0xe1, 0xb9, 0x7f, 0xe7, 0x3f, 0x48, 0x03, 0x72, 0xfd, 0x65, + 0xdd, 0x02, 0xcb, 0x4f, 0x1a, 0x7e, 0x9f, 0x10, 0xb2, 0x35, 0x5e, 0x94, + 0xf0, 0xfa, 0xb6, 0x6c, 0xe2, 0x25, 0x3a, 0x2b, 0x91, 0xcd, 0x7c, 0x60, + 0x74, 0x82, 0x86, 0x1e, 0x3a, 0x0f, 0xe7, 0xa4, 0x83, 0xc4, 0xdf, 0x43, + 0x07, 0x7c, 0xa1, 0xeb, 0xfe, 0x94, 0xfc, 0xd0, 0x5d, 0xc2, 0xa8, 0x8e, + 0x17, 0xfc, 0x73, 0xf3, 0x41, 0x77, 0x0a, 0xa2, 0xb5, 0x5a, 0x7b, 0xa2, + 0x37, 0xc8, 0xf7, 0xff, 0xa7, 0xb1, 0xe5, 0x3f, 0x34, 0x17, 0x70, 0xaa, + 0x25, 0xb5, 0xe0, 0x6b, 0xf5, 0x97, 0x67, 0xcb, 0x2f, 0xf0, 0xf1, 0x8c, + 0x83, 0xe2, 0xcb, 0xf7, 0xa3, 0xa2, 0x71, 0x65, 0xed, 0xe0, 0x92, 0xca, + 0x0a, 0x2b, 0xfe, 0x1e, 0x31, 0x72, 0x32, 0xde, 0x53, 0x7b, 0xa3, 0x92, + 0xcb, 0xf1, 0xb7, 0x8e, 0x3e, 0x59, 0x7f, 0xd9, 0xf1, 0x67, 0xff, 0xbc, + 0x96, 0x5c, 0xc0, 0xac, 0xbf, 0xd8, 0x7f, 0x70, 0x78, 0x4b, 0x2f, 0xff, + 0xa0, 0xb6, 0xe0, 0x1c, 0xe5, 0xce, 0xbc, 0x96, 0x54, 0x23, 0x4a, 0x47, + 0x5a, 0x17, 0xe9, 0x95, 0xf1, 0x47, 0xd2, 0x59, 0x7f, 0x6d, 0x01, 0x7d, + 0x7e, 0xb2, 0xff, 0xfc, 0xff, 0x7e, 0x3e, 0xbc, 0xb3, 0x84, 0x07, 0x11, + 0x65, 0xf7, 0xf9, 0xa9, 0x96, 0x5e, 0xf4, 0x31, 0x65, 0x05, 0x1d, 0x1a, + 0x22, 0xe9, 0x7f, 0xea, 0xed, 0xe4, 0x97, 0xff, 0x0b, 0x05, 0xec, 0xd1, + 0xec, 0xec, 0x59, 0x7c, 0xf2, 0x14, 0xd6, 0x58, 0x55, 0x9d, 0x34, 0x57, + 0xf1, 0xe8, 0x8f, 0xdc, 0x59, 0x7e, 0xd3, 0x96, 0x42, 0xca, 0x54, 0x43, + 0x63, 0x3f, 0x3e, 0x91, 0x39, 0x65, 0xd0, 0x4b, 0x2f, 0x61, 0x8d, 0x65, + 0xe1, 0xe3, 0x16, 0x5c, 0x64, 0x33, 0x6e, 0x63, 0x75, 0x07, 0xed, 0x24, + 0xcb, 0xf8, 0x3d, 0x3d, 0x40, 0xd6, 0x5f, 0x64, 0xd2, 0xc5, 0x97, 0xfe, + 0x79, 0x4f, 0xcd, 0x05, 0xdc, 0x2a, 0x89, 0x81, 0x7e, 0x03, 0xf8, 0xfc, + 0xb2, 0xee, 0x42, 0xca, 0x83, 0x7a, 0x02, 0x7b, 0xcd, 0x1f, 0xeb, 0x2f, + 0xb8, 0xe5, 0xfa, 0xca, 0x98, 0xf0, 0x3f, 0x1e, 0xbf, 0xc0, 0xfb, 0x47, + 0x0c, 0xc5, 0x97, 0xee, 0x9c, 0x16, 0xcb, 0x2f, 0xfa, 0x36, 0xf1, 0x40, + 0x3d, 0xc5, 0x95, 0xd4, 0x49, 0xf0, 0xcf, 0x70, 0x9e, 0xf8, 0xb3, 0x90, + 0xb2, 0xbc, 0x7a, 0x7b, 0xcc, 0xef, 0x48, 0xff, 0x59, 0x7d, 0xf0, 0x4c, + 0x55, 0x97, 0xe7, 0x17, 0x3a, 0xeb, 0x2b, 0x11, 0x19, 0x31, 0x27, 0x87, + 0x40, 0x49, 0x7f, 0x1f, 0xb1, 0x91, 0xd5, 0x97, 0xfc, 0x7f, 0xed, 0xd8, + 0xe0, 0x38, 0xb2, 0xff, 0x49, 0xfd, 0xc3, 0x28, 0x59, 0x68, 0xd1, 0xf6, + 0x11, 0xdd, 0x69, 0x17, 0xde, 0x84, 0xc5, 0xff, 0xb1, 0x99, 0xac, 0xfa, + 0x59, 0xe5, 0x97, 0xf1, 0xf4, 0xd9, 0x82, 0xac, 0xae, 0x9f, 0x5f, 0x0f, + 0xaf, 0xff, 0x3e, 0xdd, 0x38, 0x2c, 0x98, 0xf4, 0x6b, 0x2b, 0x11, 0xfb, + 0xe8, 0x49, 0xb4, 0x45, 0x6d, 0xc5, 0x97, 0x07, 0x16, 0x5c, 0x0f, 0xd2, + 0x56, 0xc7, 0x84, 0x62, 0x9a, 0x16, 0xbf, 0x0b, 0x12, 0xc1, 0xac, 0xbf, + 0xd8, 0x32, 0xcf, 0x77, 0x16, 0x5c, 0xd9, 0x0a, 0xe3, 0x0a, 0x5e, 0xdb, + 0xdf, 0xac, 0xbf, 0x09, 0xb8, 0xe5, 0xfa, 0xcb, 0xfb, 0x3a, 0xe2, 0x17, + 0x96, 0x56, 0xc7, 0xb2, 0x32, 0xcb, 0xfb, 0x3d, 0xe8, 0xd7, 0x16, 0x5f, + 0xce, 0x5f, 0xed, 0xff, 0x96, 0x54, 0x22, 0x00, 0x88, 0xf7, 0x0b, 0x6d, + 0x3e, 0x19, 0x73, 0xdb, 0x25, 0xc8, 0x74, 0x70, 0xfd, 0xc8, 0xc9, 0x05, + 0x4e, 0x0c, 0x36, 0x7e, 0x85, 0xbc, 0xc4, 0x3a, 0x2d, 0x61, 0x17, 0x61, + 0x12, 0xec, 0x05, 0x1c, 0xb7, 0x23, 0xf8, 0xf3, 0xb8, 0x0b, 0xf7, 0x94, + 0x34, 0x63, 0xb8, 0x50, 0x24, 0x3e, 0x2f, 0x30, 0x1a, 0x49, 0x7f, 0xe7, + 0x94, 0xfc, 0xd0, 0x5d, 0xc2, 0xa8, 0x98, 0xd7, 0x43, 0x7a, 0xcb, 0xb5, + 0x8b, 0x2d, 0x1a, 0x35, 0xfd, 0x19, 0xb4, 0xf3, 0x45, 0xf3, 0x07, 0x7a, + 0xf7, 0x7f, 0xc3, 0x3d, 0xf3, 0xfe, 0xfc, 0x49, 0x2c, 0xbe, 0x6d, 0x1b, + 0x56, 0x43, 0x59, 0x7d, 0x1b, 0x46, 0x96, 0x5e, 0xf4, 0x4c, 0xb2, 0xfd, + 0x91, 0x31, 0xb1, 0x65, 0xf6, 0xc0, 0x1e, 0xea, 0xcb, 0xfe, 0x6f, 0x3f, + 0xe7, 0x64, 0xd0, 0xc5, 0x94, 0x68, 0xcc, 0x98, 0x8b, 0x43, 0xa2, 0x13, + 0xb7, 0x93, 0xda, 0x4b, 0x2f, 0xcc, 0x8c, 0xf7, 0x16, 0x53, 0x72, 0x6e, + 0x06, 0x23, 0x7f, 0xbb, 0x1a, 0xd8, 0x40, 0x7e, 0xb2, 0xf8, 0x1b, 0x39, + 0x2c, 0xb9, 0xf8, 0xb2, 0xfa, 0x77, 0xb3, 0xab, 0x2d, 0x1d, 0x37, 0x5c, + 0x16, 0xbd, 0x05, 0xb2, 0xcb, 0xff, 0xff, 0xe9, 0x73, 0xb8, 0x06, 0xb9, + 0xdc, 0x0e, 0x72, 0x76, 0x7d, 0x2e, 0x19, 0x1a, 0xcb, 0xce, 0xe1, 0x54, + 0x56, 0x2b, 0xe7, 0x12, 0x05, 0x59, 0x41, 0x3c, 0xbd, 0x14, 0x5f, 0xba, + 0x6c, 0x8d, 0x2c, 0xbf, 0xfc, 0x07, 0xdb, 0x58, 0xce, 0xc6, 0xc4, 0x05, + 0x94, 0x67, 0xe4, 0x44, 0xf7, 0xfe, 0xdc, 0xcf, 0x16, 0x02, 0x0b, 0xcb, + 0x2f, 0xf1, 0x67, 0x3f, 0xcc, 0x1a, 0xca, 0x15, 0x51, 0x90, 0x49, 0xbe, + 0x1c, 0xd4, 0x32, 0xfb, 0x09, 0x4f, 0x10, 0x6f, 0x3f, 0xbf, 0xf8, 0x50, + 0x7b, 0x85, 0x9b, 0xcb, 0x38, 0xb2, 0xff, 0xe2, 0xf0, 0xa0, 0x82, 0xc0, + 0xc6, 0x96, 0x5f, 0xed, 0x6d, 0xee, 0x3f, 0xc1, 0x59, 0x50, 0x7f, 0x2e, + 0x87, 0x7f, 0xd2, 0xcf, 0x61, 0x43, 0x5b, 0x8b, 0x2f, 0xfd, 0xd8, 0xde, + 0xfa, 0x0f, 0x5d, 0xbd, 0x65, 0xf9, 0xbf, 0xd9, 0xf4, 0xcb, 0x2f, 0xb9, + 0x31, 0x8a, 0xb2, 0xff, 0xff, 0xff, 0x3f, 0xbd, 0x9d, 0xe3, 0xc8, 0xcb, + 0xd2, 0xcd, 0x67, 0x33, 0xaf, 0xb1, 0x44, 0x96, 0x5e, 0xf4, 0x4c, 0xb2, + 0xa1, 0x1f, 0x38, 0x5b, 0xc2, 0x41, 0x21, 0x17, 0x7f, 0x03, 0x70, 0x3d, + 0x36, 0xda, 0xcb, 0xef, 0xa5, 0x1d, 0x59, 0x7f, 0xb8, 0x3e, 0xe0, 0x41, + 0xba, 0xb2, 0xd9, 0xc3, 0xda, 0x01, 0x1d, 0xd1, 0xbd, 0x65, 0x74, 0xdf, + 0x91, 0x3d, 0xfe, 0x99, 0xf0, 0xe4, 0x23, 0x16, 0x50, 0xcf, 0x50, 0xc8, + 0x2f, 0xf7, 0xd2, 0x9a, 0x4f, 0xad, 0x96, 0x5f, 0x4b, 0xc7, 0xb2, 0xca, + 0x83, 0xda, 0x73, 0x7a, 0x84, 0xef, 0x72, 0x32, 0x23, 0x7b, 0xbd, 0x12, + 0xf2, 0xcb, 0xfd, 0xa3, 0x06, 0xdf, 0xf2, 0x4b, 0x2f, 0x1c, 0x6c, 0xb2, + 0x86, 0x7a, 0x53, 0x1b, 0x5f, 0x83, 0xd8, 0x21, 0x56, 0x56, 0x1e, 0x5b, + 0x91, 0xdf, 0x31, 0xfe, 0xf2, 0xcb, 0xff, 0xb6, 0x8f, 0x4e, 0x10, 0x22, + 0x37, 0x89, 0xc5, 0x97, 0xff, 0x3e, 0xee, 0x13, 0x8d, 0xf3, 0xef, 0x2c, + 0xbf, 0xed, 0x47, 0x1f, 0x45, 0x12, 0x59, 0x5a, 0x46, 0x5f, 0x53, 0xf7, + 0xa2, 0xde, 0x93, 0xec, 0xb2, 0xf4, 0xed, 0x98, 0xb2, 0xfe, 0x28, 0xd8, + 0xa3, 0x65, 0x96, 0xf2, 0xcb, 0xff, 0x0b, 0xce, 0x67, 0x4f, 0x80, 0xd9, + 0x65, 0x0c, 0xf4, 0x80, 0x23, 0x4d, 0x94, 0xff, 0xb2, 0x1d, 0xdf, 0x19, + 0x18, 0xeb, 0x90, 0x13, 0xfd, 0xff, 0x89, 0xc7, 0xd8, 0xdf, 0xd7, 0x25, + 0x97, 0xff, 0xfe, 0x06, 0xd8, 0x19, 0xc4, 0x06, 0xf9, 0xd9, 0xf4, 0xb0, + 0x05, 0xff, 0x16, 0x5f, 0xfe, 0xdb, 0x3e, 0xf7, 0x0c, 0xa3, 0xf7, 0x62, + 0xcb, 0xfd, 0xf1, 0x60, 0xfa, 0xed, 0x2c, 0xac, 0x3f, 0xf7, 0x4b, 0xa1, + 0xa6, 0xa6, 0x47, 0xdc, 0x87, 0xad, 0xf7, 0xa5, 0x06, 0xb2, 0xff, 0xb0, + 0x7b, 0x63, 0x59, 0xd7, 0x59, 0x7f, 0x6d, 0x34, 0x9b, 0x3a, 0xd9, 0x65, + 0xf1, 0x16, 0x79, 0x65, 0xf8, 0xf7, 0x75, 0xa3, 0x59, 0x4d, 0xda, 0x20, + 0x20, 0xdb, 0xa4, 0x17, 0xf6, 0xc2, 0x6e, 0x39, 0x7e, 0xb2, 0xfb, 0x76, + 0x38, 0x4b, 0x2f, 0xfd, 0xd7, 0x67, 0xbb, 0x1e, 0x03, 0x16, 0x56, 0x1f, + 0x1c, 0xc4, 0x97, 0xff, 0x66, 0x0a, 0xc8, 0x3d, 0x68, 0xda, 0x59, 0x7f, + 0xc7, 0x23, 0xe8, 0x18, 0xc3, 0x59, 0x76, 0x79, 0x65, 0x42, 0x69, 0x59, + 0x09, 0x6d, 0x11, 0x79, 0x13, 0x70, 0xe2, 0xf1, 0x3b, 0x7a, 0xcb, 0xdd, + 0x39, 0xed, 0xaa, 0xd8, 0x76, 0x44, 0x3e, 0xf6, 0x84, 0x34, 0x89, 0x86, + 0x6f, 0x92, 0xa3, 0x85, 0x74, 0x0c, 0x2f, 0xfe, 0x20, 0x33, 0xbd, 0x46, + 0x79, 0xd8, 0xff, 0x9c, 0xd0, 0xa1, 0x73, 0xc9, 0x43, 0xde, 0x8e, 0xc4, + 0x06, 0xbb, 0xc8, 0x77, 0x21, 0x72, 0x24, 0x6f, 0xcd, 0xea, 0x37, 0x9b, + 0x86, 0xe3, 0x76, 0xb2, 0xe9, 0x12, 0xcb, 0xfb, 0x5a, 0x81, 0xe3, 0x16, + 0x5b, 0x75, 0x65, 0xf6, 0xda, 0x8d, 0x96, 0x5c, 0x27, 0xeb, 0x2e, 0xff, + 0x8b, 0x2f, 0x74, 0xd8, 0xb2, 0xd3, 0x2c, 0xa3, 0x3c, 0x67, 0x18, 0x00, + 0xe5, 0xf9, 0xcb, 0x60, 0x71, 0x65, 0xfb, 0x07, 0xa7, 0x0a, 0xcb, 0xe7, + 0xda, 0x34, 0xb2, 0xe8, 0x1f, 0x4f, 0x24, 0x89, 0xe8, 0xd3, 0x8e, 0x98, + 0xb5, 0xc5, 0x3f, 0x24, 0x25, 0xfe, 0x16, 0xf9, 0xc6, 0xdd, 0x59, 0x7b, + 0x82, 0x71, 0x65, 0xf7, 0xdb, 0x40, 0xab, 0x2b, 0x63, 0xd4, 0x18, 0x88, + 0x07, 0xae, 0xf4, 0x2c, 0xbf, 0xdf, 0x6a, 0x0e, 0x4f, 0xc5, 0x97, 0xd8, + 0x51, 0x25, 0x95, 0x87, 0xa6, 0xc3, 0x3b, 0x6e, 0x2c, 0xbf, 0xd9, 0xff, + 0x33, 0xc7, 0xa5, 0x97, 0xc0, 0xf6, 0x71, 0x65, 0xc5, 0xba, 0xb2, 0xf6, + 0x9c, 0x96, 0x52, 0xcb, 0xfc, 0xd1, 0x66, 0xfd, 0x1f, 0x16, 0x5b, 0xe5, + 0x95, 0x07, 0xdb, 0x83, 0x66, 0x16, 0x03, 0x5b, 0xf6, 0x6a, 0x50, 0xc5, + 0x97, 0xf1, 0xed, 0x84, 0x62, 0xac, 0xbf, 0xcf, 0xa9, 0x7e, 0x7f, 0x71, + 0x65, 0xf7, 0x39, 0x1f, 0xac, 0xa8, 0x4f, 0xd4, 0x64, 0x38, 0x28, 0x66, + 0x6c, 0x22, 0xec, 0x21, 0x9c, 0xe4, 0x89, 0xc0, 0x5a, 0xd1, 0xad, 0xff, + 0xb0, 0xb0, 0x52, 0xcf, 0x74, 0xd6, 0x5f, 0xce, 0x2e, 0x0d, 0xe4, 0xb2, + 0xba, 0x7d, 0x24, 0x79, 0x7f, 0x19, 0x16, 0x6f, 0x75, 0x97, 0xa4, 0x27, + 0x96, 0x5e, 0xd6, 0x9d, 0x65, 0xf4, 0xbf, 0x04, 0x96, 0x5f, 0x68, 0x48, + 0xfd, 0x65, 0x41, 0xe4, 0x19, 0x25, 0xfe, 0x3d, 0x9d, 0x9f, 0xff, 0x0b, + 0x2e, 0x31, 0xac, 0xb9, 0xfe, 0x59, 0x7f, 0x83, 0xdc, 0x98, 0xa0, 0x6b, + 0x28, 0x67, 0x94, 0x62, 0xf7, 0xbc, 0x7f, 0xac, 0xbe, 0xfe, 0x08, 0x2b, + 0x28, 0x53, 0x7f, 0xf0, 0xed, 0xf4, 0xbd, 0x82, 0x2c, 0xbc, 0x18, 0xfd, + 0x65, 0xed, 0x43, 0x16, 0x51, 0x9f, 0xfb, 0x91, 0x80, 0x8d, 0xa1, 0xdb, + 0xed, 0x84, 0xc9, 0x96, 0x5e, 0x8d, 0x6c, 0xb2, 0xa0, 0xf0, 0x8c, 0x96, + 0x96, 0x5e, 0x0c, 0x7e, 0xb2, 0xe8, 0x29, 0x1a, 0x8c, 0x0b, 0xbe, 0xf1, + 0x1b, 0x7a, 0xcb, 0xd0, 0x0e, 0x2c, 0xa9, 0x2b, 0x92, 0x19, 0x0f, 0xc5, + 0x86, 0x3d, 0x33, 0x26, 0x88, 0x18, 0x6b, 0xd6, 0x02, 0x86, 0xff, 0x1f, + 0x7c, 0x90, 0x02, 0xad, 0xe4, 0x97, 0xf3, 0xc9, 0xbd, 0xbc, 0x1b, 0x2c, + 0xb1, 0x2c, 0xba, 0x5b, 0xab, 0x2b, 0xa7, 0xbf, 0xc3, 0x5f, 0x08, 0x5b, + 0x71, 0x65, 0xfd, 0x9b, 0x0f, 0xa7, 0xa5, 0x95, 0xd3, 0xc2, 0x21, 0x4b, + 0xff, 0x46, 0x72, 0x74, 0x18, 0xc4, 0x92, 0xcb, 0xf8, 0xda, 0xe6, 0xd8, + 0xd2, 0xca, 0x23, 0xf0, 0xf2, 0x05, 0xc5, 0x0b, 0x2f, 0xd0, 0x3f, 0x60, + 0x56, 0x5e, 0x82, 0x0a, 0xcb, 0xff, 0xf9, 0xda, 0x1b, 0xbe, 0xb6, 0xeb, + 0xfb, 0xa7, 0xa9, 0x2c, 0xae, 0x9f, 0xb9, 0x0d, 0xd4, 0x91, 0xea, 0x12, + 0x1e, 0x0a, 0xfa, 0x13, 0xd7, 0xce, 0x4f, 0x32, 0xcb, 0xf1, 0xf8, 0xb2, + 0x4b, 0x2f, 0xa1, 0xa8, 0x99, 0x65, 0xff, 0xb9, 0xbd, 0xfb, 0x02, 0xe7, + 0xb8, 0xb2, 0xe1, 0x18, 0xb2, 0xfc, 0x59, 0xa0, 0x62, 0xcb, 0xfb, 0xc4, + 0xff, 0xe1, 0x2c, 0xbf, 0x13, 0xff, 0x84, 0xb2, 0xc0, 0x9c, 0x7a, 0x5e, + 0x2c, 0xad, 0x93, 0x65, 0x14, 0x84, 0xc9, 0xa6, 0x23, 0xea, 0x0f, 0xe3, + 0x04, 0xf1, 0x7d, 0xcc, 0x20, 0xac, 0xbf, 0xa0, 0xbc, 0x10, 0x6c, 0xb2, + 0xff, 0x43, 0x43, 0x03, 0xea, 0x4b, 0x2f, 0x72, 0x24, 0xb2, 0xfd, 0xdc, + 0xd1, 0xf1, 0x65, 0xc7, 0xaf, 0x8f, 0x0f, 0xc3, 0x96, 0xde, 0xb2, 0xa1, + 0x30, 0x79, 0x10, 0xe8, 0xbb, 0xae, 0xed, 0xe5, 0xd7, 0x88, 0xc5, 0x59, + 0x7d, 0x83, 0x3d, 0xeb, 0x2e, 0x86, 0x61, 0xbf, 0x71, 0xcb, 0xfe, 0xc6, + 0x9f, 0xee, 0xc0, 0x84, 0xb2, 0xdc, 0x59, 0x7d, 0xce, 0xbc, 0x96, 0x51, + 0xa2, 0x5f, 0x45, 0x4e, 0x74, 0x01, 0x1b, 0xd8, 0x53, 0x2c, 0xb7, 0xcb, + 0x2e, 0xfe, 0x12, 0x5c, 0xd3, 0x49, 0x28, 0xcd, 0x83, 0x42, 0xf7, 0xe2, + 0xcf, 0x74, 0xd2, 0x4f, 0x34, 0x37, 0xc2, 0x96, 0x71, 0x65, 0x48, 0xf6, + 0x86, 0x71, 0x7f, 0x9c, 0x58, 0x22, 0xcf, 0x2c, 0xa8, 0x4c, 0xb0, 0x63, + 0x8f, 0x0b, 0xd2, 0x22, 0xbd, 0xd8, 0x69, 0x65, 0xe7, 0xfb, 0x8b, 0x2d, + 0xc5, 0x97, 0xc2, 0x75, 0xfc, 0xb2, 0xb6, 0x3e, 0xe1, 0x8e, 0xfc, 0x3b, + 0xe1, 0x1b, 0xd0, 0x53, 0x2c, 0xb8, 0xa1, 0x65, 0x2c, 0xa5, 0x95, 0x31, + 0x6c, 0xc0, 0xbb, 0xbb, 0x32, 0xcb, 0x8f, 0xf5, 0x95, 0x06, 0xbf, 0xf1, + 0x8a, 0x99, 0x17, 0x1a, 0x1c, 0x72, 0xbf, 0xd4, 0x2f, 0xfe, 0x14, 0xc8, + 0x3c, 0x86, 0x3f, 0xde, 0x59, 0x7b, 0xfc, 0x6f, 0x59, 0x7f, 0xfc, 0x59, + 0xfe, 0x30, 0x11, 0xad, 0x18, 0x02, 0xb2, 0x85, 0x45, 0xa6, 0x91, 0x48, + 0x82, 0xf9, 0x9c, 0x03, 0x16, 0x58, 0x55, 0x96, 0xdc, 0x59, 0x76, 0x85, + 0x59, 0x50, 0x7c, 0x26, 0x46, 0x01, 0x21, 0x05, 0x2f, 0xff, 0xbb, 0x92, + 0xe4, 0x7a, 0x59, 0xba, 0xe5, 0xfa, 0xcb, 0xfe, 0x3f, 0x77, 0x3e, 0xf0, + 0x21, 0x65, 0xf0, 0x91, 0xaf, 0xd6, 0x54, 0x8f, 0x77, 0xa7, 0x37, 0x67, + 0x16, 0x54, 0x1b, 0x89, 0x11, 0x57, 0x13, 0x07, 0xf4, 0x39, 0xed, 0xfa, + 0xcb, 0xf1, 0xc3, 0x21, 0x8b, 0x2d, 0x8b, 0x28, 0xcf, 0xc5, 0xca, 0x78, + 0x25, 0xb8, 0x4d, 0x61, 0x56, 0x54, 0x2e, 0x3d, 0xe4, 0x3d, 0x8e, 0x1e, + 0x5d, 0x84, 0x8b, 0xc7, 0x66, 0xde, 0x7b, 0x7d, 0x0d, 0x02, 0x65, 0x97, + 0xb9, 0x13, 0x2c, 0xbf, 0xb0, 0x79, 0xbc, 0xf4, 0xb2, 0x96, 0x59, 0x8b, + 0x2b, 0xc5, 0xe6, 0xf0, 0xbb, 0xe1, 0xbb, 0xfc, 0xb2, 0xfd, 0xf9, 0xe8, + 0xc5, 0x59, 0x73, 0x8a, 0xb2, 0xec, 0xf9, 0x65, 0x05, 0x32, 0x69, 0x89, + 0x18, 0x3b, 0xd4, 0xa7, 0x22, 0xfc, 0x88, 0x8a, 0x77, 0x05, 0xee, 0xce, + 0xac, 0xbb, 0x34, 0xb2, 0x96, 0x5a, 0x16, 0x53, 0x6c, 0xbb, 0xf0, 0x5d, + 0xfa, 0x3b, 0x9b, 0xdd, 0x65, 0x42, 0x24, 0xd8, 0x2c, 0xe6, 0x3f, 0x92, + 0x5f, 0xc7, 0xec, 0xeb, 0x8a, 0xb2, 0xfe, 0xe8, 0x1f, 0x6e, 0x9a, 0xcb, + 0xcd, 0x34, 0xd2, 0x4b, 0xfd, 0x1b, 0x09, 0x9d, 0x7f, 0x92, 0x4f, 0x34, + 0x17, 0xf8, 0xc6, 0xe5, 0xf4, 0xb8, 0xb2, 0x86, 0x7f, 0x5d, 0x47, 0xbb, + 0x36, 0x59, 0x7e, 0x60, 0x91, 0xaf, 0xd6, 0x52, 0xca, 0x59, 0x68, 0x61, + 0x6d, 0xf8, 0x5d, 0x41, 0xf3, 0x49, 0x02, 0x86, 0x9c, 0x40, 0x61, 0x90, + 0x64, 0x53, 0x3e, 0xde, 0x86, 0x1a, 0xca, 0xc3, 0xde, 0x0a, 0x1d, 0xf1, + 0xe9, 0xbc, 0x6b, 0x2f, 0xdd, 0x8f, 0x9f, 0x75, 0x65, 0xff, 0xf4, 0x7b, + 0x83, 0xcf, 0x1f, 0x41, 0x9f, 0x79, 0x65, 0x74, 0xfe, 0xfc, 0x57, 0x78, + 0xb3, 0xab, 0x2d, 0xa5, 0x97, 0xfb, 0x30, 0x22, 0x6f, 0xee, 0x2c, 0xbf, + 0xe8, 0x2f, 0x16, 0x7a, 0x1a, 0x59, 0x7f, 0xb1, 0xae, 0x19, 0x7d, 0x25, + 0x94, 0x67, 0xd7, 0xa3, 0x7b, 0xde, 0xd0, 0x16, 0x5b, 0x8b, 0x28, 0x8d, + 0x70, 0x07, 0x6f, 0xf3, 0xef, 0xc1, 0xed, 0x8d, 0x2c, 0xbf, 0xff, 0x60, + 0xe3, 0x3e, 0x13, 0xc6, 0x40, 0x96, 0x71, 0x65, 0xcc, 0xfd, 0x65, 0xce, + 0x4b, 0x2b, 0xa6, 0xb5, 0xc6, 0x2f, 0xcc, 0x3f, 0x7e, 0xeb, 0x2b, 0x65, + 0x5f, 0xb9, 0x0a, 0x03, 0x22, 0xdd, 0x1b, 0x98, 0x47, 0x50, 0xa0, 0x74, + 0xff, 0xc8, 0x08, 0xdb, 0xd0, 0x82, 0x01, 0x05, 0xda, 0x15, 0x65, 0xf4, + 0x31, 0xfa, 0xb2, 0xf7, 0xbc, 0xeb, 0x2f, 0xb4, 0x08, 0xde, 0xb2, 0xfd, + 0x9b, 0xae, 0x5f, 0x8c, 0xf8, 0x5c, 0x87, 0xc3, 0x97, 0xdd, 0xf1, 0xec, + 0xb2, 0xff, 0x04, 0xf8, 0x59, 0xbd, 0xd6, 0x5f, 0x46, 0xcf, 0x25, 0x97, + 0xde, 0xe7, 0x4d, 0x65, 0xfc, 0x4f, 0xed, 0xb1, 0xa5, 0x94, 0xb2, 0x88, + 0xdc, 0xf8, 0xba, 0xa0, 0xfe, 0xf1, 0x6e, 0xfd, 0x9b, 0x16, 0x7c, 0xb2, + 0xfb, 0xc6, 0x5c, 0x59, 0x7e, 0x0c, 0xec, 0xfb, 0xcb, 0x2b, 0x0f, 0x30, + 0xc8, 0x6a, 0x15, 0x36, 0xc9, 0xe7, 0x13, 0x7e, 0x23, 0xd1, 0x9f, 0x61, + 0x3a, 0x44, 0x1c, 0x74, 0xbc, 0x20, 0x04, 0x59, 0x78, 0x8f, 0x75, 0x65, + 0xf0, 0xf7, 0x1c, 0x55, 0x95, 0x07, 0x89, 0x83, 0xd6, 0xdc, 0x59, 0x74, + 0x0d, 0x65, 0x36, 0x0d, 0x57, 0x45, 0x2e, 0xd7, 0x16, 0x52, 0xc3, 0x2d, + 0xef, 0xf4, 0x14, 0x9d, 0x98, 0x35, 0x97, 0xde, 0x63, 0x34, 0xb2, 0xff, + 0xef, 0xe0, 0x82, 0xfe, 0xfc, 0x42, 0x92, 0xcb, 0xd2, 0x3e, 0xac, 0xbe, + 0xf1, 0x64, 0x96, 0x5f, 0x01, 0xb7, 0xc7, 0x59, 0x7e, 0xd8, 0x6e, 0xed, + 0x2c, 0xac, 0x3c, 0xf0, 0x13, 0x5f, 0xfe, 0x3e, 0x77, 0x06, 0x59, 0xbc, + 0xb3, 0x8b, 0x2a, 0x49, 0xc8, 0x0a, 0x63, 0xf1, 0x1c, 0xc8, 0xda, 0x1c, + 0x27, 0x0f, 0x10, 0xd3, 0x76, 0xe9, 0x81, 0x9b, 0x25, 0x71, 0x1d, 0x26, + 0xd0, 0xb8, 0x91, 0x80, 0xe5, 0x2f, 0x64, 0xe4, 0x40, 0xb1, 0x8d, 0x05, + 0xc7, 0xe8, 0xe1, 0x8e, 0x3a, 0x79, 0xa3, 0x6e, 0xd4, 0x64, 0x6c, 0x8d, + 0x9f, 0xb3, 0xa5, 0x2f, 0x1c, 0xa7, 0xf1, 0x84, 0x36, 0xcf, 0x0a, 0x50, + 0x9f, 0x25, 0x8f, 0x7a, 0x58, 0xc0, 0x1d, 0xb7, 0xb1, 0xb4, 0x95, 0xb8, + 0x78, 0x24, 0x75, 0x37, 0xfd, 0x3f, 0xc7, 0x8d, 0xfc, 0x04, 0x2c, 0xbf, + 0xff, 0xe0, 0x44, 0xff, 0x70, 0xfa, 0xe7, 0xec, 0xd7, 0xec, 0x79, 0x2c, + 0xa9, 0xea, 0xa1, 0xf6, 0x8f, 0x88, 0x67, 0xb7, 0xed, 0x05, 0xdc, 0x2a, + 0x8a, 0xdd, 0x7f, 0xe7, 0x94, 0xfc, 0xd0, 0x5d, 0xc2, 0xa8, 0x9c, 0x16, + 0x9f, 0x88, 0x80, 0x61, 0xa5, 0xcd, 0x91, 0xac, 0xb7, 0x56, 0x5b, 0x8b, + 0x28, 0x06, 0x8b, 0x70, 0x46, 0xfd, 0x8d, 0x70, 0xda, 0x59, 0x7a, 0x5c, + 0xe2, 0xcb, 0xe0, 0xbb, 0x85, 0x51, 0x68, 0xaf, 0xff, 0x60, 0xfa, 0xe2, + 0xcd, 0x31, 0xf0, 0x0c, 0x59, 0x5a, 0x3f, 0xbe, 0x97, 0x5f, 0x05, 0xcb, + 0xf5, 0x97, 0xdf, 0xc1, 0x05, 0x65, 0xff, 0x4d, 0x9b, 0xbc, 0xd6, 0x9f, + 0xcb, 0x2f, 0xe8, 0x72, 0x00, 0xf1, 0x65, 0xff, 0xd0, 0x1e, 0x60, 0x4a, + 0x3f, 0xe4, 0x2c, 0xbf, 0xed, 0xfc, 0xce, 0xe1, 0x08, 0x35, 0x96, 0x28, + 0x3f, 0xec, 0x43, 0xbf, 0xd9, 0xaf, 0xf2, 0x61, 0x38, 0xb2, 0xc2, 0xac, + 0xbf, 0xec, 0x8d, 0xb2, 0x6d, 0x1f, 0x16, 0x51, 0x9e, 0x5c, 0xc2, 0x57, + 0xff, 0xed, 0xa3, 0xd0, 0x3d, 0x47, 0x5f, 0x85, 0x9f, 0xac, 0xbf, 0xf4, + 0x7c, 0xfb, 0xbd, 0x27, 0xdd, 0xd9, 0x65, 0xff, 0xa3, 0x5f, 0xe1, 0xe6, + 0xbc, 0x05, 0x95, 0x08, 0xd8, 0xea, 0xaf, 0x11, 0x6d, 0x83, 0x4f, 0x3c, + 0xc9, 0x66, 0x84, 0x0f, 0x21, 0xf5, 0x4b, 0x2f, 0x6a, 0x05, 0x59, 0x7e, + 0x3f, 0x14, 0x31, 0x65, 0x37, 0x67, 0x9d, 0x30, 0x5f, 0x47, 0x6f, 0xf4, + 0x33, 0x5a, 0x3f, 0xf8, 0xb2, 0xf0, 0x71, 0xa5, 0x96, 0xc9, 0x8f, 0x47, + 0xa6, 0x96, 0x69, 0x65, 0xfe, 0xd4, 0x7b, 0xe9, 0x67, 0x96, 0x5f, 0xd1, + 0xfe, 0xa3, 0x06, 0xb2, 0x8c, 0xfc, 0xe6, 0x12, 0xe1, 0xa5, 0xc7, 0x25, + 0x97, 0xf6, 0x6f, 0xf0, 0x20, 0x2b, 0x2f, 0xf7, 0x7a, 0x01, 0x59, 0x1c, + 0x59, 0x7f, 0xfe, 0x3e, 0x16, 0x6f, 0x7f, 0x16, 0x73, 0xaf, 0x32, 0xcb, + 0xf4, 0x7b, 0x82, 0x75, 0x65, 0x42, 0x3e, 0x06, 0x2d, 0x85, 0xf3, 0x1a, + 0x92, 0xad, 0xf1, 0x1f, 0xd2, 0x59, 0x7d, 0x9f, 0xbf, 0x56, 0x5f, 0xda, + 0x81, 0xc1, 0x4c, 0xb2, 0xdc, 0x59, 0x5b, 0x1b, 0xee, 0x96, 0xda, 0x7b, + 0x61, 0x90, 0x18, 0xdc, 0x9e, 0xec, 0x48, 0x32, 0x9c, 0x84, 0xc0, 0x48, + 0xbe, 0x22, 0x98, 0x89, 0x87, 0xbd, 0x94, 0xf1, 0xfc, 0x26, 0xca, 0x10, + 0xdc, 0x84, 0xdf, 0xa3, 0x27, 0x02, 0x46, 0xe1, 0x10, 0x8c, 0x17, 0xb8, + 0xce, 0x2c, 0xbf, 0xfe, 0x3f, 0x1e, 0x9f, 0xf8, 0xe9, 0x86, 0x3f, 0x59, + 0x74, 0xa4, 0xb2, 0xff, 0xff, 0x1f, 0xa3, 0xa5, 0x9e, 0xd4, 0x74, 0xb3, + 0x78, 0x02, 0xb2, 0xff, 0xfa, 0x33, 0xdd, 0x79, 0x68, 0x03, 0x82, 0x85, + 0x95, 0x24, 0xc4, 0xf7, 0x53, 0xf7, 0x8b, 0xb7, 0xb0, 0x5f, 0xfa, 0x0a, + 0x25, 0x9c, 0xc3, 0x85, 0x97, 0xff, 0xfd, 0x1f, 0xb1, 0xe5, 0x3b, 0xdd, + 0xc6, 0x60, 0x63, 0xb0, 0xc5, 0x97, 0xff, 0xc6, 0x5e, 0x07, 0x4f, 0x9b, + 0x8f, 0xec, 0x1a, 0xca, 0xea, 0x2e, 0x7c, 0xd1, 0x7f, 0x1e, 0xd3, 0x9c, + 0xbf, 0x59, 0x7c, 0x17, 0x70, 0xaa, 0x2d, 0xa5, 0xff, 0xfd, 0x0f, 0xe8, + 0xec, 0x70, 0xce, 0x47, 0xac, 0x1a, 0xcb, 0xfb, 0xb0, 0xc8, 0x31, 0xac, + 0xa3, 0x4c, 0x12, 0x62, 0x3d, 0x18, 0x70, 0xbb, 0xca, 0xf7, 0xfe, 0xe9, + 0x8d, 0xe4, 0x3e, 0x9b, 0x16, 0x5f, 0xf6, 0x60, 0x77, 0x01, 0xd3, 0xd2, + 0xcb, 0xe8, 0xdf, 0x86, 0xb2, 0xcd, 0xd2, 0xcb, 0xff, 0xb3, 0xd0, 0xc2, + 0x71, 0x4b, 0x3f, 0x59, 0x6f, 0xd6, 0x54, 0xc7, 0xd6, 0x42, 0xde, 0x43, + 0xbf, 0xf1, 0x90, 0xe2, 0x18, 0xde, 0xf2, 0x59, 0x7f, 0xd1, 0xff, 0x63, + 0x62, 0xce, 0x2c, 0xa8, 0x3f, 0x80, 0x1f, 0xdf, 0xf4, 0x4a, 0x35, 0xb4, + 0x6b, 0x65, 0x97, 0xff, 0xfa, 0x0c, 0x9f, 0xc0, 0xf6, 0x0e, 0x18, 0x3e, + 0xc7, 0xcb, 0x2f, 0xf1, 0xb0, 0x71, 0xc1, 0x38, 0xb2, 0xff, 0xf8, 0x8f, + 0x79, 0xfb, 0xb1, 0xee, 0x46, 0xf8, 0x59, 0x5a, 0x47, 0x27, 0x57, 0xc0, + 0x69, 0x73, 0x8d, 0x65, 0xff, 0xde, 0x73, 0xc8, 0xd3, 0xc8, 0xfa, 0xb2, + 0xfc, 0xe3, 0xc2, 0xfd, 0x65, 0x48, 0xfa, 0x0d, 0x06, 0xff, 0xa3, 0x53, + 0xb9, 0x1d, 0x73, 0x59, 0x7f, 0xba, 0x6f, 0x2f, 0x1e, 0xcb, 0x2f, 0xc3, + 0x8c, 0x23, 0x59, 0x4d, 0xd3, 0x20, 0x12, 0x23, 0x30, 0x1a, 0x36, 0x47, + 0xee, 0x14, 0xb9, 0x8f, 0xb4, 0x76, 0xc8, 0x46, 0xf6, 0x14, 0xe4, 0x43, + 0xc8, 0xc7, 0xbc, 0x60, 0x07, 0xe6, 0x88, 0x77, 0x0e, 0x44, 0x33, 0xbf, + 0xa2, 0x7e, 0xb3, 0x05, 0x59, 0x7f, 0x0a, 0xfa, 0x18, 0x09, 0x65, 0xff, + 0x47, 0x8c, 0x26, 0x3f, 0x89, 0x65, 0xff, 0x8f, 0xd1, 0xe3, 0xdf, 0x04, + 0x15, 0x97, 0x7d, 0x25, 0x94, 0xe7, 0xac, 0x03, 0xeb, 0xf8, 0xb7, 0x0f, + 0x58, 0x2a, 0xcb, 0xbd, 0xd5, 0x97, 0xfd, 0x9e, 0xe0, 0x9c, 0xf6, 0x75, + 0x65, 0x6c, 0x7a, 0x2c, 0x17, 0xbf, 0x1e, 0xcc, 0x80, 0xac, 0xbf, 0x3f, + 0xd2, 0x13, 0x8b, 0x2f, 0xfc, 0x73, 0x73, 0x7b, 0x96, 0xc0, 0x1a, 0xcb, + 0x4f, 0x15, 0x50, 0xae, 0x8b, 0xbb, 0x08, 0xe2, 0x21, 0xe4, 0x20, 0x7c, + 0x47, 0xbc, 0xa0, 0x42, 0xaa, 0x9e, 0xaf, 0x37, 0x23, 0x01, 0xfe, 0x52, + 0x25, 0xcc, 0xea, 0xcb, 0xf6, 0x82, 0xee, 0x15, 0x45, 0xca, 0xbf, 0x9c, + 0x7d, 0x82, 0xd9, 0x65, 0xa7, 0x8c, 0xfe, 0x30, 0x5f, 0xa6, 0x97, 0xed, + 0x05, 0xdc, 0x2a, 0x8b, 0xb5, 0x7b, 0x6c, 0x69, 0x65, 0xff, 0x1c, 0xa4, + 0x65, 0xfc, 0x49, 0x65, 0xf1, 0xe9, 0xff, 0x59, 0x69, 0xf8, 0x8a, 0xc6, + 0x1a, 0x38, 0xf7, 0x0e, 0x2a, 0x1f, 0x88, 0x67, 0x62, 0xa9, 0x53, 0x29, + 0xc7, 0x28, 0x5b, 0x0d, 0xc5, 0xac, 0x4b, 0x4e, 0xd5, 0x06, 0x6e, 0xc2, + 0xef, 0xb4, 0x83, 0x62, 0xa6, 0x79, 0xf2, 0x17, 0x3e, 0x87, 0x15, 0xfe, + 0x9f, 0x9a, 0x0b, 0xb8, 0x55, 0x15, 0x3a, 0xfc, 0x53, 0xf5, 0xce, 0x2c, + 0xbb, 0x6c, 0x59, 0x7f, 0x03, 0xe6, 0x3b, 0x92, 0xcb, 0x79, 0x65, 0xff, + 0x43, 0xed, 0x3b, 0xee, 0x40, 0xd6, 0x51, 0x9e, 0x69, 0x08, 0xdf, 0x05, + 0xdc, 0x2a, 0x8a, 0xe5, 0x7f, 0xa7, 0xe6, 0x82, 0xee, 0x15, 0x45, 0x9c, + 0xb9, 0xe4, 0xb2, 0xfe, 0x97, 0xbe, 0x09, 0xf1, 0x65, 0x39, 0xe2, 0x80, + 0x5a, 0xfe, 0x3e, 0x61, 0x3b, 0x4b, 0x2b, 0x49, 0x80, 0xf4, 0xb8, 0xa1, + 0x0d, 0xe2, 0x1b, 0xff, 0xde, 0x8e, 0x4e, 0x07, 0x3d, 0x13, 0x4c, 0x6b, + 0x2f, 0xe3, 0x66, 0xc0, 0xd4, 0x96, 0x5f, 0x99, 0x93, 0x3f, 0xeb, 0x2f, + 0xb6, 0xeb, 0xf9, 0x65, 0x39, 0xe6, 0x00, 0xa6, 0xff, 0x47, 0x67, 0x31, + 0xb9, 0x6c, 0x79, 0x65, 0x62, 0x65, 0x3d, 0x4e, 0x27, 0xbd, 0xe4, 0x37, + 0xfc, 0x50, 0xce, 0x02, 0x4e, 0x2a, 0xcb, 0xf6, 0xb3, 0xc6, 0xc5, 0x97, + 0xce, 0x50, 0x35, 0x97, 0xe9, 0xa1, 0x90, 0x22, 0xcb, 0xa4, 0xc5, 0x95, + 0x87, 0x80, 0x45, 0x37, 0xff, 0xba, 0x73, 0xba, 0xe7, 0xe8, 0xc1, 0x9a, + 0xcb, 0xf6, 0x82, 0xee, 0x15, 0x44, 0x84, 0xbf, 0xff, 0xb8, 0x7a, 0x0f, + 0x72, 0x76, 0xb5, 0x8d, 0x6e, 0x43, 0x16, 0x5f, 0xfb, 0x19, 0x8f, 0xad, + 0xa7, 0x7c, 0xc5, 0x97, 0xfb, 0xee, 0x78, 0xa1, 0x9c, 0x59, 0x7f, 0xf9, + 0xc8, 0x33, 0x86, 0x4f, 0x2e, 0xbc, 0x96, 0x51, 0x9f, 0xf0, 0x0d, 0x2f, + 0xec, 0x23, 0xff, 0x90, 0xb2, 0xd3, 0xe4, 0x9f, 0x5e, 0x24, 0xfc, 0x69, + 0xd6, 0x1f, 0xe1, 0x81, 0xc2, 0x1b, 0x8f, 0xab, 0x2f, 0xfc, 0xe2, 0x4c, + 0x47, 0xe2, 0x8f, 0xd6, 0x54, 0x91, 0x77, 0xf3, 0x37, 0x85, 0xaf, 0xfe, + 0xe9, 0xb3, 0x39, 0x3b, 0xe9, 0x67, 0x96, 0x5f, 0x4b, 0xa2, 0x71, 0x65, + 0xfd, 0x3f, 0xb0, 0x60, 0xe2, 0xca, 0x84, 0x4d, 0x62, 0x3b, 0x92, 0x5f, + 0x37, 0x3d, 0x86, 0x2c, 0xbf, 0xbb, 0xce, 0x66, 0xb6, 0x59, 0x74, 0x34, + 0xb2, 0xff, 0xbf, 0xc1, 0x93, 0xff, 0x1b, 0xd6, 0x56, 0x22, 0x04, 0xcb, + 0xdc, 0x5e, 0xf3, 0x37, 0xc9, 0x65, 0xff, 0xee, 0xc7, 0xec, 0x79, 0x73, + 0xd9, 0x8c, 0x59, 0x69, 0xed, 0xad, 0x92, 0x2f, 0xb0, 0xb8, 0xde, 0xb2, + 0x32, 0x13, 0x8d, 0xae, 0x63, 0xed, 0x1c, 0xb0, 0x9f, 0xac, 0x0f, 0x2b, + 0x18, 0xa1, 0x97, 0xc2, 0xdf, 0x42, 0xa0, 0x05, 0xa2, 0x0f, 0xdf, 0xfe, + 0xcf, 0xa7, 0x8c, 0x0f, 0xa9, 0x75, 0xa7, 0x59, 0x7f, 0xf4, 0xfe, 0xbf, + 0x0b, 0x3d, 0xe8, 0xfd, 0x65, 0xff, 0xe9, 0xec, 0x79, 0x4f, 0xcd, 0x05, + 0xdc, 0x2a, 0x89, 0xf1, 0x7f, 0xde, 0x9e, 0x01, 0x5f, 0xd8, 0xd2, 0xca, + 0x0b, 0x2e, 0x9c, 0xd0, 0x77, 0x69, 0x28, 0x3a, 0x87, 0xd3, 0x13, 0xba, + 0x8c, 0xeb, 0x57, 0xff, 0xf0, 0x09, 0xc5, 0x9d, 0xe1, 0x60, 0xa5, 0x9d, + 0x36, 0x2c, 0xb8, 0xfe, 0x59, 0x7f, 0xfd, 0x2d, 0x9b, 0x48, 0x6e, 0x76, + 0x0e, 0xa7, 0x4e, 0xee, 0xe2, 0xca, 0x91, 0xfe, 0x7e, 0x2f, 0x7f, 0xf8, + 0xb6, 0xec, 0x1f, 0xb8, 0x65, 0xf4, 0x96, 0x5f, 0xfb, 0xc2, 0xc1, 0x4b, + 0x3a, 0x6c, 0x59, 0x7f, 0xc2, 0xc1, 0x4b, 0x3a, 0x6c, 0x59, 0x7c, 0x02, + 0x71, 0x67, 0x1f, 0xb7, 0x8f, 0xaf, 0xda, 0xfc, 0xfb, 0x0b, 0x29, 0x87, + 0xc6, 0x03, 0xbb, 0xf6, 0x6b, 0x32, 0x65, 0x96, 0x9e, 0xc5, 0x4d, 0x1d, + 0x86, 0xcb, 0x91, 0xf2, 0x32, 0x31, 0x08, 0xaf, 0xda, 0x0b, 0xb8, 0x55, + 0x15, 0x92, 0xff, 0xcf, 0x29, 0xf9, 0xa0, 0xbb, 0x85, 0x51, 0x37, 0x2d, + 0x3f, 0x11, 0x00, 0xc3, 0x4a, 0x0a, 0x61, 0x27, 0x0d, 0xfb, 0xe0, 0xbb, + 0x85, 0x51, 0x2b, 0x2f, 0xff, 0xb5, 0xb1, 0x46, 0x9c, 0x64, 0xfa, 0x8d, + 0xeb, 0x2b, 0x47, 0xfc, 0x02, 0xeb, 0xf1, 0x40, 0xdf, 0xab, 0x2f, 0xf4, + 0x19, 0x44, 0xa1, 0xbd, 0x65, 0xf3, 0x1e, 0x53, 0xf0, 0xfe, 0xcc, 0x8b, + 0x84, 0xd7, 0xe9, 0xef, 0x37, 0x31, 0x65, 0x4f, 0x3f, 0x0d, 0x91, 0xaf, + 0xfd, 0xec, 0x9f, 0x9a, 0x3d, 0x9d, 0x8b, 0x2f, 0xff, 0x37, 0x4d, 0xdb, + 0x63, 0x98, 0xf2, 0x3c, 0xd6, 0x2c, 0xbf, 0xf1, 0xf0, 0x0c, 0x23, 0xde, + 0x07, 0x59, 0x7f, 0x41, 0x38, 0x5f, 0x75, 0x65, 0x48, 0xfb, 0x58, 0x7f, + 0x70, 0xf4, 0xb2, 0xfd, 0xa0, 0xbb, 0x85, 0x51, 0x2e, 0x2f, 0xf8, 0xde, + 0x5e, 0x28, 0x67, 0x16, 0x5f, 0xa5, 0xb8, 0x7d, 0x75, 0x97, 0xa3, 0x72, + 0x16, 0x5f, 0xff, 0xd8, 0x00, 0xf6, 0x0a, 0x24, 0xe3, 0x8f, 0xb4, 0x6b, + 0x2f, 0x19, 0x42, 0xca, 0x92, 0x2e, 0xc6, 0x55, 0xba, 0x3d, 0xbd, 0x66, + 0xff, 0xe0, 0x48, 0x8e, 0x51, 0xe2, 0x04, 0x96, 0x5f, 0xa3, 0x9f, 0xb3, + 0xcb, 0x2d, 0xe3, 0x3e, 0xce, 0xa1, 0xd8, 0x2b, 0x29, 0xcd, 0xc7, 0xe4, + 0xf7, 0xf4, 0xbb, 0x85, 0x81, 0x59, 0x7a, 0x5d, 0xf2, 0xcb, 0xbb, 0x06, + 0x79, 0x3d, 0x2c, 0xbf, 0xf8, 0x8f, 0xfe, 0x6a, 0x0e, 0x4f, 0xc5, 0x95, + 0x87, 0xde, 0x65, 0x97, 0xf6, 0x8d, 0x84, 0xf2, 0x59, 0x7f, 0xef, 0xa5, + 0x9e, 0xcd, 0x06, 0x31, 0x65, 0xe7, 0x94, 0xf6, 0xe2, 0xb8, 0xd7, 0x10, + 0xc3, 0x91, 0x16, 0x0b, 0xf4, 0xd1, 0xe1, 0xe5, 0xc8, 0x73, 0x7a, 0x1b, + 0x20, 0x20, 0x6f, 0x2c, 0xbf, 0xf0, 0x19, 0x3f, 0x90, 0x5e, 0xcd, 0x2c, + 0xbf, 0xe1, 0xe4, 0xf8, 0xd1, 0xf4, 0x0b, 0x2f, 0xfe, 0x1c, 0x4f, 0x6f, + 0xcf, 0xa5, 0xd8, 0xe2, 0xcb, 0x4f, 0x35, 0xe2, 0xa6, 0x4e, 0x55, 0xf2, + 0x17, 0x60, 0x40, 0xde, 0x75, 0x7f, 0xf4, 0xf7, 0x94, 0xfc, 0xd0, 0x5d, + 0xc2, 0xa8, 0x8e, 0xd7, 0xff, 0xc0, 0x8f, 0xa4, 0x6c, 0x6b, 0x08, 0x7d, + 0x85, 0x97, 0xe6, 0x7d, 0xe3, 0x69, 0x65, 0xdb, 0x4f, 0x19, 0xfd, 0x08, + 0xa1, 0x7f, 0xbb, 0x92, 0x9e, 0xe5, 0xc5, 0x95, 0x87, 0xcd, 0xe3, 0x2b, + 0xf9, 0xb2, 0x50, 0x1c, 0x25, 0x97, 0x03, 0xab, 0x2f, 0xe6, 0xc1, 0x67, + 0x5f, 0xcb, 0x2f, 0xb1, 0x9a, 0x85, 0x97, 0xec, 0x23, 0xfc, 0x45, 0x94, + 0x47, 0x93, 0xc2, 0x1b, 0xff, 0xf4, 0x8c, 0x7d, 0x3d, 0xf3, 0xb0, 0x7a, + 0x30, 0x05, 0x65, 0x19, 0xfd, 0x78, 0x86, 0xff, 0x63, 0x5c, 0x82, 0xf7, + 0x16, 0x5f, 0xdf, 0x96, 0x7d, 0xec, 0x59, 0x76, 0xdb, 0xab, 0x2f, 0xce, + 0x2f, 0x73, 0xf5, 0x97, 0xf1, 0x7e, 0xfa, 0x71, 0x16, 0x54, 0x22, 0x83, + 0x62, 0xed, 0x0d, 0xb9, 0x4d, 0xff, 0xff, 0xfb, 0xb1, 0xde, 0xb8, 0xc9, + 0xe7, 0x73, 0xb1, 0xc9, 0xc0, 0x79, 0xd2, 0xcd, 0xf0, 0xb2, 0xfd, 0xad, + 0x46, 0xfe, 0x2c, 0xbf, 0xf1, 0xea, 0x77, 0x0b, 0x19, 0x01, 0x59, 0x7f, + 0x81, 0xe3, 0x7d, 0xef, 0x25, 0x97, 0xf3, 0xef, 0x1e, 0x10, 0xab, 0x2d, + 0x04, 0x7c, 0x62, 0x1a, 0x5f, 0xff, 0xfd, 0xfc, 0x10, 0x5f, 0xcf, 0xf7, + 0xf3, 0xb0, 0x8e, 0x01, 0xde, 0xc2, 0xcb, 0xff, 0x10, 0x25, 0x3b, 0x0c, + 0xa1, 0x8b, 0x2f, 0xee, 0x48, 0xc2, 0xfa, 0x59, 0x79, 0xdc, 0x2a, 0x8a, + 0x85, 0x50, 0x7a, 0xa1, 0x2d, 0xbf, 0x80, 0x13, 0x15, 0xc2, 0xb2, 0xff, + 0xb3, 0xb8, 0x4f, 0xad, 0x1a, 0xca, 0x92, 0xb0, 0x7c, 0x84, 0x48, 0xa5, + 0x41, 0x85, 0x17, 0xc4, 0xe6, 0xe7, 0xa8, 0x49, 0x91, 0x0f, 0x0b, 0xaf, + 0x6e, 0xbc, 0x2c, 0xba, 0x58, 0xb2, 0xff, 0xa5, 0xe3, 0xd3, 0x84, 0xc9, + 0x65, 0xef, 0xf9, 0x8b, 0x2f, 0xf7, 0x01, 0x33, 0x8d, 0xe6, 0x59, 0x52, + 0x3d, 0x2f, 0x87, 0x6f, 0xd2, 0x28, 0x60, 0xab, 0x2f, 0xfe, 0x66, 0x68, + 0xb0, 0xf7, 0x9e, 0x9d, 0x65, 0x7c, 0x7d, 0x6e, 0x51, 0x7f, 0xe2, 0xc9, + 0xbd, 0xdc, 0xd1, 0xf1, 0x65, 0xff, 0xce, 0xc9, 0xcc, 0x7f, 0x4e, 0xef, + 0xb4, 0xb2, 0xba, 0x88, 0x72, 0x3e, 0xbf, 0x7c, 0x46, 0xc3, 0x59, 0x7e, + 0x86, 0xce, 0xd8, 0xd2, 0xca, 0x84, 0xc7, 0xf2, 0x15, 0x26, 0x45, 0xa2, + 0x7b, 0xfb, 0xcf, 0xd9, 0xc3, 0x85, 0x97, 0xfd, 0xee, 0x09, 0xc7, 0xfa, + 0x58, 0xb2, 0xfe, 0x3e, 0xc7, 0x63, 0x65, 0x95, 0x08, 0x97, 0xc2, 0xf0, + 0x1d, 0xdf, 0xda, 0x94, 0x7b, 0x36, 0x59, 0x7b, 0xef, 0x62, 0xcb, 0xfb, + 0x86, 0x41, 0xec, 0x2c, 0xac, 0x3f, 0x7d, 0x17, 0x78, 0x76, 0xff, 0xd9, + 0xee, 0x6b, 0x26, 0xe9, 0x8a, 0xb2, 0xff, 0xc5, 0x82, 0xe3, 0x0f, 0x72, + 0x18, 0xb2, 0xff, 0xa7, 0x39, 0x63, 0x7c, 0xee, 0x81, 0x65, 0xf9, 0xa3, + 0xd6, 0x0a, 0xb2, 0xa1, 0x31, 0x63, 0x2e, 0x74, 0x00, 0x20, 0x08, 0x7f, + 0x7f, 0xa5, 0x1a, 0xda, 0x35, 0xb2, 0xcb, 0xff, 0x73, 0x0b, 0xdc, 0xc9, + 0x1f, 0x56, 0x5f, 0xdc, 0xcd, 0xe5, 0x1f, 0x2c, 0xb8, 0x1d, 0x59, 0x5c, + 0x44, 0x1f, 0x8f, 0x77, 0x0b, 0xef, 0xff, 0xa3, 0xfc, 0x29, 0xcf, 0xe9, + 0xdd, 0xcf, 0xdd, 0x65, 0xc5, 0xb2, 0xca, 0x84, 0xd5, 0x72, 0x17, 0x06, + 0x66, 0x4a, 0x77, 0xff, 0xbb, 0x0c, 0x27, 0x14, 0xb3, 0xff, 0xbf, 0x59, + 0x7f, 0x6f, 0x76, 0x75, 0xa7, 0x59, 0x7f, 0xff, 0x8e, 0x3c, 0xfd, 0x9f, + 0xce, 0xe1, 0x7a, 0x77, 0xf2, 0xe2, 0xca, 0x92, 0x38, 0x4d, 0x30, 0x8c, + 0x2f, 0x70, 0x1a, 0x59, 0x78, 0xfa, 0x6b, 0x2f, 0xed, 0x39, 0x7f, 0xfc, + 0x2c, 0xac, 0x44, 0xa1, 0x97, 0x38, 0xe8, 0x83, 0x77, 0xbd, 0x9b, 0x2c, + 0xbf, 0x60, 0x40, 0xfb, 0x2c, 0xae, 0x9e, 0x29, 0x0e, 0xdf, 0xff, 0x68, + 0x81, 0xf1, 0x61, 0xe8, 0x3d, 0x8e, 0x2c, 0xbf, 0xff, 0x82, 0xfd, 0xc9, + 0x46, 0xa3, 0xfd, 0x40, 0x8e, 0x4b, 0x2a, 0x11, 0x53, 0x89, 0xf7, 0xec, + 0xd9, 0xcb, 0x7a, 0xcb, 0xff, 0xff, 0xfd, 0x12, 0x9d, 0xee, 0x9c, 0x72, + 0x76, 0x00, 0x31, 0xbe, 0x76, 0x6b, 0x59, 0xbc, 0x0f, 0xd5, 0x97, 0xdd, + 0x27, 0x6f, 0x59, 0x58, 0x9e, 0x7f, 0x61, 0x94, 0x44, 0x3c, 0x29, 0xf4, + 0x25, 0xef, 0xf3, 0xfd, 0xc3, 0x64, 0x05, 0x65, 0xff, 0xff, 0x01, 0xf7, + 0x4f, 0x6e, 0xb9, 0xfa, 0x3a, 0x7e, 0xe6, 0x0d, 0x65, 0xff, 0xb7, 0xbc, + 0xb0, 0x86, 0x51, 0x25, 0x97, 0x6d, 0x0b, 0x2c, 0x58, 0x7a, 0xa0, 0x3e, + 0xb4, 0xf6, 0xc3, 0x64, 0x08, 0xdc, 0x97, 0xb6, 0x45, 0xe2, 0x1e, 0x7b, + 0x10, 0x8e, 0x1a, 0x79, 0x2d, 0x0c, 0x58, 0x47, 0x04, 0x7b, 0xe1, 0x63, + 0x84, 0x4e, 0xa3, 0xad, 0x64, 0x35, 0xfb, 0x1d, 0xd9, 0x47, 0x3d, 0xc8, + 0xed, 0x3d, 0x29, 0x3c, 0x0a, 0x7b, 0x86, 0x62, 0x42, 0xf6, 0xf8, 0x2e, + 0xe1, 0x54, 0x55, 0x0b, 0xfd, 0xa8, 0xdf, 0xf4, 0xb3, 0xcb, 0x2b, 0x47, + 0xc8, 0x02, 0xeb, 0xff, 0x3c, 0xa7, 0xe6, 0x82, 0xee, 0x15, 0x44, 0xd6, + 0xbf, 0xee, 0xc3, 0x39, 0xc7, 0x20, 0xac, 0xbe, 0x8d, 0x47, 0x96, 0x5c, + 0xfe, 0x59, 0x43, 0x36, 0xec, 0x21, 0xb4, 0xfc, 0x47, 0xf3, 0x08, 0xba, + 0x98, 0xed, 0xf7, 0xed, 0x05, 0xdc, 0x2a, 0x8a, 0xb1, 0x7f, 0xd1, 0x28, + 0xd6, 0xd1, 0xad, 0x96, 0x5a, 0x7e, 0x1f, 0x71, 0x1a, 0x5f, 0xe8, 0xfb, + 0xd1, 0xd7, 0xdd, 0x59, 0x7f, 0x68, 0x13, 0x72, 0x3c, 0xb2, 0xba, 0x7c, + 0xa0, 0x36, 0xbf, 0xfb, 0xfc, 0x29, 0xf2, 0xff, 0x9b, 0x39, 0x2c, 0xa9, + 0xe7, 0xd5, 0x04, 0x57, 0xf1, 0xb0, 0xfd, 0xd8, 0x59, 0x7d, 0x13, 0x47, + 0xcb, 0x2b, 0xa7, 0x9f, 0xc2, 0xcb, 0xfe, 0x94, 0xfc, 0xd0, 0x5d, 0xc2, + 0xa8, 0x91, 0x17, 0xf6, 0xd1, 0xae, 0xb9, 0xac, 0xb4, 0xfc, 0x44, 0xb3, + 0x91, 0x71, 0x1e, 0xfd, 0xa0, 0xbb, 0x85, 0x51, 0x69, 0x2f, 0xfc, 0xf2, + 0x9f, 0x9a, 0x0b, 0xb8, 0x55, 0x13, 0xea, 0xd3, 0xf1, 0x10, 0x0c, 0x34, + 0xbf, 0xfd, 0x3d, 0x8f, 0x29, 0xf9, 0xa0, 0xbb, 0x85, 0x51, 0x42, 0x2f, + 0xfe, 0xc6, 0xa7, 0xf8, 0x57, 0xe1, 0xfa, 0x16, 0x5f, 0xbc, 0x00, 0xbf, + 0x16, 0x5f, 0x1e, 0xd1, 0xa5, 0x94, 0xc3, 0xca, 0xe9, 0x45, 0xfb, 0x41, + 0x77, 0x0a, 0xa2, 0x8f, 0x5f, 0xf4, 0x4a, 0x35, 0xb4, 0x6b, 0x65, 0x97, + 0xff, 0xff, 0xf8, 0x43, 0xd4, 0xd1, 0xdd, 0x67, 0x5c, 0x4e, 0x60, 0xae, + 0x5f, 0xc1, 0x44, 0xdd, 0x85, 0x97, 0xe7, 0xe1, 0xfa, 0x16, 0x5f, 0xf4, + 0x4d, 0x05, 0x13, 0x76, 0x16, 0x54, 0x23, 0xb8, 0x58, 0x48, 0x11, 0x35, + 0xff, 0xfd, 0x83, 0xec, 0x09, 0x3f, 0xc4, 0xff, 0xf3, 0x91, 0xfa, 0x4b, + 0xcf, 0x29, 0xf0, 0xa8, 0x47, 0x08, 0x88, 0xd3, 0xd1, 0x94, 0x6e, 0x1a, + 0x5f, 0xfd, 0x9d, 0x9f, 0xe1, 0x5f, 0x87, 0xe8, 0x59, 0x69, 0xfb, 0x2b, + 0x4d, 0x64, 0xaa, 0x2f, 0x32, 0xd4, 0x3a, 0x45, 0x4d, 0xa7, 0x93, 0xe4, + 0xc7, 0x91, 0x9a, 0x0b, 0x59, 0x12, 0x86, 0x56, 0x87, 0xd0, 0xb1, 0x38, + 0x7b, 0xcd, 0x18, 0x47, 0x61, 0x6d, 0xf9, 0x57, 0xa5, 0xd3, 0xdf, 0xb4, + 0x17, 0x70, 0xaa, 0x22, 0x25, 0xfe, 0xe0, 0x22, 0x6f, 0x1e, 0xf5, 0x96, + 0x9f, 0x87, 0xd5, 0x31, 0xa5, 0xfd, 0x9a, 0x0b, 0xb8, 0x55, 0x11, 0x5a, + 0xff, 0xb7, 0x67, 0xe6, 0x82, 0xee, 0x15, 0x45, 0x70, 0xa9, 0xe8, 0x83, + 0x73, 0x9b, 0xee, 0xbe, 0x8d, 0x65, 0xfb, 0xdf, 0x88, 0x52, 0x59, 0x7e, + 0xfe, 0x08, 0x33, 0xe0, 0xf2, 0xdc, 0x86, 0xfa, 0x7e, 0xd3, 0x6e, 0xac, + 0xb1, 0xfc, 0x7d, 0x3f, 0x9f, 0xdf, 0x67, 0x5f, 0xcb, 0x2f, 0xf6, 0x1e, + 0xbf, 0xfc, 0x1c, 0x59, 0x66, 0xc1, 0x1e, 0xb7, 0x08, 0x6f, 0xff, 0xef, + 0x70, 0xfa, 0xe7, 0x23, 0x2f, 0x03, 0xba, 0xc5, 0x97, 0xc1, 0x77, 0x0a, + 0xa2, 0x9e, 0x5f, 0xf8, 0xa3, 0x79, 0xfa, 0x51, 0x84, 0xb2, 0xb4, 0x7d, + 0x7e, 0x2e, 0xbf, 0xc3, 0xfe, 0x74, 0x6e, 0xc4, 0x96, 0x5f, 0xe6, 0x18, + 0xc0, 0xfa, 0x92, 0xcb, 0x98, 0x6b, 0x2a, 0x0f, 0x24, 0x26, 0x77, 0xff, + 0xf4, 0x7b, 0x80, 0x60, 0x4f, 0xf8, 0xce, 0x98, 0x02, 0xb2, 0xfe, 0x86, + 0x72, 0x0f, 0x65, 0x95, 0x24, 0x44, 0x79, 0x6e, 0xff, 0xfe, 0x7d, 0x3f, + 0x7e, 0x96, 0x7b, 0x08, 0x1e, 0x00, 0xab, 0x2f, 0xa5, 0x19, 0xb2, 0xcb, + 0xff, 0xf6, 0x81, 0xad, 0x41, 0x60, 0xa7, 0xde, 0xe0, 0x8b, 0x28, 0x28, + 0xd4, 0xf9, 0x73, 0x44, 0x57, 0x8c, 0xbc, 0xb2, 0xff, 0xd2, 0xc2, 0xfe, + 0x18, 0x7a, 0x92, 0xcb, 0xff, 0xe6, 0x61, 0xf8, 0x1e, 0x89, 0x18, 0xf0, + 0x6b, 0x28, 0xd1, 0x19, 0xf9, 0xf5, 0xfe, 0x94, 0x6b, 0x68, 0xd6, 0xcb, + 0x2f, 0xa7, 0x13, 0xc9, 0x65, 0xf9, 0xf3, 0xa6, 0xc5, 0x95, 0xc3, 0xc9, + 0xde, 0x47, 0x50, 0x8a, 0x2c, 0x7e, 0xbf, 0xed, 0xee, 0xc9, 0xc3, 0xe9, + 0xb1, 0x65, 0xff, 0x14, 0x32, 0x24, 0x58, 0xc5, 0x97, 0xff, 0x99, 0x1a, + 0xda, 0x3e, 0xc0, 0x36, 0xf0, 0x6b, 0x2b, 0x11, 0x84, 0x67, 0xae, 0x6d, + 0x7f, 0x88, 0x39, 0xbf, 0x3d, 0xc5, 0x97, 0x38, 0xab, 0x2a, 0x0f, 0x2f, + 0x46, 0x97, 0xe7, 0xda, 0x34, 0x05, 0x94, 0xd9, 0x5e, 0x74, 0x82, 0xbc, + 0x86, 0x20, 0xa4, 0x41, 0x84, 0x17, 0xd0, 0xa9, 0x38, 0x7b, 0xcc, 0x62, + 0xf0, 0xa7, 0x28, 0x62, 0xf2, 0x1c, 0x7b, 0xde, 0x37, 0x08, 0x6f, 0xff, + 0x3c, 0xa7, 0x8c, 0x9d, 0xae, 0x72, 0x3f, 0x59, 0x7f, 0xfb, 0xff, 0xc1, + 0xc9, 0xe2, 0x13, 0xb0, 0xa1, 0x65, 0xff, 0xc5, 0x9f, 0xb9, 0x7f, 0x3d, + 0x86, 0xc5, 0x95, 0xa4, 0x4a, 0x79, 0x3a, 0xfc, 0xfd, 0xe9, 0xcc, 0xb2, + 0xff, 0xec, 0xe1, 0x97, 0xe5, 0x9e, 0xee, 0x2c, 0xbf, 0xf1, 0x97, 0xe5, + 0x9e, 0xee, 0x4f, 0xe9, 0xf5, 0x08, 0x51, 0x53, 0xd5, 0x52, 0x0e, 0x1b, + 0xe7, 0x0e, 0x1e, 0x42, 0x36, 0xd8, 0xb2, 0xfc, 0x50, 0x06, 0xdf, 0x16, + 0x5f, 0xc2, 0xe9, 0xc6, 0xe4, 0xb2, 0x86, 0x7d, 0x18, 0x20, 0xe5, 0x77, + 0xff, 0x18, 0xf4, 0xff, 0x4f, 0xd6, 0xa3, 0x65, 0x95, 0x3c, 0xfd, 0x7a, + 0x5b, 0x70, 0xe1, 0x65, 0xff, 0xfb, 0xb1, 0xac, 0x91, 0xbf, 0xb0, 0x66, + 0x00, 0xa4, 0xbf, 0x44, 0xbf, 0x04, 0x96, 0x5f, 0x05, 0xdc, 0x2a, 0x8a, + 0xcd, 0x53, 0x1e, 0xbe, 0x8a, 0x6f, 0xbc, 0x6c, 0xe2, 0xcb, 0xc2, 0xf0, + 0x55, 0x97, 0xdc, 0xd4, 0x6f, 0x59, 0x7f, 0x6f, 0x22, 0x8d, 0xd9, 0x96, + 0x5f, 0x99, 0x05, 0x2e, 0x2c, 0xa8, 0x3d, 0x9d, 0x8c, 0xaf, 0xbd, 0xc1, + 0x38, 0xb2, 0xfb, 0x9c, 0x86, 0x96, 0x59, 0xd6, 0x56, 0x1e, 0xb9, 0x92, + 0x70, 0x8e, 0xed, 0x8d, 0x65, 0xfe, 0xe4, 0xc6, 0x5d, 0xcf, 0x96, 0x54, + 0x1e, 0x5e, 0x0b, 0xdc, 0xfe, 0x59, 0x7d, 0xf8, 0x85, 0x25, 0x94, 0x33, + 0x75, 0xe1, 0x6b, 0xff, 0xe8, 0x67, 0xb3, 0x0b, 0xdc, 0xee, 0x7e, 0xeb, + 0x2f, 0x01, 0xf8, 0xb2, 0xff, 0xb2, 0x46, 0x0d, 0xd6, 0xe7, 0xf6, 0x2c, + 0xb1, 0xac, 0xbf, 0xbb, 0x84, 0x4f, 0xe5, 0x9c, 0x2c, 0x2f, 0xc5, 0xee, + 0xc6, 0xf5, 0x97, 0x9d, 0xd8, 0xb2, 0xfd, 0x93, 0x6c, 0x0f, 0xd6, 0x5f, + 0xde, 0x8d, 0x7f, 0x13, 0x2c, 0xb4, 0xf8, 0x5c, 0xa1, 0x18, 0xb6, 0x42, + 0xab, 0xe2, 0x33, 0x22, 0x98, 0x7f, 0x4f, 0xac, 0x79, 0xeb, 0xc3, 0xad, + 0x7e, 0x42, 0x49, 0xdc, 0x1c, 0xf2, 0x90, 0x0e, 0xb7, 0x94, 0x88, 0x36, + 0xde, 0x57, 0x7f, 0xee, 0x9f, 0x9f, 0x5b, 0x41, 0x8d, 0x65, 0xff, 0xbc, + 0x06, 0x60, 0x75, 0xf3, 0xb4, 0xb2, 0xff, 0x6a, 0x05, 0xc2, 0x31, 0x56, + 0x5f, 0xfe, 0x86, 0x84, 0x61, 0x67, 0xde, 0x8c, 0x69, 0x65, 0xfb, 0xc6, + 0x58, 0xc5, 0x97, 0xd2, 0x72, 0x9f, 0x89, 0x92, 0x7c, 0x7d, 0xa4, 0x11, + 0x0c, 0xdb, 0xd3, 0x2f, 0xfc, 0xf2, 0x9f, 0x9a, 0x0b, 0xb8, 0x55, 0x12, + 0x2a, 0xff, 0xfd, 0xee, 0xe1, 0x4f, 0xf3, 0xbf, 0xdc, 0x14, 0x57, 0x59, + 0x7f, 0xe7, 0xf4, 0xf8, 0x3d, 0x1f, 0x80, 0xb2, 0xa7, 0xa3, 0x92, 0x13, + 0x1d, 0x66, 0xff, 0xc7, 0xad, 0x1b, 0x59, 0x31, 0xb1, 0x65, 0xfb, 0x41, + 0x77, 0x0a, 0xa2, 0xc9, 0x54, 0x1f, 0x9e, 0x1f, 0xdf, 0xb6, 0x32, 0x97, + 0x16, 0x5f, 0xe0, 0x6d, 0xd8, 0xf7, 0x0d, 0x65, 0xfc, 0x01, 0x9e, 0x9f, + 0x8b, 0x2f, 0xde, 0xe0, 0x9c, 0x9f, 0x88, 0x89, 0xd1, 0x47, 0x0d, 0x2a, + 0x7a, 0x3e, 0x72, 0x15, 0x37, 0xf9, 0xbc, 0xd9, 0x1d, 0x10, 0x6b, 0x2f, + 0xee, 0x9e, 0xa2, 0x5c, 0x59, 0x7f, 0x33, 0xc7, 0xd7, 0x62, 0xcb, 0xff, + 0xc7, 0xee, 0xe7, 0xb0, 0xa3, 0xd0, 0x35, 0x95, 0x07, 0xe8, 0xe5, 0xb7, + 0xfc, 0xe7, 0xe0, 0x69, 0xf9, 0x3f, 0x11, 0xf0, 0x13, 0x7e, 0xc2, 0x86, + 0xfe, 0xcd, 0x05, 0xdc, 0x2a, 0x8b, 0x61, 0x7f, 0xfe, 0xec, 0xe2, 0xcd, + 0x7b, 0x9d, 0x9a, 0x74, 0xee, 0xee, 0x2c, 0xbf, 0x75, 0xf4, 0x6c, 0x59, + 0x4d, 0x84, 0x44, 0x05, 0x86, 0xf6, 0x81, 0xd5, 0x97, 0x7a, 0x7c, 0x1e, + 0x26, 0x89, 0xea, 0x7a, 0x66, 0x87, 0x18, 0x2d, 0xec, 0xe6, 0x2c, 0xbe, + 0x0b, 0xb8, 0x55, 0x16, 0xda, 0xe7, 0xd2, 0xcb, 0x49, 0x65, 0xb9, 0xb1, + 0xa7, 0x00, 0xb5, 0x68, 0xff, 0x7c, 0xab, 0x7f, 0x1f, 0x7c, 0x7f, 0x81, + 0x65, 0xff, 0x44, 0xa3, 0x5b, 0x46, 0xb6, 0x59, 0x7d, 0x13, 0x70, 0xd6, + 0x54, 0x93, 0x44, 0xc8, 0x4c, 0x4c, 0x44, 0x45, 0xcd, 0xe7, 0x57, 0xfe, + 0x1e, 0x8c, 0x1b, 0x4f, 0xe6, 0xbc, 0xb2, 0xa7, 0xa2, 0x57, 0x14, 0xaf, + 0x77, 0x36, 0x59, 0x7f, 0x38, 0xf3, 0x08, 0x55, 0x97, 0xd8, 0x5f, 0xcf, + 0x98, 0xf2, 0x58, 0x3b, 0x79, 0xb3, 0xd1, 0xac, 0xbd, 0xb7, 0x4d, 0x65, + 0xff, 0x9b, 0x2d, 0x96, 0xd5, 0xf7, 0x70, 0xa3, 0xf5, 0x97, 0x9b, 0x8b, + 0x70, 0x6e, 0x2b, 0x2f, 0xde, 0x8e, 0xbc, 0xcb, 0x2f, 0xe8, 0x29, 0x0c, + 0x0c, 0x59, 0x7f, 0xba, 0x62, 0x4d, 0xc0, 0x7c, 0xb2, 0xff, 0xb3, 0x5a, + 0x89, 0x3f, 0xcd, 0x2c, 0xbe, 0x0b, 0xb8, 0x55, 0x17, 0x82, 0xfd, 0xef, + 0x82, 0x7a, 0x59, 0x7f, 0xe7, 0xf4, 0x6f, 0xd6, 0xb3, 0xee, 0x2c, 0xad, + 0x22, 0x61, 0x85, 0xc4, 0x53, 0x7e, 0xd7, 0x9b, 0x5e, 0x4c, 0xb2, 0xe7, + 0xe2, 0xcb, 0xdb, 0x99, 0xd5, 0x95, 0xf9, 0xb5, 0xf0, 0xb5, 0xf9, 0x90, + 0x52, 0x75, 0x97, 0xf4, 0x17, 0xb7, 0xb8, 0x56, 0x5f, 0xd2, 0x8d, 0xf1, + 0xaf, 0x96, 0x54, 0x8f, 0x7b, 0x0b, 0xaf, 0xf4, 0x79, 0xfb, 0x38, 0x70, + 0xb2, 0xff, 0xc2, 0x33, 0xe9, 0x7b, 0x0b, 0xdc, 0x59, 0x76, 0x0a, 0xb2, + 0xfc, 0xf2, 0xf1, 0xec, 0xb2, 0xa1, 0x10, 0x18, 0x82, 0x62, 0xf7, 0x63, + 0x16, 0x5f, 0x8f, 0xa3, 0x3e, 0x2c, 0xb1, 0xec, 0x6f, 0x64, 0x2d, 0x7e, + 0xc2, 0xfd, 0xbe, 0x16, 0x5f, 0xa0, 0x40, 0x3f, 0x16, 0x5d, 0x30, 0xd6, + 0x5f, 0xfc, 0xc8, 0x0c, 0xec, 0x20, 0x4b, 0x38, 0xb2, 0xff, 0x74, 0xda, + 0x17, 0x4e, 0xd2, 0xcb, 0xff, 0xff, 0x39, 0xf9, 0xd8, 0xe5, 0xf8, 0x7a, + 0x7a, 0x90, 0x92, 0xc2, 0x59, 0x7f, 0x47, 0xdf, 0x49, 0xfe, 0x59, 0x43, + 0x4c, 0xbb, 0x06, 0x02, 0x8b, 0xd3, 0x60, 0x35, 0xdf, 0xe7, 0x2f, 0xfd, + 0xb9, 0x9d, 0x59, 0x7f, 0xdd, 0x79, 0x30, 0xe3, 0x52, 0x59, 0x6c, 0xdd, + 0x3e, 0xee, 0x9b, 0x5f, 0x41, 0x4b, 0x75, 0x65, 0xf6, 0x79, 0xa0, 0xac, + 0xba, 0x3f, 0x59, 0x52, 0x44, 0x40, 0xa5, 0x5c, 0x24, 0xf1, 0x1d, 0xfe, + 0x7e, 0xb8, 0x8c, 0xce, 0x2c, 0xa6, 0xc2, 0xff, 0x4b, 0x64, 0x85, 0xb8, + 0x8e, 0xb7, 0x04, 0xe8, 0x2f, 0xd8, 0xa2, 0x45, 0xa3, 0x37, 0xc8, 0x69, + 0x0a, 0x5f, 0xf3, 0x21, 0x91, 0x4d, 0x08, 0x46, 0x10, 0xf6, 0x16, 0x8e, + 0xd5, 0xf9, 0x39, 0x15, 0x72, 0x35, 0x6f, 0x46, 0x81, 0xbc, 0xfa, 0xff, + 0x7d, 0x3f, 0x3f, 0x7d, 0x71, 0x65, 0xfe, 0xfe, 0x7c, 0xd2, 0x82, 0xf2, + 0xca, 0x9e, 0x9d, 0xe4, 0x46, 0x9d, 0xa3, 0x7b, 0xe2, 0x18, 0x9f, 0x2c, + 0xbc, 0x79, 0xf2, 0xcb, 0xe0, 0xbb, 0x85, 0x51, 0x7a, 0x2f, 0xfc, 0x7e, + 0xe9, 0x3c, 0xbf, 0x7f, 0xd6, 0x56, 0x8f, 0xb5, 0x85, 0xd7, 0xec, 0xf1, + 0x46, 0xcb, 0x2f, 0xfc, 0xe7, 0xe0, 0x69, 0xf7, 0xe0, 0xd6, 0x5e, 0x61, + 0xf9, 0x65, 0xff, 0x3f, 0xa5, 0x02, 0xf8, 0xf6, 0x59, 0x4c, 0x3d, 0x62, + 0x1c, 0xbf, 0x63, 0x3a, 0xe3, 0x59, 0x50, 0x9e, 0x98, 0xc9, 0x32, 0x11, + 0x3a, 0x22, 0xe9, 0x38, 0x90, 0x95, 0x6f, 0x21, 0xbf, 0xfb, 0x07, 0xdc, + 0x63, 0x1e, 0x58, 0x4b, 0x2f, 0x02, 0x3f, 0x59, 0x7d, 0xbf, 0x0a, 0x78, + 0xcf, 0x7f, 0x48, 0x57, 0xfa, 0x7f, 0xb2, 0x69, 0x38, 0xd6, 0x51, 0x9f, + 0x97, 0x4f, 0x2a, 0x7a, 0x6c, 0x79, 0x1a, 0x15, 0x43, 0xa8, 0xc2, 0xda, + 0x15, 0xb2, 0x86, 0xc6, 0x52, 0x65, 0xc3, 0x19, 0x61, 0xce, 0x62, 0xcd, + 0x28, 0xaf, 0x51, 0xa5, 0xb2, 0x39, 0xce, 0xc6, 0x43, 0xfc, 0x72, 0xe5, + 0x28, 0x13, 0x8d, 0xa0, 0xa4, 0xf0, 0xb5, 0x2d, 0xba, 0xe0, 0x75, 0x65, + 0xff, 0xc0, 0x89, 0x8b, 0x37, 0xbb, 0x18, 0x6b, 0x2f, 0xb3, 0xaf, 0xe5, + 0x97, 0xfb, 0x0f, 0x5f, 0xfe, 0x0e, 0x2c, 0xb3, 0x60, 0x54, 0x4d, 0x92, + 0x2f, 0x08, 0x6f, 0xff, 0x7b, 0x80, 0x8e, 0x67, 0x8d, 0x8f, 0x25, 0x97, + 0xa3, 0xed, 0x96, 0x51, 0x1f, 0x3f, 0x92, 0x6f, 0xfb, 0xdc, 0xcf, 0xa5, + 0xd0, 0x0a, 0xb2, 0xf7, 0x22, 0x65, 0x94, 0x67, 0xf4, 0x44, 0x3c, 0x3c, + 0xbc, 0x4f, 0xd5, 0x97, 0xb7, 0xc4, 0x96, 0x5f, 0xf1, 0x18, 0xbe, 0xf8, + 0x27, 0xd5, 0x95, 0x07, 0xb1, 0x83, 0xd7, 0xf3, 0xea, 0x44, 0x07, 0x59, + 0x71, 0xb1, 0x65, 0x00, 0xf0, 0x9b, 0xcb, 0x2f, 0x3b, 0x85, 0x51, 0x11, + 0xaf, 0x85, 0x0b, 0xe9, 0x65, 0x04, 0xf2, 0xcc, 0xa2, 0xfc, 0xd9, 0xf7, + 0x1f, 0xf5, 0x97, 0x82, 0x23, 0x16, 0x5f, 0xff, 0xf4, 0x4d, 0xe8, 0xe6, + 0xa3, 0xc6, 0x13, 0x1c, 0xe1, 0x49, 0xd6, 0x54, 0x22, 0x18, 0x87, 0xaf, + 0xfe, 0x3e, 0x77, 0x05, 0x15, 0xe7, 0x0f, 0xe5, 0x95, 0xa4, 0xcf, 0x98, + 0x43, 0xe8, 0x59, 0xef, 0x21, 0xbf, 0xfe, 0xe8, 0x39, 0xcc, 0x61, 0x66, + 0xf9, 0xd0, 0xdd, 0x2c, 0xbf, 0xdb, 0x6b, 0x3d, 0xe3, 0xf2, 0xca, 0x59, + 0x7f, 0xf7, 0x73, 0xc5, 0x13, 0x4e, 0x14, 0x9d, 0x65, 0xc0, 0x89, 0x8f, + 0x47, 0xc1, 0x75, 0x08, 0xb3, 0xe4, 0x21, 0x6f, 0x14, 0x7c, 0xb2, 0xa4, + 0x78, 0x63, 0x27, 0xbf, 0xec, 0xd6, 0x73, 0x1c, 0xb6, 0x59, 0x7b, 0x06, + 0xc5, 0x97, 0xff, 0xfb, 0xae, 0x7e, 0x8e, 0x96, 0x7b, 0xa7, 0xdc, 0x36, + 0x96, 0x5f, 0xff, 0xfe, 0xf7, 0x8d, 0x9a, 0x3c, 0xf8, 0x81, 0xe8, 0xec, + 0xed, 0xe7, 0xe9, 0xa1, 0x65, 0xfe, 0xc3, 0x23, 0xd6, 0xb1, 0x65, 0xff, + 0x63, 0x97, 0xfa, 0x04, 0x7e, 0xb2, 0xa1, 0x34, 0x3c, 0x5e, 0xf9, 0xf3, + 0x46, 0x17, 0xff, 0xe6, 0x6e, 0x9b, 0xbc, 0xde, 0xee, 0x4b, 0xa7, 0xbd, + 0x65, 0xfd, 0xf4, 0xb4, 0x08, 0xfd, 0x65, 0xfc, 0xcc, 0xd4, 0xa1, 0x8b, + 0x2a, 0x11, 0x6f, 0x8b, 0x4e, 0x61, 0x76, 0xcc, 0x49, 0x73, 0x4d, 0x24, + 0xbf, 0xf4, 0xf0, 0xf4, 0xe6, 0xec, 0x6d, 0x3f, 0xf3, 0x62, 0xd0, 0xc5, + 0xf6, 0xf8, 0xf4, 0x2c, 0xbf, 0x73, 0x3a, 0x58, 0xb2, 0xa4, 0x8a, 0x63, + 0x5d, 0xf1, 0x1d, 0xf9, 0xd9, 0x9f, 0x79, 0x65, 0xee, 0x3e, 0xea, 0xca, + 0xc3, 0xc7, 0x32, 0x8b, 0xfe, 0x04, 0x77, 0x26, 0x93, 0xec, 0xb2, 0xfe, + 0x9f, 0xc3, 0xd3, 0xfe, 0xb2, 0xb0, 0xfa, 0x9c, 0xea, 0xdb, 0xab, 0x2f, + 0x8b, 0xe9, 0xa1, 0x65, 0xff, 0x46, 0x7d, 0x0f, 0x27, 0x92, 0xcb, 0xfc, + 0x3c, 0xfe, 0x71, 0x67, 0xeb, 0x2f, 0x99, 0xef, 0xdd, 0x65, 0x37, 0x68, + 0xc7, 0x81, 0x41, 0x91, 0xe1, 0xbb, 0x9b, 0x5f, 0x8b, 0x3a, 0xfe, 0x59, + 0x7a, 0x77, 0x02, 0xb2, 0xb7, 0x4f, 0x17, 0xa4, 0xd7, 0xf8, 0xdf, 0xfd, + 0x68, 0x1d, 0x59, 0x7f, 0x40, 0xb8, 0x46, 0x2a, 0xcb, 0xfb, 0x3c, 0xdf, + 0xec, 0xea, 0xca, 0xc4, 0x5b, 0x74, 0x94, 0x8d, 0x38, 0x5b, 0x7f, 0xff, + 0x06, 0x7e, 0x9c, 0x8f, 0xd3, 0xf5, 0x1e, 0x27, 0xfd, 0x65, 0xff, 0xde, + 0x28, 0xfd, 0xfd, 0xf8, 0x85, 0x25, 0x94, 0xdc, 0xb3, 0x73, 0x5b, 0x30, + 0xb2, 0x88, 0xc6, 0xf6, 0x2d, 0x93, 0x98, 0xd8, 0xb2, 0x3a, 0xe0, 0xa2, + 0xfd, 0x1a, 0x71, 0x91, 0x4c, 0x6f, 0xa8, 0xd7, 0xfb, 0x0f, 0x47, 0x8c, + 0x13, 0xf7, 0x62, 0x84, 0x57, 0x21, 0xcf, 0xe8, 0xd1, 0xf7, 0x9d, 0x88, + 0xbd, 0x73, 0x7f, 0x56, 0x5f, 0xb4, 0x17, 0x70, 0xaa, 0x22, 0xe5, 0xfb, + 0xdf, 0x88, 0x52, 0x49, 0x7e, 0xe7, 0xbb, 0x1f, 0xac, 0xbf, 0x3e, 0xd1, + 0xa0, 0x2c, 0xb4, 0xfd, 0x91, 0x93, 0x83, 0x4e, 0x68, 0x02, 0xad, 0xc2, + 0x9a, 0x9e, 0xa9, 0xc6, 0x52, 0x87, 0x6f, 0xfe, 0x63, 0xca, 0x7e, 0x68, + 0x2e, 0xe1, 0x54, 0x4c, 0xcb, 0xdd, 0x3e, 0x2c, 0xbe, 0x6c, 0x72, 0x3c, + 0xb2, 0xfe, 0x8e, 0x14, 0x7b, 0x8b, 0x29, 0xb5, 0x4f, 0x49, 0x84, 0xd4, + 0xdc, 0xa2, 0x5d, 0xb4, 0x6e, 0xbe, 0xc0, 0x6b, 0x65, 0x97, 0x6e, 0x37, + 0x6b, 0x29, 0xb2, 0x78, 0x4d, 0xaa, 0x47, 0x7b, 0xe8, 0xe2, 0xcb, 0xff, + 0xcd, 0x8f, 0x4b, 0x3b, 0xd7, 0x91, 0x99, 0x2c, 0xbc, 0x13, 0x62, 0xcb, + 0xfe, 0x6e, 0xff, 0x60, 0x9a, 0x3d, 0xa1, 0x65, 0xf3, 0x67, 0xce, 0x4b, + 0x2e, 0xdc, 0x6e, 0xd6, 0x5d, 0x80, 0x59, 0x7f, 0xf4, 0x31, 0xfd, 0x9f, + 0x7e, 0xc1, 0x3a, 0xb2, 0xff, 0xf0, 0x74, 0x0d, 0xbe, 0xe1, 0xe8, 0x3d, + 0xc5, 0x97, 0xc7, 0xbd, 0xff, 0x59, 0x50, 0x7e, 0x3e, 0x4d, 0xae, 0xa3, + 0x64, 0xa1, 0x71, 0x7c, 0x7b, 0x00, 0x96, 0x5f, 0xb3, 0x6c, 0xfe, 0x65, + 0x95, 0x38, 0xf3, 0x3c, 0x45, 0x7f, 0xa7, 0x61, 0x3e, 0xbf, 0xdc, 0x59, + 0x7f, 0xfe, 0x63, 0xf7, 0x3e, 0xff, 0xad, 0x3f, 0x66, 0xe8, 0x16, 0x5f, + 0xd9, 0xc8, 0x10, 0xa1, 0x65, 0x0d, 0x17, 0xd8, 0x71, 0xd5, 0xab, 0x62, + 0xcb, 0x9d, 0x8b, 0x2b, 0x86, 0x99, 0xbc, 0x42, 0xe6, 0xff, 0x2c, 0xb3, + 0x6d, 0x65, 0xbf, 0x83, 0x5e, 0x01, 0xab, 0xff, 0xfe, 0x28, 0x09, 0x43, + 0x27, 0x46, 0xb4, 0x7b, 0xf4, 0xef, 0xfa, 0xcb, 0xf8, 0xda, 0x3e, 0x60, + 0x56, 0x51, 0xa2, 0x57, 0x8d, 0x17, 0xc7, 0xe8, 0x92, 0xca, 0x6e, 0xd7, + 0x02, 0x82, 0x3e, 0x70, 0xef, 0x99, 0xcf, 0xb0, 0xe2, 0x75, 0x5f, 0xd4, + 0xfd, 0x0b, 0xcd, 0xe4, 0x57, 0xf3, 0x50, 0x45, 0x9e, 0x59, 0x7c, 0xfd, + 0x39, 0x96, 0x5d, 0xf7, 0x96, 0x5f, 0x76, 0x68, 0x1a, 0xca, 0xc4, 0x44, + 0x84, 0xb2, 0x62, 0x27, 0x18, 0xbf, 0x43, 0x0b, 0x26, 0x59, 0x7f, 0x1e, + 0x10, 0xfb, 0x0b, 0x2c, 0xc5, 0x94, 0x33, 0xe3, 0x09, 0x3e, 0xe9, 0x5d, + 0x2c, 0xbf, 0xb5, 0x04, 0x0c, 0xea, 0xcb, 0xed, 0x46, 0x12, 0xcb, 0xe7, + 0xf4, 0xbf, 0x59, 0x7f, 0xdc, 0x30, 0xbe, 0x6b, 0x3c, 0xb2, 0xff, 0x3e, + 0x8e, 0x37, 0x4d, 0x8b, 0x28, 0x28, 0xda, 0x61, 0x67, 0x48, 0x3c, 0x47, + 0xbc, 0xde, 0xff, 0xf4, 0xee, 0xb9, 0xfb, 0xf0, 0x11, 0x3c, 0x96, 0x5f, + 0xf0, 0x8c, 0xce, 0x3b, 0xfd, 0x25, 0x97, 0x9b, 0x8b, 0x76, 0xd8, 0x59, + 0x58, 0xa8, 0x50, 0x26, 0x47, 0x0e, 0x56, 0x26, 0x7e, 0x96, 0x47, 0x57, + 0xff, 0xff, 0xff, 0xff, 0x9b, 0x8b, 0x63, 0x1b, 0x8b, 0x65, 0xb5, 0x5b, + 0x54, 0x2d, 0xb8, 0x6e, 0x0d, 0x9d, 0x6c, 0xdf, 0x80, 0x1b, 0x6b, 0x8d, + 0xcf, 0x84, 0xeb, 0x66, 0x21, 0xb3, 0xba, 0xda, 0x7a, 0x74, 0xee, 0xee, + 0x2c, 0xbf, 0xff, 0x7f, 0xf4, 0xba, 0x08, 0xd4, 0xfe, 0x98, 0x5f, 0x4b, + 0x2f, 0xfd, 0xdc, 0x2c, 0x17, 0x0b, 0x06, 0xb2, 0xff, 0xef, 0x9a, 0x8f, + 0x0c, 0xf7, 0x79, 0x0c, 0x59, 0x7d, 0xcc, 0xfb, 0xcb, 0x2f, 0x8c, 0xbd, + 0xc5, 0x97, 0xff, 0xfc, 0xc3, 0xd7, 0x41, 0xc9, 0x46, 0xfd, 0x41, 0x7b, + 0xb9, 0x25, 0x95, 0x24, 0x44, 0x99, 0x0d, 0xff, 0x8f, 0xc6, 0x13, 0x1f, + 0xb0, 0x2b, 0x2a, 0x49, 0xc8, 0x61, 0xe6, 0x92, 0x7d, 0x0a, 0xc6, 0xf2, + 0x2b, 0xfe, 0x70, 0x96, 0x77, 0xb9, 0xfa, 0xcb, 0xef, 0x6e, 0x67, 0x56, + 0x5f, 0xff, 0xe7, 0x20, 0x96, 0x0f, 0xa0, 0x9d, 0xd8, 0x96, 0xa3, 0x65, + 0x95, 0x88, 0x87, 0x01, 0x2d, 0xfc, 0x21, 0x47, 0x62, 0x4b, 0x2f, 0xff, + 0xe1, 0x4b, 0x3f, 0x07, 0x27, 0x48, 0xfb, 0x01, 0x27, 0x59, 0x4c, 0x44, + 0x53, 0x96, 0xdf, 0x35, 0x0c, 0xf2, 0xcb, 0xfd, 0x8d, 0x47, 0x89, 0xf8, + 0xb2, 0xf1, 0xf4, 0xd6, 0x54, 0x1f, 0x81, 0x91, 0xf8, 0xca, 0xff, 0x9f, + 0x52, 0x9d, 0x81, 0x1e, 0x2c, 0xa6, 0xca, 0xee, 0x6c, 0x46, 0x5b, 0x91, + 0xf5, 0x69, 0x4b, 0xb0, 0xbf, 0x78, 0x56, 0x14, 0x24, 0x80, 0x5b, 0x4b, + 0x2f, 0xff, 0xb8, 0x7b, 0x98, 0x1e, 0x99, 0x10, 0x35, 0xb2, 0xca, 0xd1, + 0xee, 0xf8, 0x2e, 0xfe, 0xf6, 0x33, 0xec, 0x62, 0xca, 0xc3, 0xd0, 0x32, + 0x2b, 0xfe, 0xc6, 0x31, 0xe5, 0xc3, 0x92, 0xca, 0xe9, 0xec, 0x11, 0x05, + 0xff, 0xf6, 0x6f, 0xc1, 0xf6, 0x37, 0xb2, 0x09, 0xc4, 0x59, 0x7f, 0x0d, + 0xe5, 0xc3, 0x92, 0xca, 0xd1, 0xff, 0x81, 0x4a, 0xfc, 0x10, 0x17, 0xb8, + 0xb2, 0xf4, 0xb7, 0x1a, 0x59, 0x7e, 0x76, 0x8b, 0x06, 0xb2, 0xa0, 0xf2, + 0x34, 0x43, 0x7f, 0xe2, 0x80, 0x8a, 0xf9, 0xa3, 0xfd, 0x65, 0xfd, 0xcc, + 0x3d, 0x69, 0xd6, 0x56, 0xc7, 0xd5, 0xf9, 0xf5, 0xff, 0xf1, 0x96, 0xd9, + 0xc3, 0x7e, 0xcf, 0x69, 0xa6, 0x92, 0x5f, 0xf0, 0x1f, 0x5b, 0x80, 0xe9, + 0xe9, 0x65, 0x42, 0x2d, 0x06, 0x49, 0xd5, 0x4b, 0xfb, 0xec, 0xe8, 0x3e, + 0xfd, 0x65, 0xfb, 0xb1, 0xb7, 0x40, 0xb2, 0xb0, 0xf6, 0xbc, 0x63, 0x7f, + 0xc5, 0x90, 0x2b, 0xf9, 0xc5, 0x59, 0x7e, 0x97, 0x3f, 0x04, 0xcb, 0x2f, + 0x04, 0x01, 0x59, 0x5f, 0x1e, 0x40, 0x0a, 0xef, 0xfb, 0x6c, 0xfc, 0x60, + 0x7d, 0x49, 0x65, 0xfc, 0xee, 0x3d, 0xf8, 0x35, 0x97, 0x9d, 0xc2, 0xa8, + 0xb3, 0xd7, 0xf7, 0xee, 0x52, 0x36, 0x2c, 0xad, 0x91, 0x7c, 0x33, 0xb0, + 0x97, 0x7e, 0x51, 0x7f, 0xbb, 0xee, 0x3f, 0xc2, 0x31, 0x65, 0xfe, 0x89, + 0x1f, 0xa3, 0xdc, 0x59, 0x7d, 0xf8, 0x9d, 0x85, 0x95, 0xd3, 0xd6, 0x23, + 0x2a, 0x84, 0x56, 0x9c, 0x23, 0x2f, 0xff, 0x6b, 0xaf, 0x3b, 0x37, 0x96, + 0x73, 0x09, 0x65, 0xfe, 0x31, 0xe3, 0x1a, 0xce, 0xac, 0xbf, 0x70, 0x67, + 0x04, 0xb2, 0xa0, 0xf6, 0x7c, 0x67, 0x7f, 0xf7, 0x3c, 0x73, 0x34, 0xe3, + 0x8f, 0xb8, 0xb2, 0x8d, 0x30, 0xc7, 0x85, 0x20, 0x08, 0x6f, 0x34, 0xd3, + 0x49, 0x2f, 0xfc, 0xf2, 0xe1, 0x60, 0x47, 0x9a, 0x49, 0x3c, 0xd0, 0x5f, + 0x9b, 0xc0, 0xcc, 0x1a, 0xcb, 0xfd, 0xee, 0xe6, 0xf9, 0xd2, 0x62, 0xca, + 0xc3, 0xe3, 0x01, 0x5d, 0xff, 0xbe, 0x91, 0x03, 0xf9, 0xc1, 0x67, 0xeb, + 0x2e, 0x81, 0x56, 0x5f, 0xf0, 0xe0, 0xa3, 0xf9, 0x74, 0xd6, 0x54, 0x22, + 0x53, 0x64, 0x53, 0x17, 0xbf, 0xdd, 0x31, 0x93, 0xbc, 0xcb, 0x2f, 0xf0, + 0xfa, 0x07, 0xff, 0x73, 0x16, 0x54, 0x1f, 0x49, 0x99, 0x5f, 0xe8, 0x9d, + 0xec, 0xe7, 0x21, 0x65, 0xfc, 0x31, 0x06, 0x0f, 0x71, 0x65, 0x68, 0xf9, + 0x08, 0xd2, 0xfe, 0xce, 0x4b, 0xa2, 0x71, 0x65, 0x19, 0xe8, 0x11, 0x0d, + 0xe8, 0x21, 0x56, 0x54, 0x99, 0x3f, 0xa3, 0x85, 0x06, 0x11, 0x0a, 0xe0, + 0x18, 0xcf, 0xfe, 0x84, 0x49, 0x90, 0xcd, 0x08, 0x0d, 0x43, 0x85, 0x90, + 0xec, 0xec, 0x66, 0x5f, 0xaa, 0x14, 0x2c, 0xb9, 0x0b, 0x5f, 0x42, 0x63, + 0x7c, 0x35, 0x04, 0x20, 0xbb, 0xfe, 0x2c, 0xbe, 0xd1, 0xc7, 0x96, 0x5f, + 0xdc, 0x2c, 0x9a, 0x18, 0xb2, 0xc0, 0xfc, 0xf3, 0xbc, 0x43, 0x74, 0x79, + 0x65, 0xf7, 0xee, 0xd7, 0x96, 0x5f, 0xe7, 0x6b, 0xa7, 0x1a, 0x85, 0x97, + 0xe3, 0xdf, 0x05, 0xe5, 0x94, 0x34, 0xc8, 0xc5, 0x66, 0xf8, 0xa4, 0xc5, + 0xb4, 0x49, 0xc3, 0x2b, 0xff, 0x68, 0xf9, 0x21, 0x3b, 0x05, 0x0b, 0x2f, + 0xb4, 0x70, 0xc5, 0x97, 0xff, 0xef, 0x0a, 0x08, 0xc1, 0xf7, 0x39, 0xf4, + 0xa3, 0xab, 0x2b, 0x48, 0xb6, 0x61, 0xf1, 0x10, 0xdc, 0xf2, 0x59, 0x7f, + 0xff, 0xff, 0x13, 0xb5, 0xec, 0xe9, 0x67, 0x81, 0xfb, 0x1e, 0x4e, 0x38, + 0x27, 0xd3, 0xc9, 0x65, 0xfe, 0xce, 0xf4, 0x1e, 0x72, 0x59, 0x71, 0x8d, + 0x65, 0xfd, 0xd0, 0xbe, 0x9e, 0x4b, 0x2c, 0x19, 0x1e, 0x1e, 0x0b, 0x5e, + 0x39, 0xb8, 0xb2, 0xa0, 0xf1, 0x18, 0x4f, 0x63, 0x1a, 0x6e, 0xd3, 0x0b, + 0x6a, 0x10, 0xcc, 0x85, 0xcd, 0xf8, 0xfa, 0xec, 0x35, 0x97, 0x9c, 0xbf, + 0x59, 0x53, 0x8f, 0x08, 0x24, 0xd7, 0xb7, 0xe0, 0xd6, 0x5b, 0x5b, 0x1e, + 0x14, 0xc4, 0x97, 0xb4, 0xfd, 0x59, 0x7f, 0x9b, 0xf5, 0x8d, 0xe4, 0x06, + 0x96, 0x5b, 0x36, 0x3d, 0x66, 0x87, 0x2a, 0x15, 0x90, 0x76, 0x3a, 0x57, + 0x86, 0x91, 0x42, 0x02, 0xff, 0xff, 0xfb, 0xfe, 0x66, 0x10, 0xa2, 0x68, + 0xa3, 0x3b, 0x3f, 0x85, 0x9b, 0x33, 0x18, 0xb2, 0xf6, 0xda, 0xc5, 0x97, + 0xd0, 0x42, 0x31, 0x65, 0x61, 0xbf, 0x10, 0x76, 0xb1, 0x1c, 0x1e, 0x85, + 0xfd, 0xdf, 0xf1, 0x65, 0xf3, 0xf6, 0x04, 0x59, 0x58, 0x6e, 0xb7, 0x8c, + 0x5f, 0xff, 0x03, 0xe9, 0x70, 0x7d, 0x8d, 0x0d, 0xdd, 0xa5, 0x95, 0x88, + 0xd5, 0x36, 0x12, 0x22, 0xbc, 0x4c, 0x35, 0x97, 0xbc, 0x26, 0x2c, 0xba, + 0x36, 0x59, 0x4e, 0x6d, 0x38, 0x3b, 0x78, 0x71, 0x25, 0x97, 0xfd, 0x18, + 0x1e, 0x9e, 0xf7, 0xd2, 0xcb, 0xb3, 0xab, 0x29, 0xcf, 0xac, 0x87, 0x37, + 0x0e, 0x6e, 0xc1, 0xac, 0xbb, 0xcd, 0xb5, 0x95, 0x24, 0xda, 0x30, 0xb7, + 0x89, 0xfe, 0x84, 0x5e, 0xf3, 0x0d, 0xc1, 0x6b, 0xfb, 0x35, 0xfb, 0x0f, + 0x8b, 0x2f, 0x74, 0x0d, 0x2c, 0xbf, 0x73, 0xc7, 0x1f, 0x2c, 0xb8, 0x01, + 0x59, 0x52, 0x37, 0xff, 0x94, 0x5e, 0xf6, 0x08, 0xb2, 0xfe, 0x60, 0x39, + 0xec, 0xf2, 0xcb, 0xf3, 0xf7, 0xe9, 0x71, 0x65, 0x41, 0xeb, 0x80, 0xba, + 0xfe, 0x8f, 0xb9, 0x3b, 0x50, 0xb2, 0xf0, 0xc0, 0x15, 0x97, 0xc3, 0x28, + 0x92, 0xca, 0x33, 0x7c, 0xe3, 0xb7, 0xff, 0x84, 0x9d, 0xf7, 0x8a, 0x32, + 0x76, 0x7d, 0xe5, 0x95, 0x0a, 0x87, 0xc6, 0x5d, 0xf2, 0xe9, 0x91, 0x4c, + 0xe8, 0xc2, 0x1e, 0xb7, 0x00, 0x7e, 0xff, 0x1c, 0xce, 0x47, 0xf7, 0x16, + 0x5d, 0x81, 0x59, 0x7f, 0x8b, 0xdc, 0x28, 0xf7, 0x16, 0x5f, 0xee, 0x96, + 0x1f, 0xf1, 0xfa, 0xcb, 0xf1, 0xef, 0xc2, 0xe2, 0xca, 0xc4, 0x46, 0x99, + 0x96, 0x8c, 0xef, 0xef, 0xbd, 0x9d, 0x06, 0xea, 0xcb, 0xfb, 0x59, 0xde, + 0x83, 0xcb, 0x2f, 0xdd, 0x28, 0xcd, 0x28, 0xbf, 0xb3, 0x5b, 0x01, 0xc6, + 0xa8, 0x83, 0x53, 0xcd, 0x35, 0xb5, 0xb2, 0x28, 0x64, 0xa9, 0x7c, 0x5d, + 0xcf, 0x96, 0x54, 0x26, 0x3e, 0x70, 0xd3, 0x72, 0xab, 0xf3, 0x84, 0xd9, + 0x0b, 0x2f, 0xe9, 0x74, 0x9f, 0xef, 0x2c, 0xa0, 0x9e, 0xa1, 0x13, 0x5f, + 0x08, 0x4f, 0xb2, 0xca, 0xc3, 0xc4, 0xe1, 0x0d, 0xfa, 0x3d, 0x39, 0x8d, + 0x2c, 0xbc, 0xc8, 0x0a, 0xcb, 0xe2, 0xfc, 0x1c, 0x59, 0x63, 0xc3, 0x7f, + 0xa1, 0xcb, 0xfe, 0x1f, 0x39, 0x9a, 0x1f, 0x71, 0x65, 0xfe, 0x91, 0xb2, + 0x3a, 0x20, 0xd6, 0x5f, 0xfe, 0x8c, 0x2f, 0xbd, 0x9a, 0x3d, 0x9d, 0x8b, + 0x2f, 0x9a, 0xf6, 0x77, 0x87, 0xfb, 0xe3, 0x4a, 0x84, 0x78, 0x3c, 0x2d, + 0xaa, 0x72, 0xe5, 0xa3, 0x72, 0x67, 0x10, 0xa3, 0x94, 0x69, 0xb9, 0x0c, + 0xbd, 0x10, 0xf5, 0xa8, 0xa3, 0x15, 0xbd, 0xcc, 0x92, 0xcb, 0xb0, 0x45, + 0x97, 0xdf, 0xf6, 0x06, 0xb2, 0xfe, 0xe9, 0xb4, 0x50, 0x35, 0x97, 0xfd, + 0x1f, 0xb2, 0x30, 0xbd, 0xc5, 0x97, 0xfd, 0xcc, 0x6b, 0xae, 0xc3, 0xe2, + 0xca, 0x34, 0x60, 0xcc, 0x47, 0xd2, 0xde, 0x1c, 0x5f, 0x8f, 0xe9, 0x19, + 0x2c, 0xbc, 0x7d, 0xc5, 0x97, 0xf7, 0x9d, 0x8c, 0x86, 0x2c, 0xba, 0x19, + 0x87, 0xde, 0x12, 0x7f, 0x86, 0xef, 0xbe, 0xe0, 0x09, 0x65, 0xfb, 0x19, + 0x1a, 0x15, 0x65, 0x6c, 0x79, 0x6d, 0x11, 0xdf, 0x0f, 0x9d, 0x85, 0x97, + 0xe2, 0xd3, 0x4f, 0xb2, 0xca, 0x83, 0xef, 0xc2, 0x47, 0x22, 0xbf, 0x67, + 0xb8, 0x6c, 0x59, 0x70, 0x09, 0x65, 0x42, 0xaf, 0xd9, 0x0e, 0x64, 0x36, + 0x0e, 0x15, 0x9a, 0x87, 0xa1, 0x16, 0x70, 0x9e, 0xf7, 0x70, 0x96, 0x5f, + 0xec, 0x2c, 0xfb, 0xd2, 0x62, 0xcb, 0xbd, 0x0b, 0x2a, 0x0f, 0x25, 0xcc, + 0xef, 0xe8, 0xd9, 0x8f, 0x34, 0x2c, 0xb6, 0x96, 0x54, 0xc6, 0xfc, 0x05, + 0xd7, 0xff, 0xce, 0x2f, 0xa3, 0x5f, 0xea, 0x3c, 0x4f, 0xfa, 0xcb, 0xf8, + 0xb3, 0xfc, 0x29, 0x2c, 0xbf, 0xfe, 0x16, 0x70, 0x84, 0xfe, 0xe1, 0xfd, + 0xd3, 0x69, 0x65, 0x8b, 0x11, 0x02, 0xe5, 0x95, 0x89, 0xee, 0xe9, 0x91, + 0xd7, 0xc8, 0x88, 0x10, 0xd2, 0xbb, 0x9b, 0xd6, 0x5c, 0x7e, 0x59, 0x7c, + 0x64, 0xe3, 0x59, 0x7f, 0xe6, 0x67, 0xb8, 0x27, 0x1e, 0x58, 0xb2, 0xfd, + 0xc8, 0xd7, 0xa1, 0x64, 0xf3, 0x7f, 0x43, 0x44, 0xc7, 0x17, 0xef, 0x61, + 0x8a, 0xb2, 0xfa, 0x67, 0x7d, 0x2c, 0xa2, 0x37, 0xc2, 0x0e, 0x5f, 0x77, + 0x0f, 0x7a, 0xcb, 0xfb, 0x87, 0xac, 0x06, 0x96, 0x5f, 0xff, 0xd3, 0x4e, + 0x30, 0x83, 0x5c, 0x04, 0xe6, 0x1f, 0xba, 0x6b, 0x2e, 0x81, 0x56, 0x54, + 0x1f, 0xc1, 0xb0, 0xd6, 0x2a, 0x31, 0x14, 0x64, 0xe1, 0x5c, 0xc6, 0x1e, + 0x90, 0xf8, 0x8d, 0xbe, 0x14, 0xb7, 0x31, 0xb0, 0xa8, 0xbf, 0x17, 0xec, + 0x23, 0xfa, 0x4b, 0x2f, 0x6b, 0x31, 0x65, 0x19, 0xe1, 0x70, 0x9e, 0xff, + 0xe9, 0x78, 0x12, 0x93, 0x3d, 0xe8, 0x62, 0xcb, 0xfd, 0xee, 0x46, 0xd9, + 0xc1, 0xac, 0xbb, 0xb8, 0xb2, 0xff, 0xfb, 0xb0, 0x3c, 0x0c, 0xec, 0x2c, + 0x1f, 0x61, 0x65, 0xff, 0x6a, 0x3a, 0x7b, 0xf5, 0x12, 0x59, 0x7f, 0xf1, + 0xe1, 0x66, 0x72, 0x74, 0xb8, 0xc5, 0x97, 0xfe, 0x78, 0xfa, 0x53, 0xb9, + 0xf0, 0xe1, 0x65, 0x0d, 0x3c, 0x0f, 0x88, 0x4d, 0x1b, 0x74, 0xd2, 0x61, + 0x6d, 0x27, 0xf0, 0xeb, 0xc8, 0x97, 0x85, 0x8d, 0x2c, 0xbf, 0x87, 0x1f, + 0xeb, 0x3e, 0x59, 0x53, 0xcf, 0x31, 0x83, 0xb7, 0x07, 0x65, 0x97, 0xfa, + 0x19, 0x87, 0xa9, 0xa4, 0xb2, 0xe3, 0x99, 0x65, 0xfe, 0xd4, 0x0a, 0x32, + 0x8f, 0x96, 0x5f, 0x41, 0x60, 0xab, 0x2f, 0xfe, 0x00, 0xf3, 0x51, 0x23, + 0x1c, 0x12, 0xcb, 0xfe, 0x27, 0xda, 0x35, 0xa7, 0x92, 0xcb, 0xbd, 0x12, + 0x3f, 0xae, 0xa1, 0x5e, 0xf1, 0xec, 0xb2, 0xfd, 0xfb, 0xfd, 0x13, 0x2c, + 0xbc, 0x50, 0x15, 0x97, 0xff, 0x0c, 0xe6, 0xec, 0x6b, 0xe9, 0x46, 0x96, + 0x5f, 0xfe, 0x32, 0x7f, 0xb9, 0xcc, 0xd0, 0xfb, 0x8b, 0x2a, 0x72, 0xa0, + 0x49, 0x0b, 0x84, 0xd0, 0xe1, 0x36, 0xc2, 0xd7, 0x1d, 0x22, 0xae, 0x0d, + 0xb7, 0xa3, 0x5a, 0x16, 0x5e, 0xe9, 0xf9, 0x65, 0xb7, 0xe1, 0xac, 0x10, + 0x42, 0xff, 0x0b, 0x9a, 0xd8, 0x0e, 0x35, 0x95, 0x0b, 0xdc, 0x43, 0x72, + 0xc9, 0x45, 0x47, 0x0c, 0x26, 0x12, 0x74, 0x61, 0xe5, 0x1b, 0xff, 0x0b, + 0x30, 0x14, 0xde, 0x63, 0x88, 0xb2, 0xff, 0xb0, 0xa4, 0x58, 0xc8, 0x0a, + 0xcb, 0xf7, 0x4f, 0x7e, 0x0d, 0x65, 0xff, 0x87, 0x05, 0x84, 0x09, 0x67, + 0x16, 0x5f, 0x9d, 0x86, 0xdf, 0x8b, 0x2f, 0xec, 0xeb, 0xf9, 0xe6, 0x59, + 0x74, 0x7c, 0xb2, 0xbe, 0x3c, 0x4f, 0x16, 0xd6, 0x22, 0x41, 0xdb, 0x6f, + 0xfb, 0x00, 0x59, 0xe2, 0x76, 0x2c, 0xb8, 0xe6, 0x59, 0x76, 0x0a, 0xb2, + 0xa0, 0xd7, 0x74, 0x5e, 0xed, 0x62, 0xcb, 0xc4, 0xdd, 0xb7, 0xac, 0xbe, + 0x3d, 0x44, 0x96, 0x5f, 0x6c, 0xc8, 0xe2, 0xca, 0xd8, 0xf1, 0x30, 0x86, + 0xff, 0xee, 0xc7, 0x9c, 0x1e, 0x7f, 0xb3, 0xcb, 0x2f, 0xc1, 0x78, 0x3d, + 0xc5, 0x97, 0x8b, 0x38, 0xb2, 0xff, 0xff, 0xd1, 0xd3, 0x64, 0xf9, 0xa4, + 0xfa, 0x13, 0xa7, 0xf7, 0x02, 0x7b, 0x2c, 0xad, 0x95, 0xc3, 0x8c, 0x74, + 0x53, 0x63, 0x29, 0x9a, 0x19, 0x9a, 0x21, 0xeb, 0x27, 0xe4, 0x04, 0x2d, + 0xc6, 0x8f, 0x11, 0x01, 0x10, 0x42, 0x96, 0xf1, 0xbb, 0xc7, 0xde, 0x2c, + 0xbe, 0x9c, 0xf2, 0x6e, 0x96, 0x5f, 0xfd, 0x9b, 0xf0, 0x78, 0x40, 0x96, + 0x71, 0x65, 0xfb, 0x51, 0xd1, 0x06, 0xb2, 0xb4, 0x7d, 0xae, 0x89, 0x7d, + 0x07, 0xb4, 0x2c, 0xbe, 0x69, 0xf3, 0x8b, 0x2f, 0xe1, 0xc7, 0xe5, 0x9f, + 0x2c, 0xbf, 0xe9, 0x31, 0xe5, 0xee, 0x40, 0xab, 0x2a, 0x11, 0x15, 0x84, + 0x4e, 0x5d, 0x7b, 0x86, 0x4b, 0x2f, 0xc4, 0x19, 0xdc, 0xf9, 0x65, 0xfe, + 0x12, 0x51, 0xbc, 0xcb, 0xf5, 0x95, 0x87, 0xf8, 0xe3, 0x64, 0x57, 0x58, + 0xa9, 0x4f, 0x74, 0x71, 0xe1, 0x2d, 0xf9, 0x09, 0x42, 0xac, 0x10, 0xa9, + 0xbb, 0x69, 0x2c, 0xbc, 0x7d, 0x35, 0x95, 0xf1, 0xb3, 0xf0, 0xc5, 0xf6, + 0x7d, 0x28, 0x59, 0x78, 0x0f, 0xc5, 0x95, 0xd3, 0x7c, 0x21, 0x15, 0xff, + 0x18, 0xb0, 0x38, 0xdf, 0x9d, 0x59, 0x7f, 0xdd, 0x36, 0xbe, 0x97, 0x30, + 0x2b, 0x2f, 0xe0, 0x72, 0x26, 0x06, 0x96, 0x5e, 0x06, 0x7c, 0xb2, 0xba, + 0x79, 0x9e, 0x2f, 0xbf, 0xb1, 0x9a, 0xd4, 0x0d, 0x65, 0xfe, 0x90, 0x0b, + 0x6e, 0x1f, 0xcb, 0x2f, 0xbf, 0xff, 0x3e, 0x59, 0x7f, 0xfe, 0x8d, 0x7f, + 0x9c, 0x20, 0x3c, 0xba, 0x07, 0xd9, 0x65, 0xfb, 0xd8, 0xe4, 0x15, 0x95, + 0xd3, 0xfc, 0x6f, 0x56, 0xbf, 0xfc, 0x3e, 0xc7, 0xd2, 0x2c, 0x66, 0x7d, + 0xe5, 0x97, 0xe6, 0x67, 0x70, 0x96, 0x51, 0x9f, 0x8b, 0xa5, 0xdf, 0xf0, + 0x1e, 0x43, 0xcc, 0xff, 0x8b, 0x2f, 0xcc, 0xcd, 0x39, 0x2c, 0xbf, 0xf7, + 0xd2, 0xec, 0x31, 0xfe, 0x96, 0x2c, 0xbf, 0x8f, 0xef, 0xa5, 0x9e, 0x59, + 0x50, 0x89, 0x5c, 0x26, 0xfd, 0x02, 0xba, 0x8f, 0xde, 0x43, 0x3a, 0xfd, + 0xf7, 0x18, 0x7b, 0xab, 0x2f, 0xfe, 0xeb, 0x9f, 0xbf, 0x01, 0x13, 0xc9, + 0x65, 0xf4, 0x10, 0x1b, 0x6b, 0x2e, 0xce, 0x4e, 0x3e, 0x8e, 0xa1, 0xd4, + 0x23, 0x0c, 0xa1, 0x29, 0x7f, 0x3e, 0xdf, 0xb9, 0x0d, 0x65, 0x6c, 0xb9, + 0xb0, 0x33, 0xa0, 0xc2, 0x1c, 0xc8, 0xa6, 0x2d, 0xd1, 0xaf, 0x61, 0x43, + 0xc8, 0x4b, 0x7a, 0x31, 0xdd, 0xf0, 0xeb, 0xdc, 0x26, 0xbf, 0xa3, 0xfc, + 0x98, 0xd8, 0xb2, 0xf7, 0xb0, 0x96, 0x5e, 0xeb, 0xee, 0xac, 0xbf, 0xc2, + 0x40, 0x77, 0x33, 0x50, 0xb2, 0xff, 0x87, 0x80, 0xd6, 0xc1, 0x3d, 0x96, + 0x5f, 0xd1, 0xd3, 0xd4, 0x31, 0x65, 0x49, 0x1a, 0xe2, 0x8d, 0xf4, 0x7d, + 0xcd, 0xbc, 0x77, 0x50, 0xbe, 0x09, 0x93, 0x9f, 0x47, 0x0b, 0xb7, 0x8c, + 0x16, 0xe9, 0x80, 0xb2, 0xcc, 0x59, 0x5f, 0x1a, 0x96, 0xd8, 0xc5, 0xfe, + 0xf7, 0xe0, 0x2e, 0x18, 0xd6, 0x5f, 0xa5, 0xfe, 0x60, 0xd6, 0x5f, 0x46, + 0xb3, 0x79, 0x9e, 0xe3, 0x9a, 0x5f, 0xfe, 0x98, 0xa3, 0xdc, 0xf7, 0xc1, + 0x32, 0xd9, 0x65, 0xf8, 0xd8, 0x24, 0xdc, 0x59, 0x7f, 0x3f, 0xd2, 0x28, + 0x1a, 0xcb, 0xfe, 0x8f, 0xa4, 0x64, 0xc7, 0xf2, 0xca, 0x34, 0x6d, 0xf5, + 0x31, 0xca, 0x88, 0xb6, 0xfc, 0xf2, 0xcd, 0xa1, 0x65, 0xff, 0xd1, 0xce, + 0x63, 0x3c, 0x50, 0xce, 0x2c, 0xbf, 0xfa, 0x3e, 0x97, 0x81, 0x1b, 0x1f, + 0xde, 0x59, 0x7f, 0x8f, 0xae, 0x18, 0x21, 0xac, 0xa2, 0x3f, 0x8e, 0x23, + 0xdf, 0xd0, 0x1f, 0xd8, 0x0f, 0xd6, 0x5f, 0xb3, 0x79, 0x90, 0xd6, 0x5f, + 0xe1, 0xf0, 0xfb, 0xdc, 0x1a, 0xcb, 0xff, 0x8e, 0x38, 0x4f, 0x29, 0xdc, + 0xcd, 0x2c, 0xbc, 0x4f, 0xa5, 0x97, 0xce, 0xee, 0xde, 0xb2, 0xff, 0xf1, + 0xf3, 0x6c, 0x6b, 0x08, 0x0d, 0xf1, 0x3f, 0x0d, 0xf3, 0x06, 0xef, 0xf7, + 0xd2, 0xe4, 0xd2, 0x8d, 0x96, 0x50, 0xd5, 0x55, 0x84, 0x9f, 0x50, 0xbb, + 0x61, 0x0f, 0x4c, 0x1c, 0xa0, 0x8c, 0xfd, 0x08, 0x20, 0x32, 0x5f, 0xff, + 0xde, 0xcf, 0xbd, 0xad, 0x47, 0xbf, 0x10, 0xa5, 0xdc, 0x59, 0x71, 0xef, + 0x59, 0x77, 0x4f, 0xe3, 0xf6, 0x99, 0x7a, 0xfd, 0xd8, 0xde, 0x38, 0x59, + 0x78, 0x6e, 0x4b, 0x2d, 0xbd, 0x65, 0xfb, 0xef, 0x14, 0x75, 0x65, 0xb5, + 0x06, 0xed, 0xc4, 0xee, 0x06, 0x96, 0x54, 0x91, 0x76, 0x32, 0x9d, 0x2b, + 0x70, 0x96, 0xff, 0xd2, 0x82, 0xf6, 0x8f, 0x7e, 0x0d, 0x65, 0xff, 0x9f, + 0xdc, 0x04, 0x84, 0x19, 0xf9, 0x65, 0xec, 0x3e, 0x2c, 0xbf, 0x7b, 0xd8, + 0x0d, 0x96, 0x5f, 0xff, 0x6c, 0xfd, 0xc1, 0xce, 0xc2, 0x2c, 0x3f, 0xd6, + 0x56, 0xc8, 0x94, 0x08, 0xde, 0x8a, 0x6f, 0xfb, 0xa1, 0x37, 0x9d, 0xc7, + 0xea, 0xca, 0xc3, 0xeb, 0x73, 0x1b, 0xf3, 0x97, 0xd2, 0x35, 0x97, 0x81, + 0x04, 0xb2, 0xba, 0x78, 0x44, 0x4f, 0x7f, 0xfe, 0xe1, 0x4e, 0xeb, 0x9f, + 0xbf, 0x01, 0x13, 0xc9, 0x65, 0xfe, 0xe9, 0x8b, 0xb8, 0x0d, 0x0a, 0xb2, + 0xff, 0xa1, 0xa6, 0x76, 0x0c, 0xb6, 0x59, 0x7f, 0xfc, 0x59, 0xcc, 0x64, + 0x07, 0x3c, 0x7a, 0xc5, 0x94, 0x14, 0x5f, 0x78, 0xe7, 0x79, 0xcd, 0xff, + 0xa6, 0xe7, 0x81, 0xf6, 0x0d, 0xc9, 0x65, 0x61, 0xf9, 0x39, 0x95, 0xfd, + 0xb6, 0x68, 0xc3, 0x0b, 0x2f, 0x88, 0x70, 0xc5, 0x97, 0xff, 0xc0, 0x2f, + 0x73, 0xa7, 0x31, 0x43, 0x1e, 0x4b, 0x2f, 0xb0, 0x80, 0xeb, 0x29, 0x87, + 0xdf, 0xbd, 0x3e, 0xfe, 0x7f, 0xf0, 0x6f, 0x25, 0x95, 0x08, 0xe1, 0xc8, + 0x48, 0x19, 0x25, 0x1a, 0x68, 0x1d, 0x8c, 0x3a, 0xa1, 0x97, 0x5f, 0xb4, + 0x20, 0x87, 0x18, 0x9e, 0x4a, 0xe5, 0x0c, 0x3f, 0x8e, 0x1d, 0x53, 0x1e, + 0xb0, 0xff, 0xb1, 0x9f, 0xbb, 0x17, 0xe4, 0x25, 0x1c, 0x37, 0xa3, 0x60, + 0xbf, 0xfb, 0x0b, 0xfc, 0xcd, 0x73, 0xd1, 0x8b, 0x2f, 0xfb, 0xef, 0x66, + 0x8f, 0x67, 0x62, 0xcb, 0xd9, 0xbf, 0x16, 0x5b, 0x3f, 0x44, 0xc9, 0x21, + 0x70, 0xea, 0xf3, 0x6e, 0x46, 0xb2, 0xfa, 0x09, 0xe4, 0xb2, 0xfd, 0x9b, + 0xae, 0x5f, 0xce, 0x3c, 0x0d, 0x10, 0x5f, 0xdb, 0xfa, 0x71, 0xae, 0x2c, + 0xbf, 0xff, 0x4b, 0x85, 0x9e, 0xe1, 0xe3, 0x3d, 0xac, 0x69, 0x65, 0xff, + 0xba, 0x6c, 0x1e, 0x4d, 0x19, 0xa5, 0x97, 0xa5, 0x1f, 0x2c, 0xbe, 0x8f, + 0xdd, 0x8b, 0x2d, 0x2c, 0x3f, 0xd9, 0x8f, 0x88, 0x76, 0xbe, 0x4c, 0x18, + 0xa1, 0xa5, 0x7d, 0xc3, 0xf4, 0x2c, 0xa8, 0x3c, 0xa7, 0x29, 0xbf, 0xf8, + 0x27, 0xa9, 0xc4, 0xfb, 0x14, 0x7c, 0xb2, 0xf8, 0x3d, 0x39, 0x96, 0x5f, + 0xff, 0x8b, 0x05, 0x14, 0xc7, 0xd3, 0x9b, 0xa7, 0xf7, 0x96, 0x54, 0x1f, + 0xde, 0x11, 0xdc, 0x0d, 0x2c, 0xbc, 0x17, 0xd2, 0xcb, 0xff, 0x6d, 0x84, + 0xcc, 0xf7, 0x04, 0xe2, 0xcb, 0xf7, 0x03, 0x1a, 0x15, 0x65, 0xfc, 0x7f, + 0xfd, 0x2c, 0xf2, 0xca, 0xd9, 0x19, 0x7d, 0x17, 0x71, 0xcf, 0xd0, 0x37, + 0x94, 0xdf, 0x7b, 0xa0, 0x0a, 0xcb, 0xf6, 0x18, 0xfa, 0x6b, 0x2b, 0x63, + 0xc9, 0x91, 0x1d, 0xe7, 0xd0, 0xab, 0x2b, 0x0f, 0x01, 0xc8, 0xef, 0xfe, + 0xcf, 0xbd, 0xc3, 0x28, 0xfd, 0xd8, 0xb2, 0xf4, 0x99, 0xd5, 0x95, 0xb1, + 0xf0, 0xf9, 0x12, 0xff, 0xff, 0xdb, 0x99, 0xee, 0xb8, 0xe7, 0x96, 0x6f, + 0x2c, 0xe7, 0x0f, 0xef, 0x2c, 0xbf, 0xbe, 0xe6, 0x32, 0x37, 0x56, 0x5e, + 0x14, 0xda, 0x59, 0x7e, 0x68, 0xf0, 0x85, 0x59, 0x46, 0x78, 0xc0, 0x1e, + 0xac, 0x4c, 0xb4, 0xc8, 0xdd, 0xc8, 0x9d, 0xef, 0xe7, 0x0f, 0x5d, 0xbf, + 0x8b, 0x2e, 0x9d, 0x8b, 0x2f, 0xb8, 0x50, 0xc5, 0x95, 0x06, 0xe7, 0xe1, + 0x8b, 0xdd, 0x93, 0x16, 0x5d, 0xd3, 0x59, 0x58, 0x6c, 0xfc, 0x3b, 0x50, + 0xbf, 0x3d, 0x27, 0x5c, 0x43, 0x16, 0x37, 0xff, 0x88, 0x3b, 0x0c, 0x17, + 0x87, 0x59, 0x43, 0x5b, 0x91, 0xd7, 0x78, 0xe8, 0x0d, 0x3b, 0x8a, 0x97, + 0xfa, 0x26, 0x3f, 0xb8, 0x06, 0x2c, 0xb9, 0x81, 0x59, 0x5b, 0x1e, 0x60, + 0xcd, 0x6f, 0xe1, 0x88, 0x32, 0xce, 0xac, 0xbf, 0x67, 0x01, 0xad, 0x96, + 0x56, 0x1e, 0xb9, 0x17, 0x5f, 0xc1, 0x19, 0xef, 0x81, 0xac, 0xb7, 0x56, + 0x5b, 0xf5, 0x97, 0x72, 0x4b, 0x29, 0xcf, 0xa7, 0xf2, 0xfe, 0x08, 0x80, + 0x4a, 0xfe, 0xda, 0x69, 0x36, 0x75, 0xb2, 0xcb, 0xcf, 0x9a, 0x59, 0x78, + 0xb3, 0xcb, 0x2b, 0xa6, 0xd8, 0x86, 0xee, 0xf1, 0x2c, 0xbd, 0x1f, 0x71, + 0x65, 0xf1, 0x94, 0xb1, 0x65, 0xed, 0x9c, 0x96, 0x50, 0xcf, 0x65, 0x83, + 0xbe, 0x20, 0xbe, 0x81, 0xbc, 0x96, 0x5f, 0xb3, 0xdd, 0x3f, 0x2c, 0xbf, + 0x3f, 0xd9, 0xf7, 0x96, 0x57, 0x4f, 0x43, 0xc4, 0xf5, 0xb2, 0x24, 0xc5, + 0x71, 0xb6, 0xcb, 0x2d, 0xa5, 0x95, 0xb1, 0xa3, 0x31, 0x2b, 0xfb, 0x69, + 0xdb, 0x3b, 0xf5, 0x65, 0xdf, 0x79, 0x65, 0xff, 0xfe, 0xe9, 0xeb, 0x18, + 0xff, 0x4f, 0x18, 0x1f, 0x52, 0x7f, 0xd6, 0x53, 0x76, 0xab, 0x4e, 0x1b, + 0x24, 0x41, 0x8d, 0xe7, 0x0c, 0x2e, 0xa4, 0x39, 0x09, 0x18, 0x80, 0x62, + 0xff, 0xb0, 0x63, 0x3f, 0xb3, 0xef, 0x2c, 0xbe, 0x09, 0x44, 0x96, 0x57, + 0x4f, 0x6d, 0xce, 0xaf, 0xf4, 0x67, 0xa3, 0xae, 0x35, 0x95, 0xb1, 0xe9, + 0x0c, 0x86, 0xfb, 0x30, 0xbc, 0xb2, 0xff, 0xf6, 0xf3, 0x2f, 0xfa, 0x6f, + 0x2f, 0x1e, 0xcb, 0x2f, 0x80, 0xfa, 0x92, 0xca, 0x83, 0xee, 0x1a, 0x65, + 0xff, 0xc3, 0x81, 0xea, 0x3c, 0x61, 0x31, 0xac, 0xbe, 0x9a, 0x1b, 0xe4, + 0xb2, 0xfe, 0xf0, 0x46, 0x36, 0x69, 0x65, 0xff, 0x4d, 0xcd, 0xee, 0x5b, + 0x00, 0x6b, 0x2f, 0xe7, 0x6b, 0xff, 0xd9, 0xb8, 0xb2, 0xfb, 0x3d, 0x8c, + 0x59, 0x71, 0x0a, 0xb2, 0x9c, 0xdc, 0x00, 0x86, 0xa4, 0x88, 0xce, 0x36, + 0x5f, 0xdd, 0x06, 0xd3, 0x74, 0xd6, 0x5f, 0xf8, 0x1b, 0xbd, 0x39, 0xc2, + 0xeb, 0x38, 0xb2, 0xff, 0xc4, 0xe2, 0xf5, 0xe5, 0xc3, 0x1a, 0xcb, 0xf7, + 0x4c, 0x9f, 0x65, 0x96, 0x0a, 0xcb, 0xe0, 0x4b, 0x38, 0x13, 0x70, 0x44, + 0xf4, 0xc4, 0x56, 0x93, 0xb5, 0xe2, 0xcf, 0x2c, 0xb8, 0x46, 0x2c, 0xa3, + 0x3d, 0x52, 0x22, 0xf0, 0xdd, 0xdf, 0x0d, 0x65, 0x42, 0xe0, 0x96, 0xc4, + 0x72, 0x84, 0x70, 0xc8, 0x71, 0x0c, 0x52, 0x63, 0x2f, 0x9a, 0x19, 0x3d, + 0x23, 0x23, 0x0f, 0x46, 0x8e, 0x02, 0xdb, 0xfa, 0x74, 0xd1, 0xe2, 0xde, + 0xb2, 0xff, 0xe8, 0xdf, 0xa8, 0xd6, 0x1f, 0x60, 0x6b, 0x2e, 0x8c, 0x59, + 0x44, 0x7b, 0x3c, 0x44, 0xb9, 0xd8, 0xb2, 0xe9, 0xb7, 0x16, 0x51, 0x1b, + 0x1d, 0xe2, 0xd5, 0x24, 0x7f, 0xe4, 0x22, 0xcd, 0x4a, 0xd3, 0xdb, 0xb7, + 0xec, 0xab, 0x6c, 0x37, 0xb7, 0x25, 0xad, 0x91, 0xd6, 0xd5, 0x4c, 0x6e, + 0x23, 0x8d, 0xad, 0x06, 0x27, 0x0b, 0xf6, 0x8c, 0x82, 0x52, 0xac, 0xc7, + 0x3c, 0x53, 0x94, 0xb9, 0x11, 0x65, 0x25, 0x06, 0x70, 0xbf, 0xe9, 0x6d, + 0x27, 0x2a, 0x02, 0x69, 0xd2, 0x7d, 0x4b, 0x8b, 0x64, 0xa4, 0xee, 0xd2, + 0x58, 0x1e, 0x70, 0x77, 0xf9, 0x63, 0xed, 0xb8, 0x4e, 0x14, 0xfb, 0x27, + 0x29, 0x84, 0xfe, 0xa4, 0x8c, 0x82, 0x31, 0x0d, 0xef, 0x4d, 0x42, 0x27, + 0x72, 0x58, 0x78, 0x93, 0xa8, 0x8d, 0xf1, 0xdb, 0x54, 0xf7, 0xf0, 0x2f, + 0xed, 0xf6, 0xca, 0x5f, 0xfe, 0x9e, 0xc7, 0x94, 0xfc, 0xd0, 0x5d, 0xc2, + 0xa8, 0x9b, 0x17, 0xed, 0x05, 0xdc, 0x2a, 0x8a, 0xb5, 0x77, 0x37, 0x16, + 0x5a, 0x7e, 0x1e, 0x77, 0x0d, 0x2e, 0xdf, 0xa5, 0x97, 0xfa, 0x52, 0x07, + 0x8a, 0x24, 0xb2, 0xfb, 0x3a, 0xfe, 0x59, 0x66, 0xc6, 0x1e, 0xa1, 0x19, + 0xdf, 0xff, 0xfa, 0x51, 0xbe, 0x0f, 0x41, 0x36, 0x3c, 0x8c, 0xb0, 0x78, + 0x2a, 0xcb, 0xff, 0xda, 0x39, 0x64, 0xb1, 0xe4, 0x50, 0xc5, 0x97, 0xfb, + 0x58, 0x18, 0xfc, 0x46, 0x2c, 0xbf, 0xdd, 0x8d, 0xb5, 0x18, 0x35, 0x97, + 0xff, 0xe8, 0xda, 0x35, 0x0c, 0x88, 0xf7, 0x4f, 0xf6, 0x2c, 0xa8, 0x44, + 0x47, 0x4c, 0xef, 0x40, 0xe6, 0x59, 0x52, 0x4e, 0xb8, 0xda, 0xf4, 0x8f, + 0xd8, 0x5e, 0xf8, 0x8a, 0xfb, 0x4c, 0xe8, 0xd6, 0x5f, 0xfd, 0xa9, 0x16, + 0x7b, 0x90, 0xcf, 0x05, 0x65, 0x41, 0xf3, 0x80, 0x8e, 0xf0, 0xf0, 0x96, + 0x5f, 0xdc, 0x91, 0x85, 0xf4, 0xb2, 0xf3, 0xb8, 0x55, 0x15, 0xa2, 0xfc, + 0x2f, 0xdc, 0x07, 0xcb, 0x2a, 0x11, 0x02, 0x12, 0xd3, 0x28, 0xbf, 0xfc, + 0x7e, 0x94, 0x07, 0xa7, 0xee, 0x3f, 0xcb, 0x2b, 0x47, 0xf1, 0xbc, 0xba, + 0xfe, 0xfe, 0x76, 0x68, 0xc5, 0x59, 0x7f, 0xd8, 0x33, 0xe4, 0xc5, 0x03, + 0x59, 0x43, 0x3e, 0x97, 0x31, 0xbf, 0xfd, 0xd3, 0x64, 0x07, 0x19, 0x85, + 0xed, 0xc5, 0x97, 0xa5, 0xf4, 0x96, 0x5e, 0x07, 0x3c, 0xb2, 0xff, 0xfe, + 0x73, 0x6f, 0x82, 0x04, 0x8f, 0x9c, 0x89, 0xcc, 0x0a, 0xcb, 0xff, 0xe0, + 0xc6, 0xb3, 0xf7, 0x63, 0xca, 0x0c, 0x2b, 0x2f, 0xff, 0xa5, 0xcc, 0x28, + 0x63, 0xe7, 0xbd, 0x0c, 0x59, 0x6f, 0x42, 0x26, 0xdd, 0x3a, 0x98, 0x99, + 0xef, 0x47, 0x7d, 0x0f, 0x9b, 0xff, 0xff, 0xb7, 0x9f, 0xb9, 0x82, 0x87, + 0xa7, 0xec, 0x98, 0xa1, 0x9b, 0x63, 0x4b, 0x2f, 0xff, 0xcf, 0xe7, 0xce, + 0x0f, 0x25, 0xd8, 0xde, 0x38, 0x59, 0x50, 0x8c, 0xb7, 0x76, 0xbf, 0xd1, + 0xe7, 0xec, 0xe1, 0xc2, 0xcb, 0xe9, 0x78, 0xf6, 0x59, 0x7e, 0x13, 0xc5, + 0x1f, 0xac, 0xb7, 0x56, 0x57, 0xc7, 0xbb, 0xbc, 0x8c, 0x42, 0x9b, 0xff, + 0x1f, 0x30, 0x7f, 0x72, 0x35, 0xc5, 0x97, 0xf9, 0xe5, 0xe3, 0xdb, 0xa6, + 0xb2, 0xa1, 0x14, 0xa1, 0x33, 0x33, 0xfb, 0xf6, 0x74, 0xf1, 0x8b, 0x2f, + 0xc7, 0xfb, 0x0f, 0x4b, 0x2f, 0xfe, 0x27, 0x30, 0xf5, 0xc1, 0xb6, 0x8d, + 0x65, 0xff, 0xb1, 0xf6, 0x8c, 0x21, 0xf6, 0x16, 0x56, 0xc8, 0xcd, 0x19, + 0x37, 0x4a, 0x09, 0x0e, 0xff, 0x4a, 0x35, 0xb4, 0x6b, 0x65, 0x97, 0xd2, + 0xd6, 0x31, 0x65, 0xec, 0xd7, 0xeb, 0x2f, 0xd3, 0x60, 0xd9, 0xba, 0xb2, + 0xfe, 0x28, 0x6b, 0xe9, 0x71, 0x65, 0x7c, 0x89, 0xa3, 0x22, 0x98, 0x75, + 0xbc, 0xb2, 0xa1, 0x31, 0x0c, 0x86, 0x7d, 0xff, 0xff, 0xfd, 0x86, 0x1c, + 0xf4, 0x17, 0xb9, 0x3a, 0x0c, 0x78, 0xc9, 0xda, 0x83, 0x93, 0xf1, 0x65, + 0xfd, 0x9e, 0x72, 0xfc, 0x0b, 0x2f, 0xee, 0xce, 0x3d, 0x9c, 0x96, 0x5f, + 0xe8, 0x67, 0x06, 0x4e, 0xd2, 0xcb, 0xe7, 0xfd, 0xc6, 0xb2, 0xa4, 0x8b, + 0x1c, 0x2d, 0x22, 0xfe, 0x19, 0xda, 0x7b, 0x76, 0xcc, 0xbf, 0x6c, 0xb6, + 0xc4, 0x7b, 0x1b, 0x42, 0xd8, 0x64, 0x39, 0x18, 0xa0, 0xb0, 0x8d, 0x09, + 0x0f, 0xc9, 0x67, 0x1a, 0xde, 0xa3, 0x01, 0x61, 0x0f, 0x63, 0x36, 0x78, + 0x7d, 0x94, 0x69, 0xbc, 0x27, 0xf4, 0x67, 0x37, 0xed, 0x05, 0xdc, 0x2a, + 0x8b, 0x01, 0x7f, 0x98, 0x7c, 0x04, 0x6a, 0x65, 0x97, 0xc1, 0x13, 0xb3, + 0x2c, 0xa8, 0x3d, 0x97, 0x34, 0xbd, 0xf8, 0x9f, 0xac, 0xb4, 0xfc, 0x46, + 0x6f, 0x21, 0x1b, 0xe2, 0x0b, 0xf6, 0x82, 0xee, 0x15, 0x44, 0xea, 0xbf, + 0xff, 0xdd, 0x8d, 0x87, 0x8c, 0x9f, 0xce, 0x67, 0x4f, 0x80, 0xd9, 0x65, + 0xfa, 0x7b, 0x1e, 0x53, 0xf1, 0x13, 0x33, 0x1a, 0x5f, 0xff, 0xe8, 0x20, + 0x47, 0xb9, 0x85, 0x3f, 0xff, 0xe3, 0xaf, 0xb2, 0xcb, 0xc2, 0xc3, 0x16, + 0x5f, 0x38, 0x44, 0x62, 0xcb, 0xd2, 0xe4, 0xf1, 0x4f, 0x03, 0x78, 0xed, + 0xfb, 0x41, 0x77, 0x0a, 0xa2, 0xd9, 0x5f, 0xde, 0x7e, 0xce, 0x1c, 0x2c, + 0xbf, 0xff, 0xa5, 0x3f, 0x90, 0x78, 0x33, 0xce, 0x67, 0x8a, 0x16, 0x54, + 0x22, 0x21, 0xcb, 0xef, 0xd2, 0x83, 0xdf, 0x0b, 0x2f, 0xfa, 0x39, 0x3f, + 0xa6, 0x17, 0xd2, 0xca, 0x83, 0xe2, 0xfc, 0xa2, 0xff, 0xa2, 0x51, 0xad, + 0xa3, 0x5b, 0x2c, 0xb4, 0xfc, 0x4e, 0x6d, 0x90, 0xbc, 0x78, 0x41, 0x91, + 0x15, 0xff, 0x8a, 0x7b, 0x00, 0x7e, 0x27, 0x6f, 0x59, 0x7f, 0xf0, 0x39, + 0x3f, 0x34, 0xfc, 0xeb, 0xc9, 0x65, 0xcf, 0xfe, 0x22, 0x23, 0xf4, 0x2b, + 0xbe, 0x0a, 0xcb, 0xe0, 0xbb, 0x85, 0x51, 0x73, 0x2c, 0xc5, 0x95, 0xa3, + 0x7e, 0xd1, 0x75, 0xfc, 0x59, 0xf7, 0xe7, 0x25, 0x96, 0x6d, 0xac, 0xad, + 0x1e, 0x1e, 0xf2, 0xeb, 0xa6, 0x62, 0xca, 0x59, 0x69, 0xf0, 0x98, 0x1e, + 0x2b, 0x9b, 0x2b, 0x44, 0x9b, 0x83, 0x17, 0xed, 0x05, 0xdc, 0x2a, 0x8b, + 0xbd, 0x7f, 0xa5, 0x3f, 0x9a, 0xd1, 0xb4, 0xb2, 0xd3, 0xf0, 0xfa, 0xdc, + 0xd2, 0xe1, 0xfe, 0xb2, 0xf1, 0x66, 0xcb, 0x2d, 0x3c, 0x53, 0x68, 0x43, + 0x15, 0x10, 0x86, 0xff, 0xcb, 0xf0, 0x5d, 0x09, 0xc7, 0xd0, 0xa8, 0x3a, + 0x67, 0x46, 0xa3, 0xff, 0x64, 0x35, 0x7a, 0x88, 0xf0, 0xa3, 0xfe, 0x3d, + 0x42, 0x86, 0xaf, 0x23, 0x32, 0xf4, 0x2f, 0xc4, 0x5c, 0xbf, 0xf3, 0x4e, + 0x5b, 0x70, 0xcb, 0xe9, 0x2c, 0xbf, 0xfb, 0x36, 0xc6, 0xbb, 0x9c, 0xc3, + 0x25, 0x97, 0xec, 0xe8, 0xdc, 0x96, 0x5c, 0x73, 0xfa, 0x8a, 0x92, 0x40, + 0x11, 0x0e, 0xfd, 0xce, 0x31, 0xe4, 0xb2, 0xff, 0xff, 0xff, 0xdd, 0x3e, + 0x9c, 0x17, 0x89, 0xc5, 0xcf, 0x03, 0xc7, 0xee, 0x74, 0xf5, 0x1b, 0x3e, + 0x82, 0xb2, 0xee, 0x42, 0xcb, 0xff, 0xbe, 0x08, 0x1f, 0xef, 0x66, 0x10, + 0xab, 0x2f, 0x13, 0xcf, 0x84, 0xc7, 0x02, 0x51, 0xc8, 0x4c, 0x78, 0x5a, + 0xf0, 0x1d, 0x8b, 0x2f, 0xd8, 0xdf, 0xe8, 0x15, 0x65, 0x9b, 0xd6, 0x56, + 0xc6, 0xff, 0x0a, 0xeb, 0x47, 0xf8, 0x4b, 0x77, 0xfe, 0xe3, 0x8b, 0xd3, + 0x82, 0x04, 0x2c, 0xbf, 0xf7, 0x5f, 0xcf, 0xdf, 0xa5, 0x9e, 0x59, 0x58, + 0x7f, 0x86, 0x7b, 0x73, 0xfe, 0xb2, 0xff, 0xff, 0xf1, 0x3b, 0x45, 0x9e, + 0xf6, 0x6d, 0x04, 0xe2, 0xf1, 0x91, 0x84, 0x35, 0x97, 0xb0, 0x4e, 0x2c, + 0xac, 0x45, 0x4e, 0x85, 0xdb, 0xdd, 0x6f, 0xf7, 0x70, 0x67, 0xbf, 0x58, + 0xb2, 0xff, 0x3c, 0xb5, 0x9b, 0x87, 0xfa, 0xcb, 0xce, 0xe1, 0x54, 0x4a, + 0xeb, 0xfc, 0x2b, 0x97, 0xfe, 0xce, 0xac, 0xa0, 0x9e, 0xe1, 0x94, 0x5f, + 0xef, 0x89, 0xc5, 0x7f, 0x49, 0x65, 0xff, 0xdd, 0xc9, 0x07, 0xa6, 0x38, + 0x2f, 0x2c, 0xa3, 0x3f, 0x7f, 0x1a, 0x54, 0x93, 0x7f, 0x19, 0xa6, 0xa1, + 0x24, 0x50, 0x98, 0xbf, 0xd1, 0xa7, 0x93, 0xfd, 0x25, 0x97, 0xff, 0xff, + 0xda, 0x72, 0x12, 0x3f, 0xc9, 0x76, 0x37, 0x8e, 0x27, 0xe1, 0x02, 0x59, + 0xc5, 0x96, 0xd9, 0x65, 0xb6, 0x59, 0x50, 0x69, 0x24, 0x25, 0x7e, 0xc0, + 0xbc, 0xb1, 0x65, 0xff, 0xfe, 0x7f, 0xb9, 0x9a, 0xf7, 0x9f, 0x61, 0x18, + 0x3e, 0x98, 0xab, 0x2f, 0xfb, 0x0f, 0x79, 0x46, 0x6a, 0x4b, 0x2f, 0xff, + 0xde, 0x96, 0x6e, 0xb9, 0x7f, 0xf7, 0xb5, 0x18, 0xd2, 0xc6, 0x8d, 0xc5, + 0xfb, 0xef, 0x76, 0x3f, 0x59, 0x4e, 0x89, 0x50, 0x35, 0xdf, 0xfe, 0x98, + 0xa3, 0xdc, 0xf7, 0xc1, 0x32, 0xd9, 0x65, 0xff, 0x3b, 0x43, 0xec, 0x6d, + 0x8d, 0x2c, 0xa3, 0x44, 0x39, 0x26, 0x5f, 0xff, 0xb0, 0xff, 0xc6, 0x1f, + 0xb9, 0x0c, 0x7f, 0xbc, 0xb2, 0xff, 0xff, 0x05, 0xf4, 0xfd, 0xfa, 0x59, + 0xec, 0xf4, 0x01, 0xb7, 0x8b, 0x2f, 0xfe, 0x7f, 0xa4, 0x7e, 0xec, 0x6b, + 0xd0, 0xb2, 0xff, 0xa1, 0x9e, 0xc9, 0xa4, 0x7e, 0x59, 0x52, 0x4c, 0xd8, + 0xd5, 0x58, 0xc9, 0xe4, 0x4b, 0xff, 0xfd, 0xd3, 0x18, 0xf1, 0xaf, 0xbc, + 0x07, 0xe7, 0x5a, 0x71, 0xac, 0xbe, 0x03, 0xea, 0x4b, 0x2f, 0xe2, 0x8d, + 0xbf, 0x7f, 0x2c, 0xbf, 0xce, 0x31, 0x1b, 0xe0, 0xa4, 0xb2, 0xd0, 0x13, + 0xe4, 0x61, 0x75, 0xff, 0xfe, 0x3f, 0x3b, 0x1c, 0xbf, 0xeb, 0x4e, 0x5b, + 0x04, 0xf6, 0x59, 0x43, 0x4c, 0x3c, 0xe1, 0x0c, 0xe4, 0xf7, 0xfc, 0x0f, + 0xd8, 0xf2, 0xe6, 0x86, 0xb2, 0xff, 0xff, 0x61, 0x97, 0xb0, 0xa7, 0x13, + 0x8e, 0x0b, 0x68, 0xd2, 0xcb, 0x67, 0x91, 0x33, 0xbc, 0xee, 0xff, 0xff, + 0xf7, 0x71, 0x9f, 0xbe, 0xb3, 0x7e, 0x0f, 0x38, 0x07, 0xfb, 0xad, 0x3f, + 0x96, 0x5f, 0xf4, 0xc1, 0xe9, 0xb2, 0x34, 0x2a, 0xcb, 0xfd, 0xfe, 0x6b, + 0x33, 0xdc, 0x59, 0x58, 0x7d, 0xdf, 0x1d, 0xd0, 0xd7, 0x42, 0x72, 0x35, + 0x70, 0x9e, 0xf6, 0x37, 0x32, 0x86, 0x6f, 0x8a, 0x84, 0x87, 0x4d, 0xff, + 0xb3, 0xbd, 0x79, 0x7f, 0xac, 0xf9, 0x65, 0xff, 0x67, 0xdc, 0x1c, 0x39, + 0x6c, 0xb2, 0xff, 0x9e, 0x5c, 0xec, 0x68, 0x41, 0xac, 0xa9, 0x22, 0xcf, + 0x10, 0x3c, 0x73, 0x7f, 0xf7, 0x8f, 0x79, 0xfa, 0x69, 0x41, 0x79, 0x65, + 0xff, 0xe7, 0xc9, 0x77, 0x0c, 0xb3, 0xfd, 0xcc, 0x59, 0x79, 0xe5, 0x3e, + 0x19, 0xa9, 0xb2, 0x84, 0xe8, 0xe1, 0x93, 0x91, 0xd8, 0xfc, 0x8f, 0xa3, + 0x36, 0x42, 0x93, 0xa4, 0x1f, 0x93, 0x14, 0x66, 0x5c, 0x9d, 0xb2, 0xf4, + 0x65, 0xe2, 0x17, 0xb7, 0xa3, 0x5c, 0xdb, 0xc5, 0x97, 0xef, 0x40, 0x1b, + 0x78, 0xb2, 0xfd, 0x81, 0x79, 0x62, 0xcb, 0xfd, 0x83, 0x32, 0xf6, 0x75, + 0x65, 0xec, 0xec, 0xf6, 0xd1, 0x13, 0x98, 0x35, 0xd2, 0xb2, 0x26, 0xbd, + 0xe8, 0x1a, 0x4b, 0xff, 0xdd, 0x73, 0xf4, 0x48, 0xf5, 0xb0, 0x3f, 0x49, + 0x7f, 0x9c, 0x33, 0xc7, 0xa6, 0xdc, 0xf8, 0x3e, 0x7e, 0x0e, 0x5a, 0x78, + 0xdb, 0x22, 0x00, 0xc6, 0xb2, 0xca, 0x70, 0xef, 0xa3, 0x9e, 0xdf, 0x0b, + 0xab, 0xff, 0xd3, 0xd8, 0xf2, 0x9f, 0x9a, 0x0b, 0xb8, 0x55, 0x13, 0x0a, + 0xff, 0xfe, 0xcd, 0xee, 0x3e, 0xc4, 0xff, 0x77, 0x06, 0x0f, 0x71, 0x65, + 0xff, 0xed, 0x3f, 0xf3, 0xc5, 0xf4, 0x9a, 0x8e, 0x49, 0x65, 0xd9, 0x3c, + 0x91, 0x5e, 0x22, 0xfd, 0xcc, 0xde, 0xb2, 0xff, 0xe6, 0xc6, 0x7d, 0x20, + 0x3f, 0x8a, 0x24, 0xb2, 0xfc, 0xdc, 0xb7, 0x2d, 0xd6, 0xe3, 0x76, 0xb2, + 0xfd, 0x8c, 0x9d, 0xf6, 0xea, 0xcb, 0xfa, 0x19, 0x9f, 0xc6, 0xf5, 0x94, + 0x33, 0xdd, 0xe9, 0x75, 0xfe, 0xd6, 0x06, 0x3f, 0x11, 0x8b, 0x2f, 0xde, + 0x7d, 0x9f, 0x8b, 0x2f, 0xa1, 0x87, 0xa5, 0x96, 0x89, 0x8f, 0x27, 0x45, + 0x17, 0xd0, 0x47, 0x32, 0xcb, 0xf7, 0x60, 0x66, 0x2a, 0xca, 0x34, 0xc4, + 0x74, 0x44, 0xc7, 0xe2, 0x28, 0x6f, 0x21, 0xbd, 0xbd, 0xf8, 0xb2, 0xff, + 0x8d, 0xa2, 0xcf, 0xbd, 0x9d, 0x59, 0x7f, 0xa1, 0xf6, 0xf0, 0xaf, 0xa5, + 0x97, 0xe7, 0xd4, 0x9d, 0x8b, 0x2b, 0x11, 0x65, 0xd1, 0xe2, 0x39, 0x01, + 0xa5, 0xdb, 0x8d, 0xda, 0xcb, 0xfd, 0xc8, 0xc2, 0x1f, 0x61, 0x65, 0xfd, + 0x18, 0x43, 0xec, 0x2c, 0xbc, 0x0d, 0x4d, 0x38, 0xf7, 0x38, 0x63, 0x7f, + 0xfb, 0x46, 0x0c, 0x17, 0x3c, 0x08, 0xf8, 0x6b, 0x2f, 0xff, 0xc7, 0xae, + 0xbc, 0xe1, 0xe4, 0xbb, 0x1b, 0xc7, 0x0b, 0x2f, 0xf9, 0xa1, 0x3b, 0x01, + 0xe9, 0xcc, 0xb2, 0xf8, 0x0c, 0xc1, 0xac, 0xb6, 0x7c, 0x7b, 0xcd, 0xe7, + 0x97, 0xed, 0x44, 0xb9, 0x8b, 0x2f, 0x8f, 0xd9, 0xbd, 0x65, 0x41, 0xe5, + 0x74, 0x9e, 0xb1, 0x52, 0x48, 0x5e, 0xf4, 0x6f, 0xd4, 0xb2, 0x85, 0xb7, + 0x9d, 0x6f, 0xff, 0x40, 0x78, 0x0f, 0x1f, 0x4c, 0x5e, 0x9a, 0xcb, 0xf9, + 0x91, 0x85, 0xed, 0xc5, 0x96, 0xe2, 0xcb, 0xf4, 0x61, 0x7b, 0x71, 0x65, + 0xee, 0x3f, 0xd3, 0x8f, 0xa6, 0x62, 0xf6, 0x08, 0xd3, 0x11, 0xef, 0xe8, + 0x59, 0xdf, 0xf6, 0xee, 0x0f, 0xb1, 0xba, 0x50, 0xb2, 0x8c, 0xf9, 0x5c, + 0xa2, 0xff, 0xb5, 0xb0, 0x7a, 0x7d, 0x07, 0x96, 0x57, 0x4f, 0x6d, 0xc8, + 0x2f, 0xef, 0x43, 0x37, 0xff, 0x25, 0x97, 0x78, 0xd6, 0x5c, 0x0c, 0x59, + 0x52, 0x3d, 0xd1, 0x4c, 0x7f, 0x16, 0xbf, 0xb5, 0x87, 0xd8, 0x1a, 0xcb, + 0xda, 0x07, 0x16, 0x5f, 0xff, 0x76, 0x0b, 0x3d, 0xdc, 0xf7, 0x60, 0x0d, + 0xb5, 0x97, 0xbb, 0x9f, 0x2c, 0xbf, 0xff, 0xcd, 0x37, 0xfb, 0x3b, 0x38, + 0xb3, 0x63, 0xc2, 0xfa, 0x5c, 0x59, 0x7e, 0x6b, 0xd9, 0xd0, 0xac, 0xac, + 0x44, 0x83, 0xb3, 0xd0, 0xd3, 0x69, 0xc2, 0xc3, 0x1d, 0x75, 0x22, 0x85, + 0x6d, 0xff, 0xef, 0x13, 0xff, 0xdc, 0x31, 0x83, 0xdc, 0x59, 0x7d, 0xbf, + 0x07, 0x0b, 0x2f, 0xfa, 0x36, 0x12, 0x5d, 0x03, 0xec, 0xb2, 0xa1, 0x15, + 0x38, 0x95, 0xa2, 0x3b, 0xff, 0x7d, 0x29, 0xdd, 0x70, 0xc1, 0x0d, 0x65, + 0xf0, 0x35, 0xfb, 0x16, 0x56, 0x1f, 0x2f, 0x10, 0x6f, 0x8e, 0x3e, 0xe2, + 0xcb, 0xf0, 0x9e, 0x28, 0xfd, 0x65, 0x78, 0xf2, 0xf7, 0x91, 0x5f, 0x7b, + 0xd8, 0xd2, 0xcb, 0xff, 0xd1, 0xef, 0xe2, 0x59, 0xf7, 0xb6, 0x03, 0x4b, + 0x2f, 0x71, 0xff, 0x59, 0x50, 0x8b, 0x2c, 0x24, 0x32, 0x3f, 0x27, 0x5c, + 0xf2, 0x59, 0x7f, 0xf8, 0xf9, 0x12, 0x9d, 0x9d, 0x3d, 0x75, 0xd6, 0x56, + 0xe9, 0xf0, 0x74, 0x5a, 0xfd, 0x37, 0x06, 0x0d, 0x96, 0x5f, 0xcf, 0xfe, + 0xb4, 0x7a, 0x59, 0x7b, 0xd3, 0xb1, 0x65, 0x41, 0xfb, 0xfe, 0x56, 0x21, + 0x75, 0xf7, 0x41, 0xf7, 0x96, 0x5f, 0xfb, 0xa7, 0xe3, 0xc6, 0x16, 0x6c, + 0xb2, 0xfe, 0xe1, 0x8a, 0xc7, 0xf2, 0xcb, 0xff, 0x6f, 0x81, 0x64, 0x65, + 0x1a, 0x85, 0x97, 0xff, 0xfe, 0xd6, 0x6f, 0x82, 0xf4, 0xe1, 0x0a, 0x3a, + 0xe7, 0xe8, 0xf7, 0x16, 0x5c, 0x16, 0xca, 0xcb, 0xdb, 0x02, 0x4b, 0x2f, + 0x16, 0x72, 0x71, 0xb9, 0xc1, 0xba, 0x0a, 0x70, 0x7f, 0x1e, 0x99, 0x76, + 0x8f, 0xf7, 0xc2, 0x9e, 0xfa, 0x76, 0xf6, 0xfd, 0x96, 0x50, 0xd5, 0x12, + 0x64, 0x74, 0xe2, 0xa9, 0x5b, 0x75, 0x65, 0xb7, 0x56, 0x5e, 0xc1, 0xf9, + 0x65, 0x98, 0x66, 0xc3, 0x42, 0x97, 0x7b, 0x16, 0x5f, 0xe8, 0x28, 0xfd, + 0xdd, 0xbd, 0x65, 0xed, 0x3c, 0x96, 0x5f, 0xe1, 0xf7, 0x03, 0xd8, 0xd2, + 0xca, 0x1a, 0x20, 0xf4, 0x68, 0x43, 0x97, 0xee, 0x67, 0xb5, 0x0b, 0x2f, + 0xff, 0x36, 0xca, 0x18, 0xe7, 0xd7, 0xf7, 0x61, 0x65, 0x42, 0x67, 0x47, + 0x09, 0x9e, 0x17, 0x80, 0x9e, 0xe7, 0x0a, 0xcb, 0xf8, 0xe6, 0x70, 0xf2, + 0x4b, 0x28, 0x27, 0x89, 0xd1, 0x6b, 0xff, 0xfd, 0xd3, 0x21, 0xeb, 0x03, + 0xd8, 0xee, 0x6b, 0x50, 0x2a, 0xcb, 0xf0, 0x1b, 0xcf, 0x18, 0xb2, 0xfd, + 0xe7, 0x61, 0xf9, 0x65, 0x0a, 0x7a, 0x24, 0x55, 0x7f, 0xe3, 0xf0, 0x34, + 0xfc, 0x9c, 0xcf, 0x2c, 0xa8, 0x3e, 0x37, 0x22, 0xbf, 0xec, 0x3c, 0x61, + 0x66, 0xce, 0xb2, 0xfd, 0x1e, 0xe7, 0xe0, 0x59, 0x4d, 0xda, 0xbd, 0xe8, + 0x44, 0xc8, 0xd8, 0x03, 0x08, 0x59, 0x88, 0xbb, 0x18, 0xa1, 0x10, 0x78, + 0xda, 0xff, 0xf9, 0xd8, 0x3e, 0xc7, 0x61, 0x80, 0xfa, 0x5c, 0x59, 0x7f, + 0xfb, 0x3d, 0xd3, 0xcf, 0xbd, 0x9b, 0xe3, 0x8b, 0x2d, 0xde, 0xa2, 0x70, + 0x94, 0x6f, 0x9f, 0x9e, 0xd9, 0x65, 0xff, 0xce, 0x5d, 0x83, 0x19, 0xf3, + 0x24, 0xb2, 0xf4, 0x7e, 0x22, 0xcb, 0xfb, 0x37, 0xf4, 0xff, 0x99, 0x65, + 0x62, 0x36, 0xc5, 0x28, 0x72, 0x32, 0x41, 0xe0, 0xf5, 0xc5, 0x0b, 0x2f, + 0xbb, 0x1c, 0x85, 0x97, 0x84, 0x1e, 0x2c, 0xbc, 0xdb, 0xe3, 0x65, 0x65, + 0x6c, 0x7f, 0x03, 0x15, 0x72, 0x1e, 0x0e, 0xdf, 0x4e, 0x64, 0xe0, 0xac, + 0xbd, 0x81, 0x1a, 0xcb, 0xef, 0x61, 0x7e, 0xb2, 0xfe, 0x76, 0xa3, 0xd9, + 0xb2, 0xca, 0xc3, 0xec, 0x31, 0xc2, 0x22, 0xbf, 0x8f, 0xdf, 0x88, 0x52, + 0x59, 0x7c, 0xd4, 0xdc, 0x85, 0x97, 0xfe, 0x7f, 0x70, 0x7a, 0x7f, 0x74, + 0x0b, 0x28, 0x54, 0x49, 0x7c, 0x5e, 0x44, 0x96, 0x9e, 0xdd, 0xb7, 0x0f, + 0xcd, 0x91, 0x96, 0xd6, 0x91, 0x11, 0xd7, 0x0e, 0x1f, 0xd9, 0x2a, 0x10, + 0x32, 0x84, 0xfe, 0x7e, 0x9a, 0x39, 0xad, 0x43, 0xd5, 0x90, 0x93, 0xec, + 0x63, 0xcf, 0x09, 0xaf, 0xe1, 0x38, 0x52, 0x95, 0x39, 0x38, 0x2d, 0xe8, + 0xff, 0x81, 0x0c, 0x06, 0x8f, 0x37, 0x21, 0x26, 0x24, 0x2f, 0xaf, 0xff, + 0xb4, 0x7f, 0x4b, 0x87, 0xee, 0xc6, 0xbd, 0x0b, 0x2f, 0xf4, 0x69, 0xe6, + 0x7e, 0x49, 0x65, 0xe7, 0x70, 0xaa, 0x2a, 0xe5, 0xfc, 0xe2, 0x77, 0xae, + 0xc5, 0x94, 0x13, 0xd6, 0xe9, 0x45, 0xfc, 0x7a, 0xeb, 0x88, 0xc5, 0x94, + 0x34, 0x6c, 0xea, 0x11, 0x3d, 0x22, 0xbe, 0x26, 0xfe, 0x3a, 0xcb, 0xda, + 0x86, 0x2c, 0xbf, 0xd1, 0xaf, 0x41, 0x47, 0xeb, 0x2f, 0xf4, 0xfc, 0xd0, + 0x5d, 0xc2, 0xa8, 0x8f, 0x17, 0xee, 0x9e, 0xba, 0xeb, 0x2f, 0x17, 0x9d, + 0x65, 0xd8, 0x3c, 0x3c, 0x2e, 0x13, 0xd4, 0x91, 0x5e, 0xc8, 0x41, 0xdf, + 0xe9, 0x46, 0xb6, 0x8d, 0x6c, 0xb2, 0xff, 0x6e, 0x3f, 0x60, 0xa3, 0xf5, + 0x95, 0x07, 0xd5, 0x86, 0xb7, 0xfd, 0xe3, 0x03, 0x6f, 0x25, 0xb4, 0xcb, + 0x2f, 0xe2, 0xcf, 0x73, 0x1a, 0x59, 0x50, 0x7d, 0x8e, 0x7f, 0x7f, 0x82, + 0x7c, 0xe9, 0xf8, 0xd6, 0x5f, 0xb3, 0x67, 0x2f, 0x96, 0x57, 0xc7, 0xb4, + 0x46, 0x57, 0xef, 0x7b, 0x0b, 0xf5, 0x97, 0xf9, 0xbd, 0xc7, 0x18, 0x33, + 0x59, 0x69, 0xe3, 0x5c, 0x95, 0xc8, 0xca, 0x4c, 0xd7, 0x44, 0x9d, 0x1c, + 0x78, 0x70, 0x94, 0x24, 0xb9, 0x08, 0xcf, 0x3d, 0x08, 0x44, 0xde, 0x51, + 0x7e, 0xd0, 0x5d, 0xc2, 0xa8, 0xb0, 0x57, 0x85, 0x8d, 0x96, 0x5f, 0xff, + 0xc4, 0x07, 0xd9, 0x99, 0xb8, 0x0d, 0x66, 0xa4, 0x24, 0x96, 0x5f, 0xb0, + 0xb3, 0xdc, 0x59, 0x7f, 0xb4, 0xec, 0x13, 0x4f, 0xf2, 0xcb, 0x4f, 0xc4, + 0xc3, 0x45, 0x34, 0x08, 0xf3, 0xb0, 0x08, 0x4d, 0x7f, 0xa7, 0xe6, 0x82, + 0xee, 0x15, 0x45, 0x94, 0xbf, 0xf6, 0x7a, 0x59, 0xfe, 0xe6, 0x74, 0x0b, + 0x2f, 0xda, 0x0b, 0xb8, 0x55, 0x16, 0x9a, 0xff, 0x9c, 0x7d, 0x79, 0xba, + 0x6c, 0x59, 0x7f, 0xa1, 0x98, 0x32, 0x8f, 0x96, 0x5a, 0x78, 0xd1, 0xc3, + 0x88, 0x4c, 0x34, 0xe9, 0xcd, 0xf9, 0xb5, 0x5b, 0x8b, 0x76, 0xdd, 0xb7, + 0x2b, 0x2f, 0xf9, 0xb3, 0xd3, 0x68, 0x6e, 0xe1, 0x59, 0x7e, 0x6d, 0x56, + 0xc7, 0x32, 0x16, 0x5f, 0xe1, 0x19, 0x9e, 0xe1, 0xf1, 0x65, 0x8d, 0x65, + 0x36, 0x4f, 0x13, 0x70, 0xd2, 0xff, 0x46, 0xda, 0x71, 0xec, 0xeb, 0x2f, + 0xff, 0xdd, 0x72, 0xf4, 0xb3, 0x59, 0x04, 0x59, 0xe5, 0x95, 0x24, 0x42, + 0x99, 0xa5, 0xfb, 0x7b, 0x8f, 0x18, 0xb2, 0xf9, 0x91, 0xf7, 0x16, 0x5f, + 0xe3, 0x61, 0xb7, 0xc1, 0x1a, 0xcb, 0xff, 0x8f, 0x1f, 0xf8, 0x96, 0xa3, + 0x09, 0x65, 0xf1, 0xef, 0xee, 0xf5, 0x97, 0xf9, 0xbc, 0xff, 0x9c, 0xfd, + 0x02, 0xca, 0x92, 0x68, 0x38, 0x45, 0x31, 0x4f, 0x48, 0xc8, 0xcf, 0x88, + 0x2d, 0xe4, 0xd7, 0xf9, 0x82, 0x33, 0xf6, 0x1f, 0xeb, 0x2f, 0xd3, 0xb5, + 0xa0, 0x75, 0x65, 0xf8, 0xc5, 0x82, 0x0a, 0xca, 0xe1, 0xe9, 0x78, 0xae, + 0xa1, 0x15, 0x79, 0x08, 0x9b, 0xff, 0xe2, 0x0f, 0x4f, 0xa7, 0xa8, 0x99, + 0xac, 0xea, 0xcb, 0xff, 0x70, 0xe7, 0x75, 0xf5, 0x1b, 0xe1, 0x65, 0xff, + 0x31, 0xe5, 0xb8, 0x0e, 0x9e, 0x96, 0x56, 0x8f, 0xf5, 0x88, 0x37, 0xe7, + 0xe7, 0xa0, 0x6b, 0x2a, 0x0f, 0x24, 0x04, 0x57, 0xf9, 0xf5, 0x27, 0xf3, + 0x85, 0x65, 0x42, 0x6d, 0x3d, 0x8c, 0x58, 0x04, 0x37, 0xd0, 0x24, 0x75, + 0x65, 0xf0, 0x5d, 0xc2, 0xa8, 0xb7, 0x17, 0xd3, 0x40, 0xf1, 0x65, 0xff, + 0xb3, 0x58, 0x53, 0xbb, 0x9f, 0x34, 0xb2, 0xfc, 0x5f, 0xbf, 0xdc, 0x59, + 0x50, 0x7d, 0x4e, 0x83, 0x5f, 0x23, 0xf3, 0x44, 0x4e, 0x5d, 0xc8, 0x46, + 0x5f, 0x6f, 0x80, 0x92, 0xcb, 0xf8, 0xbf, 0x98, 0xa1, 0x8b, 0x29, 0x87, + 0xa2, 0xe4, 0x77, 0x98, 0x46, 0xb2, 0xc4, 0xb2, 0xff, 0xba, 0x07, 0xe6, + 0x61, 0x0a, 0xb2, 0xfd, 0xc7, 0xf9, 0xc6, 0xb2, 0xc6, 0x33, 0xe0, 0xf1, + 0xc5, 0x42, 0x2c, 0xb0, 0x6f, 0xae, 0x17, 0xfd, 0x0e, 0x5d, 0xcc, 0x20, + 0xac, 0xbf, 0xde, 0xf1, 0xec, 0xc8, 0x25, 0x95, 0x23, 0xe8, 0xc3, 0x5b, + 0xfe, 0x82, 0x03, 0x23, 0x9e, 0x35, 0x97, 0xfd, 0x23, 0xdf, 0x9d, 0x72, + 0xd9, 0x65, 0xe8, 0xcd, 0x2c, 0xbf, 0xdd, 0x89, 0x1e, 0xe6, 0x31, 0x65, + 0x0c, 0xf4, 0x38, 0x37, 0x7e, 0x9d, 0xf7, 0x0c, 0x55, 0x95, 0xb1, 0xe7, + 0x7c, 0x45, 0x5f, 0x23, 0xf1, 0xe1, 0xb1, 0x7f, 0xf4, 0xb3, 0xa7, 0xa1, + 0xf6, 0x08, 0x2b, 0x2f, 0xf7, 0xd2, 0x82, 0xf6, 0x7e, 0xb2, 0xfb, 0x9f, + 0x9f, 0x96, 0x53, 0xa3, 0x0b, 0x85, 0x00, 0x43, 0x10, 0xd2, 0xfc, 0xfa, + 0xf6, 0x75, 0x65, 0xff, 0x8f, 0xf8, 0x90, 0xfb, 0x04, 0x15, 0x95, 0x23, + 0xe5, 0xf1, 0x3d, 0xfd, 0xe9, 0x66, 0xb3, 0x8b, 0x29, 0x65, 0xe0, 0x3f, + 0x96, 0x5c, 0x08, 0x59, 0x52, 0x36, 0x5e, 0x1c, 0xa5, 0x97, 0xdf, 0x04, + 0xf4, 0xb2, 0xe6, 0x4f, 0xc4, 0x46, 0x7c, 0x7a, 0xc2, 0x1f, 0x05, 0xdf, + 0x60, 0xc8, 0x6b, 0x2a, 0x0f, 0xb3, 0x7a, 0x5d, 0xff, 0x17, 0xba, 0xf2, + 0x03, 0x88, 0xb2, 0xa1, 0x3a, 0x3c, 0x22, 0x38, 0xc9, 0x5c, 0x8e, 0xf1, + 0x7b, 0x71, 0x65, 0xe9, 0xcd, 0xcb, 0x72, 0xb2, 0xff, 0xa5, 0x3f, 0x34, + 0x17, 0x70, 0xaa, 0x28, 0x75, 0x1a, 0x23, 0xe6, 0x1f, 0x72, 0x9b, 0xf7, + 0xf0, 0x1c, 0x62, 0xcb, 0xe8, 0x9b, 0x06, 0xb2, 0xb4, 0x79, 0x5c, 0x28, + 0xbf, 0xb9, 0xc7, 0xee, 0x05, 0x65, 0xff, 0x64, 0x0f, 0xb0, 0xdf, 0x13, + 0x2c, 0xbf, 0xdf, 0x9f, 0x7b, 0x9f, 0xba, 0xca, 0x61, 0xf7, 0xfe, 0x77, + 0x7f, 0xe2, 0x6f, 0x72, 0x76, 0x0f, 0x06, 0xb2, 0xa1, 0x32, 0x0c, 0x22, + 0x78, 0x4e, 0x37, 0x91, 0xdf, 0xf9, 0xc7, 0x03, 0xe9, 0x91, 0xb1, 0x65, + 0xff, 0xb7, 0xbe, 0xb8, 0xfd, 0xe4, 0x6c, 0xb2, 0xff, 0x70, 0x01, 0xcf, + 0x14, 0x2c, 0xa6, 0x22, 0xbf, 0xa7, 0x9e, 0x41, 0xbf, 0xf8, 0x12, 0xeb, + 0xeb, 0xef, 0x41, 0xec, 0xb2, 0xff, 0x4a, 0x35, 0xb4, 0x6b, 0x65, 0x97, + 0xe7, 0xe6, 0xfc, 0xe2, 0xca, 0x83, 0xde, 0xfc, 0xd6, 0xfd, 0x3b, 0xb9, + 0xfb, 0xac, 0xbf, 0xa4, 0xfa, 0xcf, 0xbc, 0xb2, 0xfe, 0x1b, 0xb3, 0xa6, + 0xd2, 0xca, 0x83, 0xdc, 0xc2, 0xeb, 0xfe, 0xcf, 0x70, 0x4e, 0x69, 0xf8, + 0xb2, 0xfc, 0x7e, 0xe3, 0x9a, 0xcb, 0xfe, 0xd7, 0xfa, 0x72, 0xf6, 0x7e, + 0xb2, 0xb6, 0x4d, 0x03, 0x50, 0x86, 0x61, 0x07, 0xe7, 0x40, 0x26, 0xbc, + 0x26, 0xa4, 0xb2, 0xfe, 0x13, 0xc0, 0x8c, 0xd9, 0x65, 0xfd, 0xff, 0x5c, + 0xfa, 0x05, 0x95, 0x23, 0xfb, 0x98, 0x7b, 0x45, 0xf7, 0xff, 0x04, 0xa3, + 0xc5, 0x9b, 0xf3, 0x52, 0x59, 0x7e, 0x7e, 0x73, 0x6e, 0x2c, 0xbd, 0xc6, + 0x3a, 0xcb, 0xfc, 0x42, 0x89, 0xde, 0x83, 0x8b, 0x2a, 0x63, 0xd2, 0x00, + 0xe5, 0xff, 0xc0, 0xe7, 0x5e, 0x50, 0x43, 0xce, 0xac, 0xbf, 0xe1, 0x23, + 0xf9, 0xa5, 0x1a, 0xd9, 0x65, 0xfc, 0x4f, 0xe1, 0x20, 0x2b, 0x29, 0x87, + 0xd4, 0x47, 0xb7, 0xc5, 0xfe, 0xdf, 0xac, 0xbf, 0xff, 0xd3, 0x70, 0xc7, + 0x3a, 0x63, 0x2d, 0xef, 0x33, 0xf8, 0x10, 0xb2, 0xb1, 0x15, 0x86, 0x42, + 0xe4, 0xb7, 0xfb, 0x93, 0xbd, 0x38, 0x78, 0x4b, 0x2d, 0xfa, 0xcb, 0x1f, + 0xc7, 0x93, 0xa3, 0x7b, 0xf3, 0xfd, 0xcf, 0x1a, 0xca, 0x85, 0x66, 0x38, + 0x60, 0x2a, 0x21, 0xbd, 0xe8, 0x8f, 0xb1, 0xac, 0x93, 0xb7, 0x0a, 0x2f, + 0xce, 0x01, 0x60, 0x45, 0x97, 0xe6, 0xce, 0x6a, 0x38, 0xb2, 0xa6, 0x3d, + 0x42, 0x29, 0xbf, 0xb3, 0xc6, 0x3c, 0x62, 0xcb, 0xe2, 0x91, 0xb1, 0x65, + 0xa7, 0x4c, 0x79, 0xae, 0x59, 0x7f, 0xb9, 0x13, 0x7d, 0x2c, 0xde, 0xb2, + 0x86, 0x7c, 0x2e, 0x55, 0x7f, 0xfe, 0x1f, 0x60, 0x49, 0xfe, 0x27, 0xff, + 0x9c, 0x8f, 0xd2, 0x5c, 0x3c, 0x59, 0x7e, 0xda, 0x36, 0x7e, 0x2c, 0xac, + 0x44, 0xc9, 0xad, 0x38, 0xb5, 0xdf, 0x81, 0x65, 0xff, 0xb9, 0xbd, 0xe6, + 0xd9, 0xc9, 0xe6, 0x59, 0x7f, 0x3f, 0xf3, 0x14, 0x0d, 0x65, 0xff, 0x16, + 0x6c, 0x3e, 0xe1, 0x79, 0x65, 0x42, 0x30, 0x26, 0x18, 0xea, 0x11, 0x17, + 0x53, 0x74, 0xdd, 0x0e, 0x37, 0x28, 0xad, 0xc4, 0xf5, 0xb4, 0x76, 0x88, + 0xfb, 0xe5, 0x18, 0x90, 0xe3, 0x8f, 0xc8, 0xcc, 0x85, 0x84, 0x98, 0x61, + 0xa7, 0xf4, 0x25, 0x8c, 0x86, 0x68, 0xfd, 0x75, 0x29, 0x15, 0x90, 0xcf, + 0xec, 0x73, 0x2f, 0x0f, 0x2f, 0xcc, 0x0a, 0x14, 0x9c, 0x8d, 0x8b, 0xd2, + 0xff, 0x81, 0x0c, 0xad, 0xf0, 0xd0, 0xdc, 0x85, 0xd0, 0x90, 0xed, 0xbf, + 0xff, 0x06, 0x7f, 0xfa, 0xcf, 0x83, 0xd3, 0xf7, 0x1f, 0xe5, 0x95, 0x3d, + 0x51, 0x90, 0x23, 0xd7, 0xbe, 0x8d, 0x49, 0x8b, 0x2f, 0xbe, 0xe3, 0xee, + 0xac, 0xbc, 0xfa, 0x15, 0x65, 0xa7, 0xec, 0x7c, 0xa6, 0x44, 0xd1, 0x35, + 0xfe, 0x9f, 0x9a, 0x0b, 0xb8, 0x55, 0x17, 0x9a, 0xa1, 0xf0, 0x4b, 0x64, + 0xe6, 0x38, 0xc2, 0x72, 0xb8, 0xae, 0xfa, 0x78, 0xb3, 0x51, 0xe2, 0xb1, + 0x4f, 0xb1, 0x91, 0x15, 0x79, 0x25, 0xc8, 0x49, 0x6f, 0x38, 0xbf, 0xd3, + 0xf3, 0x41, 0x77, 0x0a, 0xa2, 0x96, 0x5c, 0xdd, 0xb6, 0x8b, 0x2f, 0xc7, + 0x3f, 0x98, 0x6b, 0x2f, 0xda, 0x0b, 0xb8, 0x55, 0x16, 0x12, 0xff, 0xfb, + 0x08, 0x71, 0xd8, 0xfb, 0xd8, 0x4e, 0xc5, 0x97, 0x88, 0x01, 0x59, 0x50, + 0x7d, 0x2e, 0x9b, 0x6e, 0x2c, 0xbf, 0x81, 0xa3, 0xd9, 0xd8, 0xb2, 0xd3, + 0xdb, 0x44, 0xd1, 0x46, 0x43, 0x85, 0x0c, 0x84, 0xef, 0x08, 0x37, 0x04, + 0x6f, 0xf4, 0xfc, 0xd0, 0x5d, 0xc2, 0xa8, 0xb2, 0xd6, 0x92, 0xcb, 0xb4, + 0x2a, 0xcb, 0xe9, 0xe2, 0xb6, 0x8d, 0xd2, 0xca, 0x49, 0x7a, 0x78, 0x8c, + 0x59, 0x41, 0x3d, 0xbe, 0x18, 0x00, 0x2e, 0x85, 0x45, 0x99, 0x08, 0xf1, + 0xce, 0xe8, 0xea, 0xcb, 0x7e, 0xb2, 0xe1, 0x76, 0x59, 0x6d, 0x48, 0xd5, + 0xe0, 0x95, 0x04, 0xf9, 0xdd, 0x06, 0xe3, 0xfd, 0x65, 0xff, 0x3f, 0xc5, + 0x9f, 0x7a, 0x05, 0x59, 0x7f, 0xb6, 0xfb, 0x90, 0x3f, 0x1a, 0xcb, 0xf4, + 0x66, 0xf8, 0xe2, 0xcb, 0x43, 0x9e, 0xeb, 0x46, 0xb4, 0xe8, 0xbe, 0x28, + 0x4b, 0xdf, 0x3c, 0xa4, 0x35, 0x97, 0xf3, 0xea, 0x3c, 0xfd, 0x59, 0x79, + 0xa6, 0x9a, 0x49, 0x7f, 0xd1, 0x2f, 0xbd, 0xa8, 0xcf, 0x92, 0x4f, 0x34, + 0x17, 0xfc, 0x07, 0xfb, 0x3c, 0x7f, 0x34, 0xb2, 0xe8, 0xe2, 0xca, 0x1a, + 0x61, 0x7d, 0x22, 0x24, 0xce, 0x26, 0x6f, 0x3b, 0xb9, 0xb4, 0x6e, 0x96, + 0x5f, 0xc6, 0xfc, 0xff, 0x80, 0x59, 0x7f, 0xf1, 0xc9, 0xf8, 0xe4, 0x00, + 0xe7, 0x12, 0x5f, 0xff, 0xdd, 0x3f, 0x77, 0x38, 0x58, 0xc0, 0x73, 0xaf, + 0x25, 0x97, 0xfa, 0x25, 0xe7, 0xeb, 0x8d, 0x65, 0x42, 0x33, 0xb1, 0x0b, + 0x4b, 0x56, 0x92, 0xcb, 0x49, 0x65, 0xa4, 0xb2, 0xf3, 0x4d, 0x34, 0xb2, + 0xc1, 0x49, 0x3c, 0xd0, 0x54, 0x1f, 0xb0, 0xa2, 0x26, 0x23, 0xf9, 0x8d, + 0xfc, 0x0e, 0x75, 0xe5, 0x8b, 0x2f, 0xff, 0xb8, 0x61, 0xc2, 0xd4, 0x16, + 0x0f, 0x05, 0x59, 0x4c, 0x3f, 0xaf, 0x16, 0xdb, 0xe5, 0x96, 0x15, 0x65, + 0x80, 0xb2, 0x88, 0xd1, 0xf0, 0x4a, 0xb0, 0xfd, 0xf8, 0x45, 0xe3, 0x5b, + 0xb8, 0x2a, 0xcb, 0x62, 0xcb, 0x81, 0xfc, 0x1a, 0x81, 0x8c, 0x5c, 0x70, + 0xb2, 0xfe, 0x28, 0x61, 0x46, 0x2c, 0xbf, 0xfa, 0x1f, 0x5e, 0xee, 0x0c, + 0x1e, 0xe2, 0xcb, 0xa5, 0x0b, 0x2f, 0x70, 0x62, 0xac, 0xad, 0x91, 0xc8, + 0x32, 0xd9, 0x85, 0x7a, 0x54, 0x04, 0x41, 0x05, 0xaf, 0xff, 0xff, 0xbb, + 0x1e, 0xe1, 0xf3, 0x91, 0xee, 0x9c, 0x6b, 0xf6, 0x3c, 0xa5, 0xe1, 0x56, + 0x5c, 0x7f, 0x2c, 0xba, 0x18, 0xb2, 0xff, 0xfd, 0x04, 0x09, 0x4a, 0x3d, + 0xdc, 0x60, 0x91, 0xfa, 0xcb, 0xff, 0xe3, 0x20, 0x4b, 0x39, 0xa8, 0x39, + 0x3f, 0x12, 0x54, 0x91, 0x47, 0xe5, 0x6b, 0x83, 0x3e, 0x19, 0x1f, 0xdb, + 0x42, 0x5e, 0x44, 0x23, 0x86, 0xae, 0x46, 0x62, 0x2a, 0x60, 0x48, 0x75, + 0x0f, 0xc7, 0x85, 0x21, 0x46, 0x5b, 0xc8, 0xce, 0xbc, 0xb5, 0xbd, 0xff, + 0x70, 0x5c, 0x48, 0x5c, 0xdf, 0xfe, 0x9e, 0xc7, 0x94, 0xfc, 0xd0, 0x5d, + 0xc2, 0xa8, 0xa3, 0x17, 0xed, 0xf1, 0xa8, 0xfd, 0x65, 0xf8, 0x9f, 0xf8, + 0x11, 0x65, 0xff, 0x8f, 0xe9, 0x70, 0xb3, 0xdd, 0x02, 0xcb, 0xfe, 0x3d, + 0x77, 0x30, 0xa5, 0xc5, 0x95, 0x23, 0xf6, 0x09, 0xfd, 0xf3, 0xef, 0xc2, + 0x59, 0x5f, 0x1e, 0x26, 0x88, 0xaf, 0xfc, 0xf2, 0x0f, 0x4d, 0x91, 0xa1, + 0x56, 0x5a, 0x7c, 0x26, 0xdd, 0xd2, 0xaf, 0x43, 0x89, 0xa2, 0x3a, 0x93, + 0x3c, 0x13, 0x51, 0xc3, 0x31, 0xb1, 0xe9, 0x3e, 0x5c, 0x8c, 0x37, 0xd1, + 0xe4, 0x5f, 0xfd, 0x3d, 0xe5, 0x3f, 0x34, 0x17, 0x70, 0xaa, 0x23, 0x95, + 0xff, 0xe9, 0xec, 0x79, 0x4f, 0xcd, 0x05, 0xdc, 0x2a, 0x89, 0xc9, 0x7f, + 0xa7, 0xe6, 0x82, 0xee, 0x15, 0x45, 0x98, 0xbb, 0xdf, 0xac, 0xbf, 0x67, + 0x4b, 0x34, 0xb2, 0xf6, 0xd1, 0xa5, 0x97, 0xe9, 0x71, 0xd9, 0x3f, 0xa7, + 0xb6, 0x43, 0x1c, 0x26, 0xbe, 0x6e, 0x0d, 0xd3, 0x74, 0xdc, 0x16, 0x5f, + 0xe1, 0xe3, 0x23, 0xe8, 0x62, 0xca, 0x6e, 0x8f, 0xb1, 0xb8, 0x1c, 0xdf, + 0xed, 0x47, 0xba, 0xff, 0x49, 0x65, 0xff, 0xff, 0xf4, 0x4d, 0xd8, 0xf4, + 0x08, 0x7a, 0x9a, 0x3b, 0x9b, 0xf3, 0xb8, 0x3d, 0xf8, 0xb2, 0xbf, 0x45, + 0xa9, 0x1a, 0x5f, 0xf6, 0x71, 0xfd, 0xf8, 0x85, 0x25, 0x96, 0xfd, 0x65, + 0xfd, 0xcd, 0x6b, 0x3e, 0xe2, 0xca, 0x6e, 0x8f, 0x07, 0x04, 0xaf, 0x6b, + 0x18, 0xb2, 0xf8, 0xcb, 0x38, 0xb2, 0xd9, 0xe3, 0x78, 0xde, 0x39, 0x7e, + 0xd7, 0xbc, 0x7a, 0x59, 0x79, 0xc8, 0x2b, 0x2f, 0x72, 0x38, 0xb2, 0xff, + 0xc6, 0x51, 0xc8, 0xf6, 0xd8, 0xd2, 0xcb, 0xff, 0x10, 0xfb, 0x1c, 0xe6, + 0x6a, 0x16, 0x5f, 0xb3, 0xef, 0x64, 0x2c, 0xba, 0x70, 0x8b, 0x2f, 0xc1, + 0xeb, 0x9b, 0x6d, 0x65, 0xf8, 0x1c, 0x8e, 0x42, 0xca, 0xd1, 0xe9, 0x39, + 0x5d, 0xfc, 0x5f, 0xf7, 0x3f, 0x75, 0x97, 0xc5, 0x1b, 0xc0, 0xb2, 0x8c, + 0xf4, 0x5c, 0xba, 0xef, 0x98, 0xb2, 0xff, 0xed, 0xc7, 0x2f, 0xf3, 0xd0, + 0x47, 0xfa, 0xcb, 0x4f, 0x6e, 0x97, 0x1a, 0x22, 0x1c, 0x5b, 0x11, 0xc9, + 0xec, 0x6c, 0x58, 0x52, 0x12, 0x8f, 0x86, 0xd8, 0x38, 0xe7, 0xc4, 0x7b, + 0xc2, 0x70, 0x36, 0x6f, 0x72, 0xdc, 0x20, 0x10, 0x62, 0xff, 0x4f, 0xcd, + 0x05, 0xdc, 0x2a, 0x8b, 0x75, 0x7f, 0x13, 0xcf, 0xd6, 0xdd, 0x59, 0x78, + 0xfe, 0xfd, 0x65, 0xff, 0xda, 0x70, 0xfe, 0x0e, 0x7a, 0x3e, 0x69, 0x65, + 0xc4, 0x2a, 0xcb, 0xe0, 0xbb, 0x85, 0x51, 0x48, 0x2b, 0x0f, 0x17, 0x42, + 0xf7, 0xfa, 0x5e, 0x36, 0xb9, 0xf9, 0xac, 0xbf, 0xf6, 0x74, 0xf7, 0xf7, + 0x30, 0x82, 0xb2, 0xf3, 0xca, 0x78, 0xd3, 0x21, 0xc8, 0x46, 0xfc, 0x43, + 0xc3, 0x5b, 0xfc, 0x63, 0x07, 0xb8, 0xc2, 0x59, 0x7c, 0xd3, 0x23, 0x8b, + 0x2f, 0x39, 0x49, 0x65, 0xa7, 0x85, 0x51, 0xb6, 0x8c, 0x19, 0x19, 0xfb, + 0xab, 0x00, 0xcd, 0xa2, 0x3b, 0xff, 0xa7, 0xbc, 0xa7, 0xe6, 0x82, 0xee, + 0x15, 0x44, 0xa4, 0xad, 0x99, 0x51, 0xf3, 0x2a, 0x31, 0x69, 0xe1, 0x39, + 0xfc, 0xe9, 0x09, 0x43, 0xcb, 0xd2, 0x9d, 0xdb, 0xd9, 0xef, 0x4f, 0x70, + 0xac, 0xbf, 0x8c, 0xb3, 0xb8, 0x15, 0x97, 0xf1, 0x97, 0xb0, 0xc6, 0xb2, + 0xe9, 0x79, 0x65, 0xe2, 0x86, 0x96, 0x5d, 0x13, 0xf4, 0x6c, 0xc8, 0x5e, + 0xa4, 0x88, 0xbf, 0x2f, 0x5e, 0xe0, 0x18, 0xb2, 0xd3, 0xe4, 0x8f, 0x6f, + 0xa1, 0x6c, 0x64, 0x77, 0x89, 0xe4, 0xb2, 0xfd, 0xa0, 0xbb, 0x85, 0x51, + 0x3b, 0x2f, 0xfe, 0xce, 0x93, 0xc8, 0x1f, 0xb1, 0xe4, 0xb2, 0xf3, 0xca, + 0x7e, 0x1f, 0xc1, 0x1a, 0x5d, 0xb6, 0xea, 0xcb, 0xff, 0xf1, 0x8c, 0x0c, + 0x86, 0xf7, 0x19, 0x41, 0x60, 0x56, 0x5f, 0xe9, 0x46, 0xb6, 0x8d, 0x6c, + 0xb2, 0xff, 0xdd, 0x27, 0x90, 0x3f, 0x63, 0xc9, 0x65, 0x41, 0xfa, 0x61, + 0xad, 0xa7, 0xe2, 0x79, 0x4c, 0x84, 0x9f, 0x4c, 0xdc, 0x6c, 0xa1, 0x93, + 0x7c, 0x7a, 0x8d, 0xeb, 0x2e, 0xce, 0xac, 0xbf, 0xfb, 0x71, 0xcb, 0xfc, + 0xf4, 0x11, 0xfe, 0xb2, 0xd3, 0xf8, 0x7f, 0xfb, 0x84, 0x62, 0x0b, 0x5f, + 0xfc, 0xec, 0xee, 0x05, 0xfb, 0x02, 0x49, 0x65, 0xe3, 0x1b, 0xac, 0xbf, + 0xf8, 0xb3, 0xaf, 0xb6, 0x70, 0x9f, 0xe5, 0x97, 0x6e, 0x4f, 0x1a, 0x28, + 0xba, 0x89, 0xc1, 0xba, 0x85, 0xd1, 0x29, 0x46, 0x28, 0xc9, 0x40, 0xfc, + 0x86, 0xce, 0xe4, 0x37, 0x6f, 0xfd, 0xc8, 0x2f, 0xbf, 0xe7, 0x23, 0xf5, + 0x97, 0xff, 0xff, 0xfd, 0xd3, 0xf3, 0xbf, 0xdc, 0xe7, 0x21, 0x91, 0xdc, + 0xcd, 0xb0, 0xb3, 0xef, 0x72, 0x3e, 0x59, 0x7f, 0xa2, 0x47, 0xe3, 0x29, + 0x2c, 0xbf, 0xff, 0xf0, 0x41, 0xb6, 0x6f, 0x8f, 0xb0, 0x6f, 0x21, 0x19, + 0xcc, 0x71, 0xac, 0xbe, 0x1b, 0xfa, 0x7e, 0x26, 0xec, 0x14, 0x1d, 0x42, + 0x53, 0x86, 0x37, 0xff, 0x4d, 0xf7, 0x0d, 0x93, 0x84, 0xd6, 0x6c, 0xb2, + 0xfd, 0xa0, 0xbb, 0x85, 0x51, 0x16, 0x2f, 0xfc, 0xf2, 0x9f, 0x9a, 0x0b, + 0xb8, 0x55, 0x12, 0xea, 0xff, 0xfe, 0xc1, 0xf6, 0x04, 0x9f, 0xe2, 0x7f, + 0xf9, 0xc8, 0xfd, 0x25, 0xa7, 0xc2, 0x65, 0x58, 0x96, 0xc3, 0x4d, 0xc4, + 0xcb, 0xff, 0x98, 0xf2, 0x9f, 0x9a, 0x0b, 0xb8, 0x55, 0x13, 0x12, 0xff, + 0xfb, 0x03, 0x13, 0xfa, 0xe7, 0xb8, 0x7f, 0xe0, 0xd6, 0x54, 0xf4, 0x52, + 0xf5, 0x4a, 0xfd, 0xa0, 0xbb, 0x85, 0x51, 0x54, 0xad, 0x8b, 0x2b, 0x0f, + 0x10, 0x53, 0x4b, 0xff, 0x01, 0xf5, 0x22, 0xc6, 0x9f, 0xf5, 0x97, 0xff, + 0x3f, 0x34, 0x6d, 0x7b, 0xa7, 0xa9, 0x2c, 0xbf, 0xed, 0x3f, 0x7e, 0x96, + 0x7a, 0x78, 0xd1, 0x09, 0xd3, 0xfa, 0x9e, 0x8f, 0xa7, 0x85, 0x35, 0xff, + 0xcc, 0x79, 0x4f, 0xcd, 0x05, 0xdc, 0x2a, 0x89, 0xd1, 0x7f, 0xe6, 0x40, + 0xb3, 0xc1, 0xb1, 0x46, 0xcb, 0x2a, 0x7a, 0x25, 0x4d, 0x4a, 0xff, 0x1b, + 0xea, 0x24, 0xfb, 0xd6, 0x5f, 0xa6, 0x89, 0xa3, 0x8b, 0x2f, 0xe6, 0xb0, + 0xf7, 0xe1, 0x2c, 0xa3, 0x3d, 0x7e, 0x14, 0xde, 0x3e, 0xc2, 0xc9, 0xe6, + 0x86, 0xff, 0xe0, 0x73, 0xd1, 0xf4, 0xf0, 0x4c, 0x6c, 0x59, 0x4c, 0x3f, + 0x6e, 0x96, 0xdf, 0xf9, 0xe5, 0x3f, 0x34, 0x17, 0x70, 0xaa, 0x27, 0x75, + 0xfb, 0xc0, 0x76, 0x1a, 0x4b, 0xff, 0x14, 0x7b, 0x39, 0x99, 0xf4, 0x96, + 0x50, 0xd3, 0xf3, 0xc8, 0xc8, 0x58, 0x44, 0xe9, 0x9e, 0x27, 0xbf, 0xe1, + 0xc4, 0xa2, 0x7b, 0x5c, 0xfd, 0x65, 0xfb, 0x85, 0x1f, 0xf1, 0x65, 0xe2, + 0xc1, 0xac, 0xba, 0x27, 0xc1, 0xe1, 0xfe, 0x51, 0x53, 0xd1, 0xfd, 0x89, + 0xe5, 0x08, 0x0b, 0xff, 0xd3, 0xd8, 0xf2, 0x9f, 0x9a, 0x0b, 0xb8, 0x55, + 0x14, 0x2a, 0xff, 0xf9, 0xfd, 0x2c, 0x23, 0x1c, 0xfe, 0x6d, 0x1a, 0x59, + 0x7f, 0xff, 0xfb, 0xa0, 0x63, 0x1e, 0x53, 0xc3, 0xd0, 0x7a, 0x0b, 0x36, + 0x14, 0x11, 0x32, 0xcb, 0xf0, 0x3e, 0xf1, 0x85, 0x65, 0xfb, 0x3f, 0xc7, + 0x25, 0x97, 0xdc, 0x36, 0xbc, 0xb2, 0xf4, 0x7f, 0x3f, 0x63, 0xf2, 0x22, + 0x9f, 0x13, 0x51, 0xa6, 0x64, 0x50, 0xef, 0xbf, 0xfd, 0x3d, 0x8f, 0x29, + 0xf9, 0xa0, 0xbb, 0x85, 0x51, 0x49, 0x2f, 0xff, 0xf6, 0x72, 0x78, 0x99, + 0x37, 0x5d, 0x9e, 0xec, 0x78, 0x0c, 0x59, 0x50, 0xca, 0x9f, 0xda, 0x38, + 0x59, 0x43, 0xb0, 0x31, 0xb1, 0xea, 0x17, 0xcc, 0x96, 0x2b, 0xf9, 0xa9, + 0x2d, 0x7a, 0x38, 0x30, 0x13, 0xee, 0x2d, 0x5f, 0xe9, 0xf9, 0xa0, 0xbb, + 0x85, 0x51, 0x12, 0x2f, 0x69, 0xf4, 0xb2, 0xff, 0xcf, 0x29, 0xf9, 0xa0, + 0xbb, 0x85, 0x51, 0x2f, 0x2d, 0x3c, 0xcf, 0xa1, 0x83, 0x97, 0xff, 0x46, + 0xf7, 0x98, 0xf5, 0xf4, 0xa2, 0x65, 0x97, 0x9b, 0xa6, 0x7e, 0xb2, 0xfb, + 0x40, 0xf7, 0x16, 0x5f, 0xb5, 0xfb, 0x0f, 0x8b, 0x2f, 0x41, 0x7c, 0xb2, + 0xfd, 0xe1, 0x18, 0x50, 0xb2, 0xc7, 0xd3, 0xc4, 0x21, 0xcb, 0xff, 0xdd, + 0xdf, 0x05, 0xfe, 0xee, 0x0f, 0x35, 0xf2, 0xcb, 0xfc, 0x7a, 0x71, 0x99, + 0x0a, 0xb2, 0xe8, 0xf2, 0xcb, 0xfe, 0x7d, 0xb5, 0x1f, 0x48, 0xd8, 0xb2, + 0xff, 0xf0, 0x06, 0x7a, 0x12, 0x66, 0xf0, 0x39, 0x4c, 0xb2, 0xa4, 0x9a, + 0x41, 0x93, 0x75, 0x43, 0xf3, 0x22, 0x16, 0xe1, 0xd5, 0xfd, 0xff, 0x63, + 0x46, 0xc5, 0x97, 0xfe, 0x9b, 0x91, 0xbd, 0xfb, 0x1f, 0x4c, 0xb2, 0xa0, + 0xfc, 0x5c, 0xba, 0xf8, 0xdb, 0xc4, 0x62, 0xcb, 0xf6, 0x6d, 0x9c, 0x62, + 0xcb, 0xf9, 0xf6, 0x7e, 0x3f, 0xeb, 0x2f, 0xfe, 0x9a, 0x70, 0x85, 0x1b, + 0xdf, 0x7c, 0x4c, 0xb2, 0x96, 0x5f, 0x7b, 0x35, 0x32, 0xcb, 0xde, 0x7d, + 0xeb, 0x2d, 0x2c, 0x3c, 0x17, 0x23, 0xbf, 0x3f, 0x23, 0x7e, 0x2c, 0xa9, + 0x8f, 0x3b, 0x79, 0x35, 0x42, 0x61, 0x78, 0x98, 0xf0, 0x9a, 0xbb, 0x50, + 0xb2, 0x86, 0xb9, 0x20, 0x64, 0x73, 0x47, 0x6b, 0xa8, 0x64, 0x74, 0x80, + 0x89, 0xbc, 0x51, 0xbe, 0x33, 0x96, 0xf3, 0x3b, 0xb0, 0x96, 0x5f, 0xd3, + 0xb9, 0xdc, 0x3f, 0x2c, 0xa1, 0x9e, 0x21, 0x8a, 0xdc, 0x3f, 0x96, 0x5f, + 0xc4, 0x0f, 0x4d, 0x02, 0xac, 0xbc, 0xdb, 0x3d, 0x2c, 0xb1, 0xb9, 0xe7, + 0x80, 0xbe, 0xfc, 0x59, 0xb0, 0x9b, 0xd6, 0x5f, 0x66, 0xc2, 0x6f, 0x59, + 0x7e, 0x1c, 0x7c, 0x37, 0x9c, 0x7a, 0x24, 0x57, 0x7f, 0xfc, 0x7a, 0x9d, + 0xd8, 0x3f, 0x70, 0x01, 0x04, 0x2c, 0xbe, 0x3d, 0xbf, 0xdd, 0x59, 0x79, + 0xdc, 0x2a, 0x8a, 0x5d, 0x4b, 0x28, 0x26, 0xce, 0x62, 0x8b, 0xe2, 0xf4, + 0x69, 0x65, 0xff, 0x66, 0xb7, 0x70, 0x79, 0xaf, 0x96, 0x51, 0x9e, 0xee, + 0xf2, 0x1b, 0xff, 0x44, 0xba, 0xe7, 0xf7, 0x20, 0x55, 0x95, 0x24, 0xf3, + 0x05, 0x40, 0x99, 0x47, 0x4b, 0x5d, 0x7f, 0x22, 0x3b, 0xd1, 0xaf, 0x2c, + 0xbf, 0x87, 0xf4, 0x68, 0xfe, 0x59, 0x7d, 0xed, 0xb1, 0xa5, 0x95, 0x23, + 0xef, 0x31, 0xc2, 0x2f, 0xbf, 0x18, 0xba, 0xce, 0x2c, 0xbf, 0xf4, 0x14, + 0x76, 0x70, 0x08, 0x01, 0x59, 0x78, 0x0f, 0xc5, 0x97, 0xd3, 0x01, 0xe6, + 0x59, 0x7e, 0x8f, 0xdf, 0xee, 0x2c, 0xbc, 0x47, 0xfa, 0xcb, 0xd9, 0xee, + 0x2c, 0xa8, 0x37, 0x1c, 0x1c, 0xa9, 0x26, 0x50, 0x32, 0x89, 0x8f, 0xfa, + 0x39, 0xf9, 0x27, 0x98, 0x6f, 0xdb, 0xae, 0x43, 0x6f, 0x59, 0x4b, 0x2f, + 0xdc, 0xf6, 0xa3, 0x8b, 0x2d, 0x1f, 0x1b, 0x3f, 0x05, 0xdf, 0xf7, 0xfc, + 0xd4, 0x7d, 0x23, 0x62, 0xcb, 0xde, 0x7d, 0xeb, 0x2f, 0xdb, 0x02, 0x68, + 0xdd, 0x59, 0x7c, 0x09, 0xa3, 0x75, 0x65, 0xcf, 0xb4, 0xe3, 0xd3, 0xd8, + 0xb6, 0xa1, 0x1b, 0xae, 0x76, 0x07, 0x1b, 0xfe, 0x83, 0xff, 0x90, 0xc7, + 0xf2, 0xcb, 0xfe, 0x3e, 0x4c, 0x65, 0xe8, 0xfd, 0x65, 0xff, 0xc5, 0xed, + 0xf1, 0xae, 0x39, 0x46, 0xea, 0xca, 0x92, 0x39, 0xb4, 0x5c, 0xc3, 0x8e, + 0x1c, 0xdf, 0xe8, 0xdd, 0xe4, 0x31, 0xfc, 0xb2, 0xe7, 0x25, 0x97, 0xfd, + 0x1f, 0xce, 0xec, 0x31, 0xc9, 0x65, 0x7c, 0x79, 0xfb, 0xc5, 0x6a, 0x48, + 0xa9, 0xd4, 0x21, 0x2f, 0xe8, 0x68, 0xfa, 0x0d, 0xd5, 0x97, 0xf7, 0xd2, + 0xe3, 0x97, 0xcb, 0x2a, 0x15, 0xdc, 0x49, 0x83, 0x23, 0xea, 0x38, 0x73, + 0x68, 0xa0, 0x43, 0x1b, 0xff, 0x14, 0xd3, 0xb5, 0x1f, 0x48, 0xd8, 0xb2, + 0xff, 0xf6, 0xf8, 0x2f, 0x7b, 0xb8, 0x30, 0x7b, 0x8b, 0x2e, 0x86, 0x2c, + 0xa8, 0x45, 0x26, 0x21, 0x69, 0x32, 0xfe, 0x82, 0x9b, 0xc6, 0x2a, 0xcb, + 0xfe, 0x96, 0x6a, 0x6c, 0x28, 0x62, 0xcb, 0xf7, 0xf0, 0x1c, 0x62, 0xcb, + 0xfd, 0x9b, 0x72, 0x26, 0x06, 0x96, 0x51, 0xa2, 0x57, 0x47, 0x04, 0x51, + 0x74, 0xb1, 0x65, 0xfb, 0x82, 0xe9, 0xda, 0x59, 0x78, 0xa1, 0x8b, 0x28, + 0x67, 0x8b, 0xa2, 0xab, 0xef, 0xb7, 0x72, 0x4b, 0x2f, 0xf3, 0xea, 0x6c, + 0xf3, 0x7e, 0xf5, 0x97, 0xa3, 0xfe, 0x2c, 0xa8, 0x4c, 0x9c, 0x65, 0xd8, + 0xb6, 0xe4, 0x40, 0x26, 0x68, 0xe6, 0xf9, 0xfa, 0xfb, 0x2c, 0xbf, 0x74, + 0x02, 0xe1, 0x2c, 0xbf, 0xcd, 0x13, 0xfa, 0x4e, 0x35, 0x97, 0xef, 0x09, + 0xb4, 0x75, 0x65, 0xff, 0x47, 0x78, 0xfe, 0x8d, 0x37, 0xac, 0xbf, 0xf3, + 0x1c, 0x62, 0x4d, 0x28, 0x2f, 0x96, 0x50, 0xcf, 0xf0, 0xce, 0xef, 0xe0, + 0x76, 0x35, 0x9f, 0xac, 0xbe, 0xd7, 0xe2, 0x6f, 0x59, 0x78, 0xda, 0xf2, + 0xca, 0x91, 0xf9, 0x74, 0xbb, 0x84, 0xf5, 0xb2, 0x7c, 0xa3, 0x22, 0xf8, + 0xa2, 0x63, 0x3e, 0xc2, 0x9b, 0xd0, 0x93, 0xbf, 0xc5, 0xec, 0xe1, 0xbf, + 0x56, 0x5f, 0xf7, 0xe7, 0xdc, 0xd3, 0xcd, 0xc5, 0x97, 0xff, 0xe8, 0x91, + 0x46, 0xc2, 0x4d, 0xce, 0xe3, 0x7e, 0xbf, 0x59, 0x7f, 0x4e, 0x66, 0x79, + 0xfc, 0xb2, 0xfe, 0xe9, 0x8c, 0xf4, 0x15, 0x96, 0x0a, 0xcb, 0xbe, 0xe6, + 0x1f, 0x68, 0x4b, 0xdc, 0xb6, 0xf4, 0x18, 0xd6, 0x54, 0x27, 0x13, 0xf1, + 0x8b, 0x0e, 0x9e, 0x19, 0x3c, 0x3a, 0xbf, 0xd8, 0xd4, 0x8f, 0x80, 0x62, + 0xcb, 0xb7, 0xf1, 0x65, 0xfc, 0x0e, 0x44, 0xc0, 0xd2, 0xcb, 0xf6, 0x6d, + 0x9d, 0xe2, 0xca, 0x83, 0xf0, 0xe8, 0xc9, 0x17, 0xde, 0xcd, 0x71, 0x65, + 0x04, 0xf2, 0x77, 0x96, 0xdf, 0xf7, 0xf1, 0xf8, 0x9b, 0xe0, 0x9b, 0xd6, + 0x54, 0x26, 0xa3, 0x90, 0xed, 0x32, 0x4b, 0xff, 0xff, 0xbb, 0x1a, 0xf8, + 0x27, 0xf4, 0xe1, 0x5e, 0x77, 0x3a, 0xe1, 0x82, 0x1a, 0xcb, 0xe3, 0x17, + 0x73, 0x16, 0x5f, 0xc2, 0x7a, 0x36, 0x2f, 0x96, 0x5e, 0x23, 0x62, 0xca, + 0xd1, 0xf8, 0x7e, 0x4b, 0xe3, 0x0b, 0xfc, 0x50, 0xe5, 0xec, 0x25, 0x97, + 0xfa, 0x3e, 0xe6, 0xec, 0x68, 0x55, 0x97, 0xfb, 0xaf, 0x31, 0xea, 0x36, + 0x59, 0x7f, 0x63, 0x7b, 0x23, 0x3c, 0xb2, 0xec, 0x62, 0xca, 0x1a, 0x7f, + 0x19, 0x0e, 0x86, 0x18, 0x74, 0xbd, 0xce, 0x00, 0x69, 0xbc, 0xbe, 0xfc, + 0xde, 0x6c, 0x8e, 0x2c, 0xbf, 0x3e, 0xfc, 0xd7, 0x16, 0x50, 0xcf, 0x4d, + 0x85, 0x57, 0xee, 0xb9, 0x1b, 0x16, 0x5f, 0x0b, 0x37, 0x21, 0x65, 0xfd, + 0xff, 0xdf, 0xe6, 0xb1, 0x65, 0xfc, 0x18, 0x3f, 0x1c, 0x96, 0x5f, 0xcf, + 0xfb, 0x23, 0x3c, 0xb2, 0xa1, 0x11, 0x38, 0x60, 0x65, 0x97, 0xc3, 0xeb, + 0xfc, 0xb2, 0xfe, 0xff, 0x91, 0xd8, 0xe2, 0xca, 0x83, 0xd1, 0x72, 0x3b, + 0xf7, 0xde, 0xe6, 0x6c, 0xb2, 0xec, 0xd9, 0x65, 0x39, 0xe0, 0x91, 0x55, + 0x42, 0x7e, 0x98, 0x44, 0x64, 0xdd, 0x85, 0x69, 0x3f, 0x71, 0x86, 0xef, + 0xc2, 0xb2, 0xdc, 0x59, 0x71, 0x8b, 0xc3, 0x52, 0x01, 0x8b, 0xdf, 0xb8, + 0x56, 0x5f, 0x35, 0x37, 0x21, 0x65, 0xfd, 0xc2, 0x7d, 0xa3, 0xcb, 0x2f, + 0xdb, 0x3f, 0x32, 0x4b, 0x2f, 0xff, 0x87, 0x9b, 0xdf, 0x53, 0x09, 0x27, + 0xf3, 0xb1, 0x65, 0x41, 0xfd, 0x99, 0x45, 0xfc, 0xff, 0x7e, 0xc3, 0xe2, + 0xca, 0x84, 0xce, 0x3e, 0x1d, 0x98, 0x93, 0x50, 0xa8, 0xe9, 0x05, 0xfe, + 0xf1, 0xb4, 0xf3, 0x43, 0x16, 0x5a, 0x7b, 0x61, 0xbe, 0xfe, 0x6e, 0x52, + 0x22, 0x72, 0xcf, 0x68, 0x6d, 0x48, 0x84, 0x6c, 0xf9, 0x29, 0x0f, 0xe8, + 0x64, 0x1c, 0x6a, 0xb3, 0x4e, 0x09, 0x6a, 0x30, 0x66, 0x17, 0x76, 0x3e, + 0xa7, 0x94, 0x77, 0xfc, 0x7d, 0xc5, 0x1d, 0x07, 0x25, 0x15, 0xfa, 0x55, + 0x8e, 0xe4, 0x20, 0x84, 0x8d, 0x95, 0xbd, 0x46, 0xff, 0x4f, 0xcd, 0x05, + 0xdc, 0x2a, 0x8a, 0x71, 0x7f, 0x99, 0x0c, 0xc6, 0xf8, 0xf2, 0xcb, 0xec, + 0xe0, 0x92, 0x59, 0x7f, 0xe3, 0xd3, 0xf3, 0xb9, 0x84, 0x15, 0x97, 0xe6, + 0x6b, 0x59, 0xc5, 0x97, 0xff, 0xee, 0x83, 0xda, 0x8f, 0x73, 0x03, 0xc8, + 0xd0, 0x56, 0x5f, 0xf7, 0x0c, 0x5c, 0x94, 0x7f, 0xc5, 0x97, 0xff, 0xf7, + 0xb2, 0x62, 0x3e, 0x7a, 0x04, 0x3d, 0x4d, 0x1d, 0x59, 0x7f, 0x30, 0x71, + 0xc0, 0x12, 0xcb, 0xde, 0xe9, 0xac, 0xa3, 0x3c, 0x97, 0x2d, 0xbf, 0x9f, + 0xee, 0x4e, 0xe0, 0x8b, 0x2f, 0xde, 0xfa, 0x50, 0xd2, 0xcb, 0xf9, 0xc4, + 0xcd, 0xf1, 0xc5, 0x95, 0x87, 0xb2, 0x02, 0xab, 0xff, 0x1f, 0xdc, 0x2c, + 0x1f, 0x5d, 0xa5, 0x97, 0xff, 0xd9, 0xb6, 0x7d, 0xee, 0x19, 0x47, 0xee, + 0xc5, 0x94, 0x2a, 0x23, 0xf8, 0x7f, 0x7f, 0xec, 0xec, 0x6b, 0x27, 0xb4, + 0xd3, 0x49, 0x2e, 0x36, 0x96, 0x5d, 0xb4, 0xf8, 0x57, 0x95, 0x23, 0x51, + 0x91, 0xe1, 0xe0, 0x4a, 0x3e, 0x56, 0x33, 0xae, 0xc2, 0x97, 0xf2, 0x02, + 0x84, 0x5f, 0xa1, 0x61, 0xb8, 0x48, 0xde, 0x87, 0x7e, 0xd0, 0x5d, 0xc2, + 0xa8, 0xaf, 0x17, 0xff, 0xf6, 0x0f, 0xb0, 0x24, 0xff, 0x13, 0xff, 0xce, + 0x47, 0xe9, 0x2d, 0x3f, 0x11, 0x27, 0xb8, 0x69, 0x7f, 0xf4, 0xf7, 0x94, + 0xfc, 0xd0, 0x5d, 0xc2, 0xa8, 0x91, 0xd7, 0x83, 0x8c, 0x59, 0x78, 0xff, + 0x85, 0x97, 0x83, 0x8c, 0x49, 0x3c, 0xbc, 0xbe, 0xc7, 0xfb, 0xf5, 0x97, + 0xc1, 0x77, 0x0a, 0xa2, 0x48, 0x56, 0xc7, 0xa3, 0xa2, 0x3b, 0xff, 0xf1, + 0xe8, 0xdb, 0xe0, 0xb6, 0x8f, 0x1f, 0x5f, 0x65, 0x97, 0xe7, 0x97, 0x8f, + 0x65, 0x95, 0x07, 0xfe, 0x6a, 0xf7, 0xff, 0x9f, 0xd3, 0x73, 0x06, 0x30, + 0x3e, 0xa4, 0xb2, 0xff, 0xf1, 0x67, 0xfb, 0x99, 0xa8, 0xd9, 0xf4, 0x15, + 0x97, 0x4a, 0x7c, 0x27, 0xb1, 0x8f, 0xdd, 0x85, 0x17, 0xe4, 0x1e, 0x4b, + 0xbf, 0x67, 0x67, 0xe3, 0x16, 0x5a, 0x7c, 0x2a, 0x96, 0x79, 0x42, 0x1e, + 0x5d, 0xbf, 0xfa, 0x7b, 0xca, 0x7e, 0x68, 0x2e, 0xe1, 0x54, 0x49, 0x4b, + 0xf6, 0x82, 0xee, 0x15, 0x45, 0xe2, 0xbf, 0xe9, 0x4f, 0xcd, 0x05, 0xdc, + 0x2a, 0x89, 0x35, 0x69, 0xf8, 0x7f, 0x6e, 0x69, 0x7e, 0xe7, 0x30, 0xb1, + 0x65, 0xff, 0x68, 0x31, 0xb6, 0x61, 0x79, 0x65, 0xfd, 0x1c, 0x36, 0x44, + 0xcb, 0x2f, 0x9c, 0xfe, 0xe2, 0xcb, 0x75, 0x65, 0x62, 0x2f, 0x8c, 0x99, + 0x87, 0x1d, 0x2d, 0x68, 0x8a, 0xff, 0x1f, 0xf8, 0x51, 0xf7, 0x16, 0x5f, + 0xe7, 0x21, 0xe6, 0xf8, 0x92, 0xcb, 0xfe, 0x7d, 0x4b, 0x98, 0x0d, 0x6c, + 0xb2, 0x8c, 0xfb, 0x40, 0x67, 0x7f, 0xd9, 0xf8, 0xfb, 0x05, 0x0d, 0x2c, + 0xbe, 0xff, 0x98, 0x4b, 0x2a, 0x0f, 0x6c, 0xce, 0x6f, 0xfe, 0x30, 0x07, + 0x9c, 0x7d, 0x7a, 0x05, 0x59, 0x7d, 0x20, 0x47, 0xcb, 0x2f, 0xfb, 0x63, + 0xe7, 0x1f, 0xfe, 0x81, 0x65, 0xfc, 0x7a, 0x19, 0x47, 0xcb, 0x2f, 0xff, + 0x80, 0xff, 0x66, 0x0a, 0x2b, 0xcb, 0x3e, 0xf2, 0xcb, 0xfe, 0x89, 0x73, + 0x5a, 0x72, 0xf2, 0xca, 0x92, 0x6f, 0x43, 0x20, 0x99, 0x17, 0x44, 0x7d, + 0x3b, 0xe1, 0x6e, 0xf5, 0x2b, 0xfd, 0xdc, 0xf7, 0xa0, 0xb6, 0x59, 0x79, + 0xc8, 0x2b, 0x2f, 0x76, 0x04, 0x59, 0x5e, 0x37, 0x0d, 0x0d, 0xdf, 0xc4, + 0xff, 0x93, 0xb1, 0x65, 0xff, 0x8e, 0x19, 0xdc, 0x18, 0xcf, 0xe5, 0x97, + 0xcd, 0xe7, 0x02, 0xac, 0xbd, 0x2f, 0x85, 0x59, 0x7f, 0x33, 0xdd, 0x07, + 0xb8, 0xb2, 0xf0, 0x07, 0xf2, 0xcb, 0xff, 0x9f, 0xf0, 0xf4, 0xf4, 0x47, + 0xee, 0x2c, 0xbf, 0xdb, 0xf2, 0x5d, 0x82, 0x15, 0x65, 0xc5, 0xb2, 0xca, + 0x84, 0xc8, 0x46, 0x4b, 0x83, 0xe6, 0x5e, 0xe3, 0xdf, 0xa2, 0x08, 0x6b, + 0x6f, 0x2c, 0xbb, 0x58, 0xb2, 0xf7, 0xe2, 0x6c, 0xb2, 0xb4, 0x78, 0xff, + 0x88, 0x90, 0xb5, 0xf3, 0xeb, 0x7f, 0x56, 0x5f, 0xfb, 0x40, 0x67, 0x4e, + 0x18, 0xe4, 0xb2, 0xff, 0xb9, 0x0c, 0x2c, 0x94, 0x12, 0xca, 0xd1, 0xf9, + 0xf8, 0xf6, 0xf6, 0xe3, 0x65, 0xa5, 0x95, 0x87, 0x8e, 0xde, 0x45, 0x7e, + 0xf1, 0xf6, 0x37, 0xac, 0xb8, 0xb6, 0x59, 0x7d, 0x1d, 0x06, 0xea, 0xcb, + 0xde, 0x8d, 0x2c, 0xa8, 0x44, 0x0c, 0xc5, 0x2e, 0x2e, 0x02, 0x5b, 0x9c, + 0x2b, 0x2f, 0xe0, 0x8c, 0x1b, 0x08, 0xc5, 0x97, 0xf7, 0xdc, 0xc6, 0x3f, + 0x16, 0x5f, 0x0f, 0x3b, 0x0b, 0x2f, 0xec, 0xdb, 0x51, 0xf6, 0x96, 0x5f, + 0xe0, 0x0f, 0x25, 0x1f, 0xf1, 0x65, 0x42, 0x3e, 0x70, 0x58, 0xcc, 0x5c, + 0xb8, 0x88, 0x78, 0x5f, 0x7e, 0x9b, 0x9c, 0x36, 0x2c, 0xbd, 0xc0, 0x7c, + 0xb2, 0xff, 0xfb, 0x66, 0x9e, 0x5c, 0xe6, 0x69, 0xa8, 0xd0, 0xab, 0x2c, + 0x4b, 0x2f, 0xe7, 0xf7, 0x36, 0xc6, 0x96, 0x5c, 0x20, 0x8b, 0x2b, 0x11, + 0xe7, 0x31, 0x4b, 0x8f, 0x7e, 0xa8, 0x42, 0x02, 0x17, 0xdd, 0xb9, 0x3e, + 0x19, 0x51, 0x92, 0x49, 0x1c, 0x28, 0x32, 0x3f, 0x60, 0xb4, 0x7c, 0xd7, + 0x31, 0x16, 0x8b, 0x3b, 0x1a, 0xfb, 0xc2, 0xab, 0xf2, 0xf2, 0x86, 0xf7, + 0x21, 0x4b, 0xe8, 0xcd, 0x44, 0x8d, 0x16, 0xff, 0x03, 0x69, 0xed, 0xed, + 0xe6, 0x2a, 0xca, 0x87, 0x6f, 0x77, 0xb4, 0x2a, 0x65, 0x5f, 0x93, 0x8e, + 0x39, 0x53, 0x9c, 0x0b, 0x9a, 0x36, 0x96, 0x16, 0xf6, 0x57, 0x57, 0x8f, + 0xc1, 0x0c, 0xf1, 0x29, 0x6e, 0x4d, 0xf1, 0x86, 0xd3, 0x6a, 0x4f, 0xaf, + 0x72, 0x45, 0xa2, 0x3a, 0xda, 0x70, 0x2a, 0x54, 0x9b, 0xc1, 0xcf, 0xd6, + 0x66, 0x61, 0xff, 0xc2, 0xd2, 0x72, 0x43, 0x88, 0xe3, 0x2f, 0xad, 0x22, + 0xa1, 0xd6, 0x31, 0xdb, 0xb2, 0x94, 0x26, 0xbd, 0x55, 0x8d, 0x5e, 0x76, + 0x33, 0x35, 0x3b, 0x6b, 0x76, 0xb4, 0x66, 0x7b, 0xe3, 0x74, 0xfe, 0x99, + 0x34, 0xdb, 0x97, 0xd0, 0x56, 0x97, 0x97, 0x96, 0xa8, 0x53, 0xd8, 0x98, + 0x66, 0x05, 0xea, 0x7d, 0xef, 0xa7, 0xeb, 0x35, 0x4b, 0x04, 0xdc, 0x9d, + 0xa4, 0x12, 0x98, 0xf6, 0xdf, 0x6e, 0x1f, 0x68, }; -static const unsigned kPreloadedHSTSBits = 483330; +static const unsigned kPreloadedHSTSBits = 483709; -static const unsigned kHSTSRootPosition = 482696; +static const unsigned kHSTSRootPosition = 483044; #endif // NET_HTTP_TRANSPORT_SECURITY_STATE_STATIC_H_
diff --git a/net/http/transport_security_state_static.json b/net/http/transport_security_state_static.json index 4f6e680..8da9005 100644 --- a/net/http/transport_security_state_static.json +++ b/net/http/transport_security_state_static.json
@@ -6965,7 +6965,11 @@ { "name": "zehntner.ch", "include_subdomains": true, "mode": "force-https" }, { "name": "znation.nl", "include_subdomains": true, "mode": "force-https" }, { "name": "zocken.com", "include_subdomains": true, "mode": "force-https" }, - { "name": "zwerimex.com", "include_subdomains": true, "mode": "force-https" } + { "name": "zwerimex.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "united.com", "include_subdomains": false, "mode": "force-https" }, + { "name": "www.united.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "mobile.united.com", "include_subdomains": true, "mode": "force-https" }, + { "name": "smartphone.continental.com ", "include_subdomains": true, "mode": "force-https" } ], // |ReportUMAOnPinFailure| uses these to report which domain was associated
diff --git a/net/socket/client_socket_handle.h b/net/socket/client_socket_handle.h index c5b2720..a8af5c07 100644 --- a/net/socket/client_socket_handle.h +++ b/net/socket/client_socket_handle.h
@@ -50,6 +50,8 @@ // ClientSocketPool to obtain a connected socket, possibly reusing one. This // method returns either OK or ERR_IO_PENDING. On ERR_IO_PENDING, |priority| // is used to determine the placement in ClientSocketPool's wait list. + // If |respect_limits| is DISABLED, will bypass the wait list, but |priority| + // must also be HIGHEST, if set. // // If this method succeeds, then the socket member will be set to an existing // connected socket if an existing connected socket was available to reuse, @@ -78,6 +80,7 @@ int Init(const std::string& group_name, const scoped_refptr<typename PoolType::SocketParams>& socket_params, RequestPriority priority, + ClientSocketPool::RespectLimits respect_limits, const CompletionCallback& callback, PoolType* pool, const BoundNetLog& net_log); @@ -236,6 +239,7 @@ const std::string& group_name, const scoped_refptr<typename PoolType::SocketParams>& socket_params, RequestPriority priority, + ClientSocketPool::RespectLimits respect_limits, const CompletionCallback& callback, PoolType* pool, const BoundNetLog& net_log) { @@ -247,8 +251,8 @@ pool_ = pool; group_name_ = group_name; init_time_ = base::TimeTicks::Now(); - int rv = pool_->RequestSocket( - group_name, &socket_params, priority, this, callback_, net_log); + int rv = pool_->RequestSocket(group_name, &socket_params, priority, + respect_limits, this, callback_, net_log); if (rv == ERR_IO_PENDING) { user_callback_ = callback; } else {
diff --git a/net/socket/client_socket_pool.h b/net/socket/client_socket_pool.h index e1785a3..68946a8 100644 --- a/net/socket/client_socket_pool.h +++ b/net/socket/client_socket_pool.h
@@ -61,11 +61,14 @@ // A ClientSocketPool is used to restrict the number of sockets open at a time. // It also maintains a list of idle persistent sockets. // +// Subclasses must also have an inner class SocketParams which is +// the type for the |params| argument in RequestSocket() and +// RequestSockets() below. class NET_EXPORT ClientSocketPool : public LowerLayeredPool { public: - // Subclasses must also have an inner class SocketParams which is - // the type for the |params| argument in RequestSocket() and - // RequestSockets() below. + // Indicates whether or not a request for a socket should respect the + // SocketPool's global and per-group socket limits. + enum class RespectLimits { DISABLED, ENABLED }; // Requests a connected socket for a group_name. // @@ -96,9 +99,12 @@ // client of completion. // // Profiling information for the request is saved to |net_log| if non-NULL. + // + // If |respect_limits| is DISABLED, priority must be HIGHEST. virtual int RequestSocket(const std::string& group_name, const void* params, RequestPriority priority, + RespectLimits respect_limits, ClientSocketHandle* handle, const CompletionCallback& callback, const BoundNetLog& net_log) = 0;
diff --git a/net/socket/client_socket_pool_base.cc b/net/socket/client_socket_pool_base.cc index 4a76913..30aa3dc 100644 --- a/net/socket/client_socket_pool_base.cc +++ b/net/socket/client_socket_pool_base.cc
@@ -53,11 +53,13 @@ ConnectJob::ConnectJob(const std::string& group_name, base::TimeDelta timeout_duration, RequestPriority priority, + ClientSocketPool::RespectLimits respect_limits, Delegate* delegate, const BoundNetLog& net_log) : group_name_(group_name), timeout_duration_(timeout_duration), priority_(priority), + respect_limits_(respect_limits), delegate_(delegate), net_log_(net_log), idle_(true) { @@ -141,16 +143,16 @@ ClientSocketHandle* handle, const CompletionCallback& callback, RequestPriority priority, - bool ignore_limits, + ClientSocketPool::RespectLimits respect_limits, Flags flags, const BoundNetLog& net_log) : handle_(handle), callback_(callback), priority_(priority), - ignore_limits_(ignore_limits), + respect_limits_(respect_limits), flags_(flags), net_log_(net_log) { - if (ignore_limits_) + if (respect_limits_ == ClientSocketPool::RespectLimits::DISABLED) DCHECK_EQ(priority_, MAXIMUM_PRIORITY); } @@ -378,7 +380,7 @@ // Can we make another active socket now? if (!group->HasAvailableSocketSlot(max_sockets_per_group_) && - !request.ignore_limits()) { + request.respect_limits() == ClientSocketPool::RespectLimits::ENABLED) { // TODO(willchan): Consider whether or not we need to close a socket in a // higher layered group. I don't think this makes sense since we would just // reuse that socket then if we needed one and wouldn't make it down to this @@ -388,7 +390,8 @@ return ERR_IO_PENDING; } - if (ReachedMaxSocketsLimit() && !request.ignore_limits()) { + if (ReachedMaxSocketsLimit() && + request.respect_limits() == ClientSocketPool::RespectLimits::ENABLED) { // NOTE(mmenke): Wonder if we really need different code for each case // here. Only reason for them now seems to be preconnects. if (idle_socket_count() > 0) { @@ -1302,8 +1305,8 @@ scoped_ptr<const Request> request) { // This value must be cached before we release |request|. RequestPriority priority = request->priority(); - if (request->ignore_limits()) { - // Put requests with ignore_limits == true (which should have + if (request->respect_limits() == ClientSocketPool::RespectLimits::DISABLED) { + // Put requests with RespectLimits::DISABLED (which should have // priority == MAXIMUM_PRIORITY) ahead of other requests with // MAXIMUM_PRIORITY. DCHECK_EQ(priority, MAXIMUM_PRIORITY);
diff --git a/net/socket/client_socket_pool_base.h b/net/socket/client_socket_pool_base.h index cd13ce0..d288684 100644 --- a/net/socket/client_socket_pool_base.h +++ b/net/socket/client_socket_pool_base.h
@@ -81,6 +81,7 @@ ConnectJob(const std::string& group_name, base::TimeDelta timeout_duration, RequestPriority priority, + ClientSocketPool::RespectLimits respect_limits, Delegate* delegate, const BoundNetLog& net_log); virtual ~ConnectJob(); @@ -117,6 +118,9 @@ protected: RequestPriority priority() const { return priority_; } + ClientSocketPool::RespectLimits respect_limits() const { + return respect_limits_; + } void SetSocket(scoped_ptr<StreamSocket> socket); StreamSocket* socket() { return socket_.get(); } void NotifyDelegateOfCompletion(int rv); @@ -138,6 +142,7 @@ const base::TimeDelta timeout_duration_; // TODO(akalin): Support reprioritization. const RequestPriority priority_; + const ClientSocketPool::RespectLimits respect_limits_; // Timer to abort jobs that take too long. base::OneShotTimer timer_; Delegate* delegate_; @@ -173,7 +178,7 @@ Request(ClientSocketHandle* handle, const CompletionCallback& callback, RequestPriority priority, - bool ignore_limits, + ClientSocketPool::RespectLimits respect_limits, Flags flags, const BoundNetLog& net_log); @@ -182,7 +187,9 @@ ClientSocketHandle* handle() const { return handle_; } const CompletionCallback& callback() const { return callback_; } RequestPriority priority() const { return priority_; } - bool ignore_limits() const { return ignore_limits_; } + ClientSocketPool::RespectLimits respect_limits() const { + return respect_limits_; + } Flags flags() const { return flags_; } const BoundNetLog& net_log() const { return net_log_; } @@ -200,7 +207,7 @@ const CompletionCallback callback_; // TODO(akalin): Support reprioritization. const RequestPriority priority_; - const bool ignore_limits_; + const ClientSocketPool::RespectLimits respect_limits_; const Flags flags_; const BoundNetLog net_log_; @@ -406,8 +413,8 @@ // Returns the priority of the top of the pending request queue // (which may be less than the maximum priority over the entire - // queue, due to how we prioritize requests with |ignore_limits| - // set over others). + // queue, due to how we prioritize requests with |respect_limits| + // DISABLED over others). RequestPriority TopPendingPriority() const { // NOTE: FirstMax().value()->priority() is not the same as // FirstMax().priority()! @@ -680,12 +687,16 @@ Request(ClientSocketHandle* handle, const CompletionCallback& callback, RequestPriority priority, + ClientSocketPool::RespectLimits respect_limits, internal::ClientSocketPoolBaseHelper::Flags flags, - bool ignore_limits, const scoped_refptr<SocketParams>& params, const BoundNetLog& net_log) - : internal::ClientSocketPoolBaseHelper::Request( - handle, callback, priority, ignore_limits, flags, net_log), + : internal::ClientSocketPoolBaseHelper::Request(handle, + callback, + priority, + respect_limits, + flags, + net_log), params_(params) {} const scoped_refptr<SocketParams>& params() const { return params_; } @@ -749,14 +760,13 @@ int RequestSocket(const std::string& group_name, const scoped_refptr<SocketParams>& params, RequestPriority priority, + ClientSocketPool::RespectLimits respect_limits, ClientSocketHandle* handle, const CompletionCallback& callback, const BoundNetLog& net_log) { - scoped_ptr<const Request> request( - new Request(handle, callback, priority, - internal::ClientSocketPoolBaseHelper::NORMAL, - params->ignore_limits(), - params, net_log)); + scoped_ptr<const Request> request(new Request( + handle, callback, priority, respect_limits, + internal::ClientSocketPoolBaseHelper::NORMAL, params, net_log)); return helper_.RequestSocket(group_name, std::move(request)); } @@ -767,9 +777,10 @@ const scoped_refptr<SocketParams>& params, int num_sockets, const BoundNetLog& net_log) { - const Request request(NULL /* no handle */, CompletionCallback(), IDLE, + const Request request(nullptr /* no handle */, CompletionCallback(), IDLE, + ClientSocketPool::RespectLimits::ENABLED, internal::ClientSocketPoolBaseHelper::NO_IDLE_SOCKETS, - params->ignore_limits(), params, net_log); + params, net_log); helper_.RequestSockets(group_name, request, num_sockets); }
diff --git a/net/socket/client_socket_pool_base_unittest.cc b/net/socket/client_socket_pool_base_unittest.cc index a467f49..4dca6ba 100644 --- a/net/socket/client_socket_pool_base_unittest.cc +++ b/net/socket/client_socket_pool_base_unittest.cc
@@ -107,16 +107,11 @@ class TestSocketParams : public base::RefCounted<TestSocketParams> { public: - explicit TestSocketParams(bool ignore_limits) - : ignore_limits_(ignore_limits) {} - - bool ignore_limits() { return ignore_limits_; } + explicit TestSocketParams() {} private: friend class base::RefCounted<TestSocketParams>; ~TestSocketParams() {} - - const bool ignore_limits_; }; typedef ClientSocketPoolBase<TestSocketParams> TestClientSocketPoolBase; @@ -278,14 +273,17 @@ ConnectJob::Delegate* delegate, MockClientSocketFactory* client_socket_factory, NetLog* net_log) - : ConnectJob(group_name, timeout_duration, request.priority(), delegate, + : ConnectJob(group_name, + timeout_duration, + request.priority(), + request.respect_limits(), + delegate, BoundNetLog::Make(net_log, NetLog::SOURCE_CONNECT_JOB)), job_type_(job_type), client_socket_factory_(client_socket_factory), load_state_(LOAD_STATE_IDLE), store_additional_error_state_(false), - weak_factory_(this) { - } + weak_factory_(this) {} void Signal() { DoConnect(waiting_success_, true /* async */, false /* recoverable */); @@ -505,13 +503,14 @@ int RequestSocket(const std::string& group_name, const void* params, RequestPriority priority, + RespectLimits respect_limits, ClientSocketHandle* handle, const CompletionCallback& callback, const BoundNetLog& net_log) override { const scoped_refptr<TestSocketParams>* casted_socket_params = static_cast<const scoped_refptr<TestSocketParams>*>(params); return base_.RequestSocket(group_name, *casted_socket_params, priority, - handle, callback, net_log); + respect_limits, handle, callback, net_log); } void RequestSockets(const std::string& group_name, @@ -663,8 +662,7 @@ class ClientSocketPoolBaseTest : public testing::Test { protected: - ClientSocketPoolBaseTest() - : params_(new TestSocketParams(false /* ignore_limits */)) { + ClientSocketPoolBaseTest() : params_(new TestSocketParams()) { connect_backup_jobs_enabled_ = internal::ClientSocketPoolBaseHelper::connect_backup_jobs_enabled(); internal::ClientSocketPoolBaseHelper::set_connect_backup_jobs_enabled(true); @@ -701,16 +699,17 @@ connect_job_factory_)); } - int StartRequestWithParams( + int StartRequestWithIgnoreLimits( const std::string& group_name, RequestPriority priority, - const scoped_refptr<TestSocketParams>& params) { - return test_base_.StartRequestUsingPool( - pool_.get(), group_name, priority, params); + ClientSocketPool::RespectLimits respect_limits) { + return test_base_.StartRequestUsingPool(pool_.get(), group_name, priority, + respect_limits, params_); } int StartRequest(const std::string& group_name, RequestPriority priority) { - return StartRequestWithParams(group_name, priority, params_); + return StartRequestWithIgnoreLimits( + group_name, priority, ClientSocketPool::RespectLimits::ENABLED); } int GetOrderOfRequest(size_t index) const { @@ -749,8 +748,8 @@ ClientSocketHandle ignored; TestClientSocketPoolBase::Request request( &ignored, CompletionCallback(), DEFAULT_PRIORITY, - internal::ClientSocketPoolBaseHelper::NORMAL, - false, params_, BoundNetLog()); + ClientSocketPool::RespectLimits::ENABLED, + internal::ClientSocketPoolBaseHelper::NORMAL, params_, BoundNetLog()); scoped_ptr<TestConnectJob> job( new TestConnectJob(TestConnectJob::kMockJob, "a", @@ -769,8 +768,8 @@ TestClientSocketPoolBase::Request request( &ignored, CompletionCallback(), DEFAULT_PRIORITY, - internal::ClientSocketPoolBaseHelper::NORMAL, - false, params_, BoundNetLog()); + ClientSocketPool::RespectLimits::ENABLED, + internal::ClientSocketPoolBaseHelper::NORMAL, params_, BoundNetLog()); // Deleted by TestConnectJobDelegate. TestConnectJob* job = new TestConnectJob(TestConnectJob::kMockPendingJob, @@ -812,13 +811,9 @@ BoundTestNetLog log; TestLoadTimingInfoNotConnected(handle); - EXPECT_EQ(OK, - handle.Init("a", - params_, - DEFAULT_PRIORITY, - callback.callback(), - pool_.get(), - log.bound())); + EXPECT_EQ(OK, handle.Init("a", params_, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), pool_.get(), log.bound())); EXPECT_TRUE(handle.is_initialized()); EXPECT_TRUE(handle.socket()); TestLoadTimingInfoConnectedNotReused(handle); @@ -856,12 +851,9 @@ info.headers = new HttpResponseHeaders(std::string()); handle.set_ssl_error_response_info(info); EXPECT_EQ(ERR_CONNECTION_FAILED, - handle.Init("a", - params_, - DEFAULT_PRIORITY, - callback.callback(), - pool_.get(), - log.bound())); + handle.Init("a", params_, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), pool_.get(), log.bound())); EXPECT_FALSE(handle.socket()); EXPECT_FALSE(handle.is_ssl_error()); EXPECT_TRUE(handle.ssl_error_response_info().headers.get() == NULL); @@ -1096,23 +1088,17 @@ ClientSocketHandle handle; TestCompletionCallback callback; EXPECT_EQ(ERR_IO_PENDING, - handle.Init("a", - params_, - DEFAULT_PRIORITY, - callback.callback(), - pool_.get(), - BoundNetLog())); + handle.Init("a", params_, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), pool_.get(), BoundNetLog())); ClientSocketHandle handles[4]; for (size_t i = 0; i < arraysize(handles); ++i) { TestCompletionCallback callback; EXPECT_EQ(ERR_IO_PENDING, - handles[i].Init("b", - params_, - DEFAULT_PRIORITY, - callback.callback(), - pool_.get(), - BoundNetLog())); + handles[i].Init("b", params_, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), pool_.get(), BoundNetLog())); } // One will be stalled, cancel all the handles now. @@ -1130,23 +1116,20 @@ ClientSocketHandle handles[kDefaultMaxSockets]; TestCompletionCallback callbacks[kDefaultMaxSockets]; for (int i = 0; i < kDefaultMaxSockets; ++i) { - EXPECT_EQ(OK, handles[i].Init(base::IntToString(i), - params_, - DEFAULT_PRIORITY, - callbacks[i].callback(), - pool_.get(), - BoundNetLog())); + EXPECT_EQ(OK, handles[i].Init( + base::IntToString(i), params_, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, + callbacks[i].callback(), pool_.get(), BoundNetLog())); } // Force a stalled group. ClientSocketHandle stalled_handle; TestCompletionCallback callback; - EXPECT_EQ(ERR_IO_PENDING, stalled_handle.Init("foo", - params_, - DEFAULT_PRIORITY, - callback.callback(), - pool_.get(), - BoundNetLog())); + EXPECT_EQ( + ERR_IO_PENDING, + stalled_handle.Init("foo", params_, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), pool_.get(), BoundNetLog())); // Cancel the stalled request. stalled_handle.Reset(); @@ -1169,24 +1152,22 @@ ClientSocketHandle handles[kDefaultMaxSockets]; for (int i = 0; i < kDefaultMaxSockets; ++i) { TestCompletionCallback callback; - EXPECT_EQ(ERR_IO_PENDING, handles[i].Init(base::IntToString(i), - params_, - DEFAULT_PRIORITY, - callback.callback(), - pool_.get(), - BoundNetLog())); + EXPECT_EQ( + ERR_IO_PENDING, + handles[i].Init(base::IntToString(i), params_, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), pool_.get(), BoundNetLog())); } // Force a stalled group. connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); ClientSocketHandle stalled_handle; TestCompletionCallback callback; - EXPECT_EQ(ERR_IO_PENDING, stalled_handle.Init("foo", - params_, - DEFAULT_PRIORITY, - callback.callback(), - pool_.get(), - BoundNetLog())); + EXPECT_EQ( + ERR_IO_PENDING, + stalled_handle.Init("foo", params_, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), pool_.get(), BoundNetLog())); // Since it is stalled, it should have no connect jobs. EXPECT_EQ(0, pool_->NumConnectJobsInGroup("foo")); @@ -1225,13 +1206,11 @@ ClientSocketHandle handles[kDefaultMaxSockets]; for (int i = 0; i < kDefaultMaxSockets; ++i) { TestCompletionCallback callback; - EXPECT_EQ(OK, handles[i].Init(base::StringPrintf( - "Take 2: %d", i), - params_, - DEFAULT_PRIORITY, - callback.callback(), - pool_.get(), - BoundNetLog())); + EXPECT_EQ( + OK, handles[i].Init(base::StringPrintf("Take 2: %d", i), params_, + DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), pool_.get(), BoundNetLog())); } EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count()); @@ -1239,12 +1218,11 @@ EXPECT_FALSE(pool_->IsStalled()); // Now we will hit the socket limit. - EXPECT_EQ(ERR_IO_PENDING, stalled_handle.Init("foo", - params_, - DEFAULT_PRIORITY, - callback.callback(), - pool_.get(), - BoundNetLog())); + EXPECT_EQ( + ERR_IO_PENDING, + stalled_handle.Init("foo", params_, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), pool_.get(), BoundNetLog())); EXPECT_TRUE(pool_->IsStalled()); // Dropping out of scope will close all handles and return them to idle. @@ -1267,12 +1245,9 @@ for (int i = 0; i < kDefaultMaxSockets; ++i) { ClientSocketHandle handle; TestCompletionCallback callback; - EXPECT_EQ(OK, handle.Init(base::IntToString(i), - params_, - DEFAULT_PRIORITY, - callback.callback(), - pool_.get(), - BoundNetLog())); + EXPECT_EQ(OK, handle.Init(base::IntToString(i), params_, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), pool_.get(), BoundNetLog())); } // Flush all the DoReleaseSocket tasks. @@ -1287,12 +1262,9 @@ // "0" is special here, since it should be the first entry in the sorted map, // which is the one which we would close an idle socket for. We shouldn't // close an idle socket though, since we should reuse the idle socket. - EXPECT_EQ(OK, handle.Init("0", - params_, - DEFAULT_PRIORITY, - callback.callback(), - pool_.get(), - BoundNetLog())); + EXPECT_EQ(OK, handle.Init("0", params_, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), pool_.get(), BoundNetLog())); EXPECT_EQ(kDefaultMaxSockets, client_socket_factory_.allocation_count()); EXPECT_EQ(kDefaultMaxSockets - 1, pool_->IdleSocketCount()); @@ -1361,12 +1333,10 @@ connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); ClientSocketHandle handle; TestCompletionCallback callback; - EXPECT_EQ(ERR_IO_PENDING, handle.Init("a", - params_, - DEFAULT_PRIORITY, - callback.callback(), - pool_.get(), - BoundNetLog())); + EXPECT_EQ(ERR_IO_PENDING, + handle.Init("a", params_, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), pool_.get(), BoundNetLog())); handle.Reset(); } @@ -1377,23 +1347,18 @@ ClientSocketHandle handle; TestCompletionCallback callback; - EXPECT_EQ(ERR_IO_PENDING, handle.Init("a", - params_, - DEFAULT_PRIORITY, - callback.callback(), - pool_.get(), - BoundNetLog())); + EXPECT_EQ(ERR_IO_PENDING, + handle.Init("a", params_, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), pool_.get(), BoundNetLog())); handle.Reset(); TestCompletionCallback callback2; EXPECT_EQ(ERR_IO_PENDING, - handle.Init("a", - params_, - DEFAULT_PRIORITY, - callback2.callback(), - pool_.get(), - BoundNetLog())); + handle.Init("a", params_, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, + callback2.callback(), pool_.get(), BoundNetLog())); EXPECT_EQ(OK, callback2.WaitForResult()); EXPECT_FALSE(callback.have_result()); @@ -1457,11 +1422,11 @@ handle->socket()->Disconnect(); handle->Reset(); - scoped_refptr<TestSocketParams> params( - new TestSocketParams(false /* ignore_limits */)); + scoped_refptr<TestSocketParams> params(new TestSocketParams()); TestCompletionCallback callback; - int rv = - handle->Init("a", params, LOWEST, nested_callback, pool, BoundNetLog()); + int rv = handle->Init("a", params, LOWEST, + ClientSocketPool::RespectLimits::ENABLED, + nested_callback, pool, BoundNetLog()); if (rv != ERR_IO_PENDING) { DCHECK_EQ(TestConnectJob::kMockJob, next_job_type); nested_callback.Run(rv); @@ -1480,7 +1445,7 @@ ClientSocketHandle handle; TestCompletionCallback second_result_callback; int rv = handle.Init( - "a", params_, DEFAULT_PRIORITY, + "a", params_, DEFAULT_PRIORITY, ClientSocketPool::RespectLimits::ENABLED, base::Bind(&RequestSocketOnComplete, &handle, pool_.get(), connect_job_factory_, TestConnectJob::kMockPendingJob, second_result_callback.callback()), @@ -1500,7 +1465,7 @@ ClientSocketHandle handle; TestCompletionCallback second_result_callback; int rv = handle.Init( - "a", params_, DEFAULT_PRIORITY, + "a", params_, DEFAULT_PRIORITY, ClientSocketPool::RespectLimits::ENABLED, base::Bind(&RequestSocketOnComplete, &handle, pool_.get(), connect_job_factory_, TestConnectJob::kMockPendingJob, second_result_callback.callback()), @@ -1567,23 +1532,17 @@ ClientSocketHandle handle; TestCompletionCallback callback; - int rv = handle.Init("a", - params_, - DEFAULT_PRIORITY, - callback.callback(), - pool_.get(), - BoundNetLog()); + int rv = handle.Init("a", params_, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), pool_.get(), BoundNetLog()); EXPECT_EQ(ERR_IO_PENDING, rv); // Cancel the active request. handle.Reset(); - rv = handle.Init("a", - params_, - DEFAULT_PRIORITY, - callback.callback(), - pool_.get(), - BoundNetLog()); + rv = handle.Init("a", params_, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), pool_.get(), BoundNetLog()); EXPECT_EQ(ERR_IO_PENDING, rv); EXPECT_EQ(OK, callback.WaitForResult()); @@ -1636,12 +1595,9 @@ ClientSocketHandle handle; TestCompletionCallback callback; BoundTestNetLog log; - int rv = handle.Init("a", - params_, - LOWEST, - callback.callback(), - pool_.get(), - log.bound()); + int rv = handle.Init("a", params_, LOWEST, + ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), pool_.get(), log.bound()); EXPECT_EQ(ERR_IO_PENDING, rv); EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle)); TestLoadTimingInfoNotConnected(handle); @@ -1683,12 +1639,10 @@ HttpResponseInfo info; info.headers = new HttpResponseHeaders(std::string()); handle.set_ssl_error_response_info(info); - EXPECT_EQ(ERR_IO_PENDING, handle.Init("a", - params_, - DEFAULT_PRIORITY, - callback.callback(), - pool_.get(), - log.bound())); + EXPECT_EQ(ERR_IO_PENDING, + handle.Init("a", params_, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), pool_.get(), log.bound())); EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle)); EXPECT_EQ(ERR_CONNECTION_FAILED, callback.WaitForResult()); EXPECT_FALSE(handle.is_ssl_error()); @@ -1735,20 +1689,14 @@ TestCompletionCallback callback2; EXPECT_EQ(ERR_IO_PENDING, - handle.Init("a", - params_, - DEFAULT_PRIORITY, - callback.callback(), - pool_.get(), - BoundNetLog())); + handle.Init("a", params_, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), pool_.get(), BoundNetLog())); BoundTestNetLog log2; EXPECT_EQ(ERR_IO_PENDING, - handle2.Init("a", - params_, - DEFAULT_PRIORITY, - callback2.callback(), - pool_.get(), - BoundNetLog())); + handle2.Init("a", params_, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, + callback2.callback(), pool_.get(), BoundNetLog())); handle.Reset(); @@ -1795,11 +1743,9 @@ std::vector<TestSocketRequest*> request_order; size_t completion_count; // unused TestSocketRequest req1(&request_order, &completion_count); - int rv = req1.handle()->Init("a", - params_, - DEFAULT_PRIORITY, - req1.callback(), pool_.get(), - BoundNetLog()); + int rv = req1.handle()->Init("a", params_, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, + req1.callback(), pool_.get(), BoundNetLog()); EXPECT_EQ(ERR_IO_PENDING, rv); EXPECT_EQ(OK, req1.WaitForResult()); @@ -1808,20 +1754,14 @@ connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); TestSocketRequest req2(&request_order, &completion_count); - rv = req2.handle()->Init("a", - params_, - DEFAULT_PRIORITY, - req2.callback(), - pool_.get(), - BoundNetLog()); + rv = req2.handle()->Init("a", params_, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, + req2.callback(), pool_.get(), BoundNetLog()); EXPECT_EQ(ERR_IO_PENDING, rv); TestSocketRequest req3(&request_order, &completion_count); - rv = req3.handle()->Init("a", - params_, - DEFAULT_PRIORITY, - req3.callback(), - pool_.get(), - BoundNetLog()); + rv = req3.handle()->Init("a", params_, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, + req3.callback(), pool_.get(), BoundNetLog()); EXPECT_EQ(ERR_IO_PENDING, rv); // Both Requests 2 and 3 are pending. We release socket 1 which should @@ -1855,33 +1795,24 @@ std::vector<TestSocketRequest*> request_order; size_t completion_count; // unused TestSocketRequest req1(&request_order, &completion_count); - int rv = req1.handle()->Init("a", - params_, - DEFAULT_PRIORITY, - req1.callback(), - pool_.get(), - BoundNetLog()); + int rv = req1.handle()->Init("a", params_, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, + req1.callback(), pool_.get(), BoundNetLog()); EXPECT_EQ(ERR_IO_PENDING, rv); TestSocketRequest req2(&request_order, &completion_count); - rv = req2.handle()->Init("a", - params_, - DEFAULT_PRIORITY, - req2.callback(), - pool_.get(), - BoundNetLog()); + rv = req2.handle()->Init("a", params_, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, + req2.callback(), pool_.get(), BoundNetLog()); EXPECT_EQ(ERR_IO_PENDING, rv); // The pending job is sync. connect_job_factory_->set_job_type(TestConnectJob::kMockJob); TestSocketRequest req3(&request_order, &completion_count); - rv = req3.handle()->Init("a", - params_, - DEFAULT_PRIORITY, - req3.callback(), - pool_.get(), - BoundNetLog()); + rv = req3.handle()->Init("a", params_, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, + req3.callback(), pool_.get(), BoundNetLog()); EXPECT_EQ(ERR_IO_PENDING, rv); EXPECT_EQ(ERR_CONNECTION_FAILED, req1.WaitForResult()); @@ -1901,12 +1832,9 @@ ClientSocketHandle handle; TestCompletionCallback callback; - int rv = handle.Init("a", - params_, - DEFAULT_PRIORITY, - callback.callback(), - pool_.get(), - BoundNetLog()); + int rv = handle.Init("a", params_, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), pool_.get(), BoundNetLog()); EXPECT_EQ(ERR_IO_PENDING, rv); EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState()); @@ -1925,15 +1853,17 @@ ClientSocketHandle handle; TestCompletionCallback callback; - int rv = handle.Init("a", params_, DEFAULT_PRIORITY, callback.callback(), - pool_.get(), BoundNetLog()); + int rv = handle.Init("a", params_, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), pool_.get(), BoundNetLog()); EXPECT_EQ(ERR_IO_PENDING, rv); client_socket_factory_.SetJobLoadState(0, LOAD_STATE_RESOLVING_HOST); ClientSocketHandle handle2; TestCompletionCallback callback2; - rv = handle2.Init("a", params_, DEFAULT_PRIORITY, callback2.callback(), - pool_.get(), BoundNetLog()); + rv = handle2.Init("a", params_, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, + callback2.callback(), pool_.get(), BoundNetLog()); EXPECT_EQ(ERR_IO_PENDING, rv); client_socket_factory_.SetJobLoadState(1, LOAD_STATE_RESOLVING_HOST); @@ -1956,14 +1886,16 @@ ClientSocketHandle handle; TestCompletionCallback callback; - int rv = handle.Init("a", params_, DEFAULT_PRIORITY, callback.callback(), - pool_.get(), BoundNetLog()); + int rv = handle.Init("a", params_, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), pool_.get(), BoundNetLog()); EXPECT_EQ(ERR_IO_PENDING, rv); ClientSocketHandle handle2; TestCompletionCallback callback2; - rv = handle2.Init("a", params_, DEFAULT_PRIORITY, callback2.callback(), - pool_.get(), BoundNetLog()); + rv = handle2.Init("a", params_, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, + callback2.callback(), pool_.get(), BoundNetLog()); EXPECT_EQ(ERR_IO_PENDING, rv); client_socket_factory_.SetJobLoadState(1, LOAD_STATE_RESOLVING_HOST); @@ -1984,12 +1916,9 @@ ClientSocketHandle handle; TestCompletionCallback callback; - int rv = handle.Init("a", - params_, - MEDIUM, - callback.callback(), - pool_.get(), - BoundNetLog()); + int rv = handle.Init("a", params_, MEDIUM, + ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), pool_.get(), BoundNetLog()); EXPECT_EQ(ERR_IO_PENDING, rv); EXPECT_EQ(LOAD_STATE_CONNECTING, handle.GetLoadState()); @@ -1997,12 +1926,9 @@ // The first request should now be stalled at the socket group limit. ClientSocketHandle handle2; TestCompletionCallback callback2; - rv = handle2.Init("a", - params_, - HIGHEST, - callback2.callback(), - pool_.get(), - BoundNetLog()); + rv = handle2.Init("a", params_, HIGHEST, + ClientSocketPool::RespectLimits::ENABLED, + callback2.callback(), pool_.get(), BoundNetLog()); EXPECT_EQ(ERR_IO_PENDING, rv); EXPECT_EQ(LOAD_STATE_WAITING_FOR_AVAILABLE_SOCKET, handle.GetLoadState()); EXPECT_EQ(LOAD_STATE_CONNECTING, handle2.GetLoadState()); @@ -2032,35 +1958,26 @@ ClientSocketHandle handle; TestCompletionCallback callback; - int rv = handle.Init("a", - params_, - DEFAULT_PRIORITY, - callback.callback(), - pool_.get(), - BoundNetLog()); + int rv = handle.Init("a", params_, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), pool_.get(), BoundNetLog()); EXPECT_EQ(ERR_IO_PENDING, rv); // Request for socket from another pool. ClientSocketHandle handle2; TestCompletionCallback callback2; - rv = handle2.Init("b", - params_, - DEFAULT_PRIORITY, - callback2.callback(), - pool_.get(), - BoundNetLog()); + rv = handle2.Init("b", params_, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, + callback2.callback(), pool_.get(), BoundNetLog()); EXPECT_EQ(ERR_IO_PENDING, rv); // Request another socket from the first pool. Request should stall at the // socket pool limit. ClientSocketHandle handle3; TestCompletionCallback callback3; - rv = handle3.Init("a", - params_, - DEFAULT_PRIORITY, - callback2.callback(), - pool_.get(), - BoundNetLog()); + rv = handle3.Init("a", params_, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, + callback2.callback(), pool_.get(), BoundNetLog()); EXPECT_EQ(ERR_IO_PENDING, rv); // The third handle should remain stalled as the other sockets in its group @@ -2091,8 +2008,9 @@ ClientSocketHandle handle; TestCompletionCallback callback; EXPECT_EQ(ERR_PROXY_AUTH_REQUESTED, - handle.Init("a", params_, DEFAULT_PRIORITY, callback.callback(), - pool_.get(), BoundNetLog())); + handle.Init("a", params_, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), pool_.get(), BoundNetLog())); EXPECT_TRUE(handle.is_initialized()); EXPECT_TRUE(handle.socket()); } @@ -2105,12 +2023,9 @@ ClientSocketHandle handle; TestCompletionCallback callback; EXPECT_EQ(ERR_IO_PENDING, - handle.Init("a", - params_, - DEFAULT_PRIORITY, - callback.callback(), - pool_.get(), - BoundNetLog())); + handle.Init("a", params_, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), pool_.get(), BoundNetLog())); EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle)); EXPECT_EQ(ERR_PROXY_AUTH_REQUESTED, callback.WaitForResult()); EXPECT_TRUE(handle.is_initialized()); @@ -2125,12 +2040,9 @@ ClientSocketHandle handle; TestCompletionCallback callback; EXPECT_EQ(ERR_CONNECTION_FAILED, - handle.Init("a", - params_, - DEFAULT_PRIORITY, - callback.callback(), - pool_.get(), - BoundNetLog())); + handle.Init("a", params_, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), pool_.get(), BoundNetLog())); EXPECT_FALSE(handle.is_initialized()); EXPECT_FALSE(handle.socket()); EXPECT_TRUE(handle.is_ssl_error()); @@ -2145,12 +2057,9 @@ ClientSocketHandle handle; TestCompletionCallback callback; EXPECT_EQ(ERR_IO_PENDING, - handle.Init("a", - params_, - DEFAULT_PRIORITY, - callback.callback(), - pool_.get(), - BoundNetLog())); + handle.Init("a", params_, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), pool_.get(), BoundNetLog())); EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle)); EXPECT_EQ(ERR_CONNECTION_FAILED, callback.WaitForResult()); EXPECT_FALSE(handle.is_initialized()); @@ -2173,12 +2082,9 @@ ClientSocketHandle handle; TestCompletionCallback callback; - int rv = handle.Init("a", - params_, - LOWEST, - callback.callback(), - pool_.get(), - BoundNetLog()); + int rv = handle.Init("a", params_, LOWEST, + ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), pool_.get(), BoundNetLog()); ASSERT_EQ(ERR_IO_PENDING, rv); EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle)); ASSERT_EQ(OK, callback.WaitForResult()); @@ -2194,12 +2100,9 @@ // Request a new socket. This should reuse the old socket and complete // synchronously. BoundTestNetLog log; - rv = handle.Init("a", - params_, - LOWEST, - CompletionCallback(), - pool_.get(), - log.bound()); + rv = handle.Init("a", params_, LOWEST, + ClientSocketPool::RespectLimits::ENABLED, + CompletionCallback(), pool_.get(), log.bound()); ASSERT_EQ(OK, rv); EXPECT_TRUE(handle.is_reused()); TestLoadTimingInfoConnectedReused(handle); @@ -2236,23 +2139,17 @@ ClientSocketHandle handle; TestCompletionCallback callback; - int rv = handle.Init("a", - params_, - LOWEST, - callback.callback(), - pool_.get(), - BoundNetLog()); + int rv = handle.Init("a", params_, LOWEST, + ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), pool_.get(), BoundNetLog()); ASSERT_EQ(ERR_IO_PENDING, rv); EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle)); ClientSocketHandle handle2; TestCompletionCallback callback2; - rv = handle2.Init("a", - params_, - LOWEST, - callback2.callback(), - pool_.get(), - BoundNetLog()); + rv = handle2.Init("a", params_, LOWEST, + ClientSocketPool::RespectLimits::ENABLED, + callback2.callback(), pool_.get(), BoundNetLog()); ASSERT_EQ(ERR_IO_PENDING, rv); EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle2)); @@ -2281,12 +2178,9 @@ // A new socket will be created rather than reusing the idle one. BoundTestNetLog log; TestCompletionCallback callback3; - rv = handle.Init("a", - params_, - LOWEST, - callback3.callback(), - pool_.get(), - log.bound()); + rv = handle.Init("a", params_, LOWEST, + ClientSocketPool::RespectLimits::ENABLED, + callback3.callback(), pool_.get(), log.bound()); ASSERT_EQ(ERR_IO_PENDING, rv); ASSERT_EQ(OK, callback3.WaitForResult()); EXPECT_FALSE(handle.is_reused()); @@ -2314,23 +2208,17 @@ ClientSocketHandle handle; TestCompletionCallback callback; - int rv = handle.Init("a", - params_, - LOWEST, - callback.callback(), - pool_.get(), - BoundNetLog()); + int rv = handle.Init("a", params_, LOWEST, + ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), pool_.get(), BoundNetLog()); EXPECT_EQ(ERR_IO_PENDING, rv); EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle)); ClientSocketHandle handle2; TestCompletionCallback callback2; - rv = handle2.Init("a", - params_, - LOWEST, - callback2.callback(), - pool_.get(), - BoundNetLog()); + rv = handle2.Init("a", params_, LOWEST, + ClientSocketPool::RespectLimits::ENABLED, + callback2.callback(), pool_.get(), BoundNetLog()); EXPECT_EQ(ERR_IO_PENDING, rv); EXPECT_EQ(LOAD_STATE_CONNECTING, pool_->GetLoadState("a", &handle2)); @@ -2359,12 +2247,9 @@ pool_->CleanupTimedOutIdleSockets(); BoundTestNetLog log; - rv = handle.Init("a", - params_, - LOWEST, - callback.callback(), - pool_.get(), - log.bound()); + rv = handle.Init("a", params_, LOWEST, + ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), pool_.get(), log.bound()); EXPECT_EQ(OK, rv); EXPECT_TRUE(handle.is_reused()); @@ -2388,42 +2273,30 @@ ClientSocketHandle handle; TestCompletionCallback callback; - int rv = handle.Init("a", - params_, - LOWEST, - callback.callback(), - pool_.get(), - BoundNetLog()); + int rv = handle.Init("a", params_, LOWEST, + ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), pool_.get(), BoundNetLog()); EXPECT_EQ(OK, rv); ClientSocketHandle handle2; TestCompletionCallback callback2; - rv = handle2.Init("a", - params_, - LOWEST, - callback2.callback(), - pool_.get(), - BoundNetLog()); + rv = handle2.Init("a", params_, LOWEST, + ClientSocketPool::RespectLimits::ENABLED, + callback2.callback(), pool_.get(), BoundNetLog()); EXPECT_EQ(OK, rv); ClientSocketHandle handle3; TestCompletionCallback callback3; - rv = handle3.Init("a", - params_, - LOWEST, - callback3.callback(), - pool_.get(), - BoundNetLog()); + rv = handle3.Init("a", params_, LOWEST, + ClientSocketPool::RespectLimits::ENABLED, + callback3.callback(), pool_.get(), BoundNetLog()); EXPECT_EQ(ERR_IO_PENDING, rv); ClientSocketHandle handle4; TestCompletionCallback callback4; - rv = handle4.Init("a", - params_, - LOWEST, - callback4.callback(), - pool_.get(), - BoundNetLog()); + rv = handle4.Init("a", params_, LOWEST, + ClientSocketPool::RespectLimits::ENABLED, + callback4.callback(), pool_.get(), BoundNetLog()); EXPECT_EQ(ERR_IO_PENDING, rv); // Release two disconnected sockets. @@ -2458,37 +2331,29 @@ TestCompletionCallback callback_b[4]; for (int i = 0; i < 2; ++i) { - EXPECT_EQ(OK, handle_a[i].Init("a", - params_, - LOWEST, - callback_a[i].callback(), - pool_.get(), + EXPECT_EQ(OK, handle_a[i].Init("a", params_, LOWEST, + ClientSocketPool::RespectLimits::ENABLED, + callback_a[i].callback(), pool_.get(), BoundNetLog())); - EXPECT_EQ(OK, handle_b[i].Init("b", - params_, - LOWEST, - callback_b[i].callback(), - pool_.get(), + EXPECT_EQ(OK, handle_b[i].Init("b", params_, LOWEST, + ClientSocketPool::RespectLimits::ENABLED, + callback_b[i].callback(), pool_.get(), BoundNetLog())); } // Make 4 pending requests, 2 per group. for (int i = 2; i < 4; ++i) { - EXPECT_EQ(ERR_IO_PENDING, - handle_a[i].Init("a", - params_, - LOWEST, - callback_a[i].callback(), - pool_.get(), - BoundNetLog())); - EXPECT_EQ(ERR_IO_PENDING, - handle_b[i].Init("b", - params_, - LOWEST, - callback_b[i].callback(), - pool_.get(), - BoundNetLog())); + EXPECT_EQ( + ERR_IO_PENDING, + handle_a[i].Init("a", params_, LOWEST, + ClientSocketPool::RespectLimits::ENABLED, + callback_a[i].callback(), pool_.get(), BoundNetLog())); + EXPECT_EQ( + ERR_IO_PENDING, + handle_b[i].Init("b", params_, LOWEST, + ClientSocketPool::RespectLimits::ENABLED, + callback_b[i].callback(), pool_.get(), BoundNetLog())); } // Release b's socket first. The order is important, because in @@ -2571,10 +2436,10 @@ if (reset_releasing_handle_) handle_.Reset(); - scoped_refptr<TestSocketParams> con_params( - new TestSocketParams(false /* ignore_limits */)); + scoped_refptr<TestSocketParams> con_params(new TestSocketParams()); EXPECT_EQ(expected_result_, handle2_.Init("a", con_params, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, callback2_.callback(), pool_, BoundNetLog())); } @@ -2602,8 +2467,9 @@ TestConnectJob::kMockPendingAdditionalErrorStateJob); TestReleasingSocketRequest req(pool_.get(), OK, false); EXPECT_EQ(ERR_IO_PENDING, - req.handle()->Init("a", params_, DEFAULT_PRIORITY, req.callback(), - pool_.get(), BoundNetLog())); + req.handle()->Init("a", params_, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, + req.callback(), pool_.get(), BoundNetLog())); // The next job should complete synchronously connect_job_factory_->set_job_type(TestConnectJob::kMockJob); @@ -2628,12 +2494,10 @@ ClientSocketHandle handle; TestCompletionCallback callback; - EXPECT_EQ(ERR_IO_PENDING, handle.Init("a", - params_, - DEFAULT_PRIORITY, - callback.callback(), - pool_.get(), - BoundNetLog())); + EXPECT_EQ(ERR_IO_PENDING, + handle.Init("a", params_, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), pool_.get(), BoundNetLog())); pool_->FlushWithError(ERR_NETWORK_CHANGED); @@ -2647,12 +2511,10 @@ ClientSocketHandle handle; TestCompletionCallback callback; - EXPECT_EQ(ERR_IO_PENDING, handle.Init("a", - params_, - DEFAULT_PRIORITY, - callback.callback(), - pool_.get(), - BoundNetLog())); + EXPECT_EQ(ERR_IO_PENDING, + handle.Init("a", params_, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), pool_.get(), BoundNetLog())); EXPECT_EQ(OK, callback.WaitForResult()); EXPECT_EQ(ClientSocketHandle::UNUSED, handle.reuse_type()); @@ -2661,12 +2523,10 @@ handle.Reset(); base::MessageLoop::current()->RunUntilIdle(); - EXPECT_EQ(ERR_IO_PENDING, handle.Init("a", - params_, - DEFAULT_PRIORITY, - callback.callback(), - pool_.get(), - BoundNetLog())); + EXPECT_EQ(ERR_IO_PENDING, + handle.Init("a", params_, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), pool_.get(), BoundNetLog())); EXPECT_EQ(OK, callback.WaitForResult()); EXPECT_EQ(ClientSocketHandle::UNUSED, handle.reuse_type()); } @@ -2696,12 +2556,9 @@ void OnComplete(int result) { SetResult(result); EXPECT_EQ(ERR_IO_PENDING, - handle_.Init(group_name_, - params_, - DEFAULT_PRIORITY, - nested_callback_.callback(), - pool_, - BoundNetLog())); + handle_.Init(group_name_, params_, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, + nested_callback_.callback(), pool_, BoundNetLog())); } const std::string group_name_; @@ -2722,12 +2579,10 @@ ClientSocketHandle handle; ConnectWithinCallback callback("a", params_, pool_.get()); - EXPECT_EQ(ERR_IO_PENDING, handle.Init("a", - params_, - DEFAULT_PRIORITY, - callback.callback(), - pool_.get(), - BoundNetLog())); + EXPECT_EQ(ERR_IO_PENDING, + handle.Init("a", params_, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), pool_.get(), BoundNetLog())); // Second job will be started during the first callback, and will // asynchronously complete with OK. @@ -2749,24 +2604,20 @@ connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); ClientSocketHandle handle; TestCompletionCallback callback; - EXPECT_EQ(ERR_IO_PENDING, handle.Init("bar", - params_, - DEFAULT_PRIORITY, - callback.callback(), - pool_.get(), - BoundNetLog())); + EXPECT_EQ(ERR_IO_PENDING, + handle.Init("bar", params_, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), pool_.get(), BoundNetLog())); // Start (MaxSockets - 1) connected sockets to reach max sockets. connect_job_factory_->set_job_type(TestConnectJob::kMockJob); ClientSocketHandle handles[kDefaultMaxSockets]; for (int i = 1; i < kDefaultMaxSockets; ++i) { TestCompletionCallback callback; - EXPECT_EQ(OK, handles[i].Init("bar", - params_, - DEFAULT_PRIORITY, - callback.callback(), - pool_.get(), - BoundNetLog())); + EXPECT_EQ(OK, + handles[i].Init("bar", params_, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), pool_.get(), BoundNetLog())); } base::MessageLoop::current()->RunUntilIdle(); @@ -2791,12 +2642,10 @@ connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); ClientSocketHandle handle; TestCompletionCallback callback; - EXPECT_EQ(ERR_IO_PENDING, handle.Init("bar", - params_, - DEFAULT_PRIORITY, - callback.callback(), - pool_.get(), - BoundNetLog())); + EXPECT_EQ(ERR_IO_PENDING, + handle.Init("bar", params_, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), pool_.get(), BoundNetLog())); ASSERT_TRUE(pool_->HasGroup("bar")); EXPECT_EQ(1, pool_->NumConnectJobsInGroup("bar")); EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("bar")); @@ -2821,21 +2670,17 @@ connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); ClientSocketHandle handle; TestCompletionCallback callback; - EXPECT_EQ(ERR_IO_PENDING, handle.Init("bar", - params_, - DEFAULT_PRIORITY, - callback.callback(), - pool_.get(), - BoundNetLog())); + EXPECT_EQ(ERR_IO_PENDING, + handle.Init("bar", params_, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), pool_.get(), BoundNetLog())); connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); ClientSocketHandle handle2; TestCompletionCallback callback2; - EXPECT_EQ(ERR_IO_PENDING, handle2.Init("bar", - params_, - DEFAULT_PRIORITY, - callback2.callback(), - pool_.get(), - BoundNetLog())); + EXPECT_EQ(ERR_IO_PENDING, + handle2.Init("bar", params_, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, + callback2.callback(), pool_.get(), BoundNetLog())); ASSERT_TRUE(pool_->HasGroup("bar")); EXPECT_EQ(2, pool_->NumConnectJobsInGroup("bar")); @@ -2860,12 +2705,9 @@ ClientSocketHandle handle1; TestCompletionCallback callback; EXPECT_EQ(ERR_IO_PENDING, - handle1.Init("a", - params_, - DEFAULT_PRIORITY, - callback.callback(), - pool_.get(), - BoundNetLog())); + handle1.Init("a", params_, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), pool_.get(), BoundNetLog())); EXPECT_EQ(OK, callback.WaitForResult()); // No idle sockets, no pending jobs. @@ -2876,12 +2718,9 @@ connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); ClientSocketHandle handle2; EXPECT_EQ(ERR_IO_PENDING, - handle2.Init("a", - params_, - DEFAULT_PRIORITY, - callback.callback(), - pool_.get(), - BoundNetLog())); + handle2.Init("a", params_, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), pool_.get(), BoundNetLog())); // No idle sockets, and one connecting job. EXPECT_EQ(0, pool_->IdleSocketCount()); EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); @@ -2918,12 +2757,9 @@ ClientSocketHandle handle1; TestCompletionCallback callback; EXPECT_EQ(ERR_IO_PENDING, - handle1.Init("a", - params_, - DEFAULT_PRIORITY, - callback.callback(), - pool_.get(), - BoundNetLog())); + handle1.Init("a", params_, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), pool_.get(), BoundNetLog())); EXPECT_EQ(OK, callback.WaitForResult()); // No idle sockets, no pending jobs. @@ -2934,12 +2770,9 @@ connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); ClientSocketHandle handle2; EXPECT_EQ(ERR_IO_PENDING, - handle2.Init("a", - params_, - DEFAULT_PRIORITY, - callback.callback(), - pool_.get(), - BoundNetLog())); + handle2.Init("a", params_, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), pool_.get(), BoundNetLog())); // No idle sockets, and one connecting job. EXPECT_EQ(0, pool_->IdleSocketCount()); EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); @@ -2978,12 +2811,9 @@ ClientSocketHandle handle1; TestCompletionCallback callback; EXPECT_EQ(ERR_IO_PENDING, - handle1.Init("a", - params_, - DEFAULT_PRIORITY, - callback.callback(), - pool_.get(), - BoundNetLog())); + handle1.Init("a", params_, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), pool_.get(), BoundNetLog())); EXPECT_EQ(OK, callback.WaitForResult()); // No idle sockets, no pending jobs. @@ -2994,12 +2824,9 @@ connect_job_factory_->set_job_type(TestConnectJob::kMockWaitingJob); ClientSocketHandle handle2; EXPECT_EQ(ERR_IO_PENDING, - handle2.Init("a", - params_, - DEFAULT_PRIORITY, - callback.callback(), - pool_.get(), - BoundNetLog())); + handle2.Init("a", params_, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), pool_.get(), BoundNetLog())); // No idle sockets, and one connecting job. EXPECT_EQ(0, pool_->IdleSocketCount()); EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); @@ -3041,12 +2868,9 @@ ClientSocketHandle handle1; TestCompletionCallback callback1; EXPECT_EQ(ERR_IO_PENDING, - handle1.Init("a", - params_, - DEFAULT_PRIORITY, - callback1.callback(), - pool_.get(), - BoundNetLog())); + handle1.Init("a", params_, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, + callback1.callback(), pool_.get(), BoundNetLog())); EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); // Make the second request synchronously fail. This should make the Group @@ -3057,12 +2881,9 @@ // It'll be ERR_IO_PENDING now, but the TestConnectJob will synchronously fail // when created. EXPECT_EQ(ERR_IO_PENDING, - handle2.Init("a", - params_, - DEFAULT_PRIORITY, - callback2.callback(), - pool_.get(), - BoundNetLog())); + handle2.Init("a", params_, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, + callback2.callback(), pool_.get(), BoundNetLog())); EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); @@ -3078,29 +2899,23 @@ ClientSocketHandle handle1; TestCompletionCallback callback1; - EXPECT_EQ(ERR_IO_PENDING, handle1.Init("a", - params_, - DEFAULT_PRIORITY, - callback1.callback(), - pool_.get(), - BoundNetLog())); + EXPECT_EQ(ERR_IO_PENDING, + handle1.Init("a", params_, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, + callback1.callback(), pool_.get(), BoundNetLog())); ClientSocketHandle handle2; TestCompletionCallback callback2; - EXPECT_EQ(ERR_IO_PENDING, handle2.Init("a", - params_, - DEFAULT_PRIORITY, - callback2.callback(), - pool_.get(), - BoundNetLog())); + EXPECT_EQ(ERR_IO_PENDING, + handle2.Init("a", params_, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, + callback2.callback(), pool_.get(), BoundNetLog())); ClientSocketHandle handle3; TestCompletionCallback callback3; - EXPECT_EQ(ERR_IO_PENDING, handle3.Init("a", - params_, - DEFAULT_PRIORITY, - callback3.callback(), - pool_.get(), - BoundNetLog())); + EXPECT_EQ(ERR_IO_PENDING, + handle3.Init("a", params_, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, + callback3.callback(), pool_.get(), BoundNetLog())); EXPECT_EQ(OK, callback1.WaitForResult()); EXPECT_EQ(OK, callback2.WaitForResult()); @@ -3114,24 +2929,15 @@ handle2.Reset(); handle3.Reset(); - EXPECT_EQ(OK, handle1.Init("a", - params_, - DEFAULT_PRIORITY, - callback1.callback(), - pool_.get(), - BoundNetLog())); - EXPECT_EQ(OK, handle2.Init("a", - params_, - DEFAULT_PRIORITY, - callback2.callback(), - pool_.get(), - BoundNetLog())); - EXPECT_EQ(OK, handle3.Init("a", - params_, - DEFAULT_PRIORITY, - callback3.callback(), - pool_.get(), - BoundNetLog())); + EXPECT_EQ(OK, handle1.Init("a", params_, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, + callback1.callback(), pool_.get(), BoundNetLog())); + EXPECT_EQ(OK, handle2.Init("a", params_, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, + callback2.callback(), pool_.get(), BoundNetLog())); + EXPECT_EQ(OK, handle3.Init("a", params_, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, + callback3.callback(), pool_.get(), BoundNetLog())); EXPECT_TRUE(handle1.socket()->WasEverUsed()); EXPECT_TRUE(handle2.socket()->WasEverUsed()); @@ -3151,21 +2957,17 @@ ClientSocketHandle handle1; TestCompletionCallback callback1; - EXPECT_EQ(ERR_IO_PENDING, handle1.Init("a", - params_, - DEFAULT_PRIORITY, - callback1.callback(), - pool_.get(), - BoundNetLog())); + EXPECT_EQ(ERR_IO_PENDING, + handle1.Init("a", params_, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, + callback1.callback(), pool_.get(), BoundNetLog())); ClientSocketHandle handle2; TestCompletionCallback callback2; - EXPECT_EQ(ERR_IO_PENDING, handle2.Init("a", - params_, - DEFAULT_PRIORITY, - callback2.callback(), - pool_.get(), - BoundNetLog())); + EXPECT_EQ(ERR_IO_PENDING, + handle2.Init("a", params_, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, + callback2.callback(), pool_.get(), BoundNetLog())); EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a")); EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); @@ -3187,12 +2989,10 @@ ClientSocketHandle handle1; TestCompletionCallback callback1; - EXPECT_EQ(ERR_IO_PENDING, handle1.Init("a", - params_, - DEFAULT_PRIORITY, - callback1.callback(), - pool_.get(), - BoundNetLog())); + EXPECT_EQ(ERR_IO_PENDING, + handle1.Init("a", params_, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, + callback1.callback(), pool_.get(), BoundNetLog())); ASSERT_TRUE(pool_->HasGroup("a")); EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); @@ -3207,12 +3007,10 @@ ClientSocketHandle handle2; TestCompletionCallback callback2; - EXPECT_EQ(ERR_IO_PENDING, handle2.Init("a", - params_, - DEFAULT_PRIORITY, - callback2.callback(), - pool_.get(), - BoundNetLog())); + EXPECT_EQ(ERR_IO_PENDING, + handle2.Init("a", params_, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, + callback2.callback(), pool_.get(), BoundNetLog())); EXPECT_EQ(2, pool_->NumConnectJobsInGroup("a")); EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); @@ -3235,30 +3033,24 @@ ClientSocketHandle handle1; TestCompletionCallback callback1; - EXPECT_EQ(ERR_IO_PENDING, handle1.Init("a", - params_, - DEFAULT_PRIORITY, - callback1.callback(), - pool_.get(), - BoundNetLog())); + EXPECT_EQ(ERR_IO_PENDING, + handle1.Init("a", params_, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, + callback1.callback(), pool_.get(), BoundNetLog())); ClientSocketHandle handle2; TestCompletionCallback callback2; - EXPECT_EQ(ERR_IO_PENDING, handle2.Init("a", - params_, - DEFAULT_PRIORITY, - callback2.callback(), - pool_.get(), - BoundNetLog())); + EXPECT_EQ(ERR_IO_PENDING, + handle2.Init("a", params_, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, + callback2.callback(), pool_.get(), BoundNetLog())); ClientSocketHandle handle3; TestCompletionCallback callback3; - EXPECT_EQ(ERR_IO_PENDING, handle3.Init("a", - params_, - DEFAULT_PRIORITY, - callback3.callback(), - pool_.get(), - BoundNetLog())); + EXPECT_EQ(ERR_IO_PENDING, + handle3.Init("a", params_, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, + callback3.callback(), pool_.get(), BoundNetLog())); ASSERT_TRUE(pool_->HasGroup("a")); EXPECT_EQ(3, pool_->NumConnectJobsInGroup("a")); @@ -3335,12 +3127,10 @@ ClientSocketHandle handle1; TestCompletionCallback callback1; - EXPECT_EQ(ERR_IO_PENDING, handle1.Init("a", - params_, - DEFAULT_PRIORITY, - callback1.callback(), - pool_.get(), - BoundNetLog())); + EXPECT_EQ(ERR_IO_PENDING, + handle1.Init("a", params_, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, + callback1.callback(), pool_.get(), BoundNetLog())); ASSERT_EQ(OK, callback1.WaitForResult()); handle1.Reset(); @@ -3362,12 +3152,10 @@ ClientSocketHandle handle1; TestCompletionCallback callback1; - EXPECT_EQ(ERR_IO_PENDING, handle1.Init("a", - params_, - DEFAULT_PRIORITY, - callback1.callback(), - pool_.get(), - BoundNetLog())); + EXPECT_EQ(ERR_IO_PENDING, + handle1.Init("a", params_, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, + callback1.callback(), pool_.get(), BoundNetLog())); ASSERT_EQ(OK, callback1.WaitForResult()); ASSERT_TRUE(pool_->HasGroup("a")); @@ -3439,22 +3227,17 @@ ClientSocketHandle handle1; TestCompletionCallback callback1; - EXPECT_EQ(ERR_IO_PENDING, handle1.Init("a", - params_, - DEFAULT_PRIORITY, - callback1.callback(), - pool_.get(), - BoundNetLog())); + EXPECT_EQ(ERR_IO_PENDING, + handle1.Init("a", params_, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, + callback1.callback(), pool_.get(), BoundNetLog())); ASSERT_EQ(OK, callback1.WaitForResult()); ClientSocketHandle handle2; TestCompletionCallback callback2; - int rv = handle2.Init("a", - params_, - DEFAULT_PRIORITY, - callback2.callback(), - pool_.get(), - BoundNetLog()); + int rv = handle2.Init("a", params_, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, + callback2.callback(), pool_.get(), BoundNetLog()); if (rv != OK) { EXPECT_EQ(ERR_IO_PENDING, rv); EXPECT_EQ(OK, callback2.WaitForResult()); @@ -3518,12 +3301,10 @@ ClientSocketHandle handle1; TestCompletionCallback callback1; - EXPECT_EQ(ERR_IO_PENDING, handle1.Init("a", - params_, - DEFAULT_PRIORITY, - callback1.callback(), - pool_.get(), - BoundNetLog())); + EXPECT_EQ(ERR_IO_PENDING, + handle1.Init("a", params_, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, + callback1.callback(), pool_.get(), BoundNetLog())); EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); @@ -3553,12 +3334,9 @@ ClientSocketHandle handle; TestCompletionCallback callback; - EXPECT_EQ(OK, handle.Init("a", - params_, - DEFAULT_PRIORITY, - callback.callback(), - pool_.get(), - BoundNetLog())); + EXPECT_EQ(OK, handle.Init("a", params_, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), pool_.get(), BoundNetLog())); // Make sure the idle socket was used. EXPECT_EQ(0, pool_->IdleSocketCountInGroup("a")); @@ -3581,12 +3359,10 @@ // Set up one idle socket in "a". ClientSocketHandle handle1; TestCompletionCallback callback1; - EXPECT_EQ(ERR_IO_PENDING, handle1.Init("a", - params_, - DEFAULT_PRIORITY, - callback1.callback(), - pool_.get(), - BoundNetLog())); + EXPECT_EQ(ERR_IO_PENDING, + handle1.Init("a", params_, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, + callback1.callback(), pool_.get(), BoundNetLog())); ASSERT_EQ(OK, callback1.WaitForResult()); handle1.Reset(); @@ -3595,18 +3371,14 @@ // Set up two active sockets in "b". ClientSocketHandle handle2; TestCompletionCallback callback2; - EXPECT_EQ(ERR_IO_PENDING, handle1.Init("b", - params_, - DEFAULT_PRIORITY, - callback1.callback(), - pool_.get(), - BoundNetLog())); - EXPECT_EQ(ERR_IO_PENDING, handle2.Init("b", - params_, - DEFAULT_PRIORITY, - callback2.callback(), - pool_.get(), - BoundNetLog())); + EXPECT_EQ(ERR_IO_PENDING, + handle1.Init("b", params_, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, + callback1.callback(), pool_.get(), BoundNetLog())); + EXPECT_EQ(ERR_IO_PENDING, + handle2.Init("b", params_, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, + callback2.callback(), pool_.get(), BoundNetLog())); ASSERT_EQ(OK, callback1.WaitForResult()); ASSERT_EQ(OK, callback2.WaitForResult()); @@ -3688,12 +3460,10 @@ connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); ClientSocketHandle handle; TestCompletionCallback callback; - EXPECT_EQ(ERR_IO_PENDING, handle.Init("a", - params_, - DEFAULT_PRIORITY, - callback.callback(), - pool_.get(), - BoundNetLog())); + EXPECT_EQ(ERR_IO_PENDING, + handle.Init("a", params_, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), pool_.get(), BoundNetLog())); // Timer has started, but the backup connect job shouldn't be created yet. EXPECT_EQ(1, pool_->NumConnectJobsInGroup("a")); EXPECT_EQ(0, pool_->NumUnassignedConnectJobsInGroup("a")); @@ -3727,12 +3497,9 @@ connect_job_factory_->set_job_type(TestConnectJob::kMockFailingJob); ClientSocketHandle handle; TestCompletionCallback callback; - EXPECT_EQ(OK, handle.Init("a", - params_, - DEFAULT_PRIORITY, - callback.callback(), - pool_.get(), - BoundNetLog())); + EXPECT_EQ(OK, handle.Init("a", params_, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), pool_.get(), BoundNetLog())); ASSERT_TRUE(pool_->HasGroup("a")); EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); @@ -3764,16 +3531,16 @@ } int RequestSocket(TestClientSocketPool* pool) { - scoped_refptr<TestSocketParams> params( - new TestSocketParams(false /* ignore_limits */)); + scoped_refptr<TestSocketParams> params(new TestSocketParams()); return handle_.Init(group_name_, params, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, callback_.callback(), pool, BoundNetLog()); } int RequestSocketWithoutLimits(TestClientSocketPool* pool) { - scoped_refptr<TestSocketParams> params( - new TestSocketParams(true /* ignore_limits */)); + scoped_refptr<TestSocketParams> params(new TestSocketParams()); return handle_.Init(group_name_, params, MAXIMUM_PRIORITY, + ClientSocketPool::RespectLimits::DISABLED, callback_.callback(), pool, BoundNetLog()); } @@ -3836,12 +3603,10 @@ &MockLayeredPool::ReleaseOneConnection)); ClientSocketHandle handle; TestCompletionCallback callback; - EXPECT_EQ(ERR_IO_PENDING, handle.Init("a", - params_, - DEFAULT_PRIORITY, - callback.callback(), - pool_.get(), - BoundNetLog())); + EXPECT_EQ(ERR_IO_PENDING, + handle.Init("a", params_, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), pool_.get(), BoundNetLog())); EXPECT_EQ(OK, callback.WaitForResult()); } @@ -3859,12 +3624,9 @@ // has the maximum number of connections already, it's not stalled). ClientSocketHandle handle1; TestCompletionCallback callback1; - EXPECT_EQ(OK, handle1.Init("group1", - params_, - DEFAULT_PRIORITY, - callback1.callback(), - pool_.get(), - BoundNetLog())); + EXPECT_EQ(OK, handle1.Init("group1", params_, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, + callback1.callback(), pool_.get(), BoundNetLog())); MockLayeredPool mock_layered_pool(pool_.get(), "group2"); EXPECT_EQ(OK, mock_layered_pool.RequestSocket(pool_.get())); @@ -3873,12 +3635,10 @@ &MockLayeredPool::ReleaseOneConnection)); ClientSocketHandle handle; TestCompletionCallback callback2; - EXPECT_EQ(ERR_IO_PENDING, handle.Init("group2", - params_, - DEFAULT_PRIORITY, - callback2.callback(), - pool_.get(), - BoundNetLog())); + EXPECT_EQ(ERR_IO_PENDING, + handle.Init("group2", params_, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, + callback2.callback(), pool_.get(), BoundNetLog())); EXPECT_EQ(OK, callback2.WaitForResult()); } @@ -3896,12 +3656,9 @@ ClientSocketHandle handle1; TestCompletionCallback callback1; - EXPECT_EQ(OK, handle1.Init("group1", - params_, - DEFAULT_PRIORITY, - callback1.callback(), - pool_.get(), - BoundNetLog())); + EXPECT_EQ(OK, handle1.Init("group1", params_, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, + callback1.callback(), pool_.get(), BoundNetLog())); MockLayeredPool mock_layered_pool(pool_.get(), "group2"); EXPECT_EQ(OK, mock_layered_pool.RequestSocket(pool_.get())); @@ -3913,12 +3670,10 @@ // The third request is made when the socket pool is in a stalled state. ClientSocketHandle handle3; TestCompletionCallback callback3; - EXPECT_EQ(ERR_IO_PENDING, handle3.Init("group3", - params_, - DEFAULT_PRIORITY, - callback3.callback(), - pool_.get(), - BoundNetLog())); + EXPECT_EQ(ERR_IO_PENDING, + handle3.Init("group3", params_, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, + callback3.callback(), pool_.get(), BoundNetLog())); base::RunLoop().RunUntilIdle(); EXPECT_FALSE(callback3.have_result()); @@ -3929,12 +3684,10 @@ mock_layered_pool.set_can_release_connection(true); ClientSocketHandle handle4; TestCompletionCallback callback4; - EXPECT_EQ(ERR_IO_PENDING, handle4.Init("group3", - params_, - DEFAULT_PRIORITY, - callback4.callback(), - pool_.get(), - BoundNetLog())); + EXPECT_EQ(ERR_IO_PENDING, + handle4.Init("group3", params_, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, + callback4.callback(), pool_.get(), BoundNetLog())); EXPECT_EQ(OK, callback3.WaitForResult()); EXPECT_FALSE(callback4.have_result()); @@ -3961,12 +3714,9 @@ ClientSocketHandle handle1; TestCompletionCallback callback1; - EXPECT_EQ(OK, handle1.Init("group1", - params_, - DEFAULT_PRIORITY, - callback1.callback(), - pool_.get(), - BoundNetLog())); + EXPECT_EQ(OK, handle1.Init("group1", params_, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, + callback1.callback(), pool_.get(), BoundNetLog())); MockLayeredPool mock_layered_pool(pool_.get(), "group2"); EXPECT_EQ(OK, mock_layered_pool.RequestSocket(pool_.get())); @@ -3978,12 +3728,10 @@ // The third request is made when the socket pool is in a stalled state. ClientSocketHandle handle3; TestCompletionCallback callback3; - EXPECT_EQ(ERR_IO_PENDING, handle3.Init("group3", - params_, - MEDIUM, - callback3.callback(), - pool_.get(), - BoundNetLog())); + EXPECT_EQ(ERR_IO_PENDING, + handle3.Init("group3", params_, MEDIUM, + ClientSocketPool::RespectLimits::ENABLED, + callback3.callback(), pool_.get(), BoundNetLog())); base::RunLoop().RunUntilIdle(); EXPECT_FALSE(callback3.have_result()); @@ -3993,12 +3741,10 @@ mock_layered_pool.set_can_release_connection(true); ClientSocketHandle handle4; TestCompletionCallback callback4; - EXPECT_EQ(ERR_IO_PENDING, handle4.Init("group3", - params_, - HIGHEST, - callback4.callback(), - pool_.get(), - BoundNetLog())); + EXPECT_EQ(ERR_IO_PENDING, + handle4.Init("group3", params_, HIGHEST, + ClientSocketPool::RespectLimits::ENABLED, + callback4.callback(), pool_.get(), BoundNetLog())); EXPECT_EQ(OK, callback4.WaitForResult()); EXPECT_FALSE(callback3.have_result()); @@ -4024,36 +3770,38 @@ &MockLayeredPool::ReleaseOneConnection)); ClientSocketHandle handle; TestCompletionCallback callback; - EXPECT_EQ(ERR_IO_PENDING, handle.Init("a", - params_, - DEFAULT_PRIORITY, - callback.callback(), - pool_.get(), - BoundNetLog())); + EXPECT_EQ(ERR_IO_PENDING, + handle.Init("a", params_, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), pool_.get(), BoundNetLog())); EXPECT_EQ(OK, callback.WaitForResult()); } // Test that when a socket pool and group are at their limits, a request -// with |ignore_limits| triggers creation of a new socket, and gets the socket -// instead of a request with the same priority that was issued earlier, but -// that does not have |ignore_limits| set. +// with RespectLimits::DISABLED triggers creation of a new socket, and gets the +// socket instead of a request with the same priority that was issued earlier, +// but has RespectLimits::ENABLED. TEST_F(ClientSocketPoolBaseTest, IgnoreLimits) { - scoped_refptr<TestSocketParams> params_ignore_limits( - new TestSocketParams(true /* ignore_limits */)); CreatePool(1, 1); // Issue a request to reach the socket pool limit. - EXPECT_EQ(OK, StartRequestWithParams("a", MAXIMUM_PRIORITY, params_)); + EXPECT_EQ( + OK, StartRequestWithIgnoreLimits( + "a", MAXIMUM_PRIORITY, ClientSocketPool::RespectLimits::ENABLED)); EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); - EXPECT_EQ(ERR_IO_PENDING, StartRequestWithParams("a", MAXIMUM_PRIORITY, - params_)); + EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits( + "a", MAXIMUM_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED)); EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); - EXPECT_EQ(ERR_IO_PENDING, StartRequestWithParams("a", MAXIMUM_PRIORITY, - params_ignore_limits)); + // Issue a request that ignores the limits, so a new ConnectJob is + // created. + EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits( + "a", MAXIMUM_PRIORITY, + ClientSocketPool::RespectLimits::DISABLED)); ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a")); EXPECT_EQ(OK, request(2)->WaitForResult()); @@ -4061,28 +3809,32 @@ } // Test that when a socket pool and group are at their limits, a ConnectJob -// issued for a request with |ignore_limits| set is not cancelled when a request -// without |ignore_limits| issued to the same group is cancelled. +// issued for a request with RespectLimits::DISABLED is not cancelled when a +// request with RespectLimits::ENABLED issued to the same group is cancelled. TEST_F(ClientSocketPoolBaseTest, IgnoreLimitsCancelOtherJob) { - scoped_refptr<TestSocketParams> params_ignore_limits( - new TestSocketParams(true /* ignore_limits */)); CreatePool(1, 1); // Issue a request to reach the socket pool limit. - EXPECT_EQ(OK, StartRequestWithParams("a", MAXIMUM_PRIORITY, params_)); + EXPECT_EQ( + OK, StartRequestWithIgnoreLimits( + "a", MAXIMUM_PRIORITY, ClientSocketPool::RespectLimits::ENABLED)); EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); connect_job_factory_->set_job_type(TestConnectJob::kMockPendingJob); - EXPECT_EQ(ERR_IO_PENDING, StartRequestWithParams("a", MAXIMUM_PRIORITY, - params_)); + EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits( + "a", MAXIMUM_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED)); EXPECT_EQ(0, pool_->NumConnectJobsInGroup("a")); - EXPECT_EQ(ERR_IO_PENDING, StartRequestWithParams("a", MAXIMUM_PRIORITY, - params_ignore_limits)); + // Issue a request with RespectLimits::DISABLED, so a new ConnectJob is + // created. + EXPECT_EQ(ERR_IO_PENDING, StartRequestWithIgnoreLimits( + "a", MAXIMUM_PRIORITY, + ClientSocketPool::RespectLimits::DISABLED)); ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a")); - // Cancel the pending request without ignore_limits set. The ConnectJob + // Cancel the pending request with RespectLimits::ENABLED. The ConnectJob // should not be cancelled. request(1)->handle()->Reset(); ASSERT_EQ(1, pool_->NumConnectJobsInGroup("a"));
diff --git a/net/socket/client_socket_pool_manager.cc b/net/socket/client_socket_pool_manager.cc index c053b1f4..dee8218 100644 --- a/net/socket/client_socket_pool_manager.cc +++ b/net/socket/client_socket_pool_manager.cc
@@ -14,6 +14,7 @@ #include "net/http/http_stream_factory.h" #include "net/proxy/proxy_info.h" #include "net/socket/client_socket_handle.h" +#include "net/socket/client_socket_pool.h" #include "net/socket/socks_client_socket_pool.h" #include "net/socket/ssl_client_socket_pool.h" #include "net/socket/transport_client_socket_pool.h" @@ -148,7 +149,10 @@ connection_group = prefix + connection_group; } - bool ignore_limits = (request_load_flags & LOAD_IGNORE_LIMITS) != 0; + ClientSocketPool::RespectLimits respect_limits = + ClientSocketPool::RespectLimits::ENABLED; + if ((request_load_flags & LOAD_IGNORE_LIMITS) != 0) + respect_limits = ClientSocketPool::RespectLimits::DISABLED; if (!proxy_info.is_direct()) { ProxyServer proxy_server = proxy_info.proxy_server(); proxy_host_port.reset(new HostPortPair(proxy_server.host_port_pair())); @@ -156,7 +160,6 @@ new TransportSocketParams( *proxy_host_port, disable_resolver_cache, - ignore_limits, resolution_callback, TransportSocketParams::COMBINE_CONNECT_AND_WRITE_DEFAULT)); @@ -175,7 +178,6 @@ TransportSocketParams::COMBINE_CONNECT_AND_WRITE_DEFAULT; proxy_tcp_params = new TransportSocketParams(*proxy_host_port, disable_resolver_cache, - ignore_limits, resolution_callback, combine_connect_and_write); // Set ssl_params, and unset proxy_tcp_params @@ -229,7 +231,6 @@ TransportSocketParams::COMBINE_CONNECT_AND_WRITE_DEFAULT; ssl_tcp_params = new TransportSocketParams(origin_host_port, disable_resolver_cache, - ignore_limits, resolution_callback, combine_connect_and_write); } @@ -250,9 +251,8 @@ return OK; } - return socket_handle->Init(connection_group, ssl_params, - request_priority, callback, ssl_pool, - net_log); + return socket_handle->Init(connection_group, ssl_params, request_priority, + respect_limits, callback, ssl_pool, net_log); } // Finally, get the connection started. @@ -267,8 +267,8 @@ } return socket_handle->Init(connection_group, http_proxy_params, - request_priority, callback, - pool, net_log); + request_priority, respect_limits, callback, pool, + net_log); } if (proxy_info.is_socks()) { @@ -280,9 +280,8 @@ return OK; } - return socket_handle->Init(connection_group, socks_params, - request_priority, callback, pool, - net_log); + return socket_handle->Init(connection_group, socks_params, request_priority, + respect_limits, callback, pool, net_log); } DCHECK(proxy_info.is_direct()); @@ -290,7 +289,6 @@ new TransportSocketParams( origin_host_port, disable_resolver_cache, - ignore_limits, resolution_callback, TransportSocketParams::COMBINE_CONNECT_AND_WRITE_DEFAULT); TransportClientSocketPool* pool = @@ -301,9 +299,8 @@ return OK; } - return socket_handle->Init(connection_group, tcp_params, - request_priority, callback, - pool, net_log); + return socket_handle->Init(connection_group, tcp_params, request_priority, + respect_limits, callback, pool, net_log); } } // namespace
diff --git a/net/socket/sequenced_socket_data_unittest.cc b/net/socket/sequenced_socket_data_unittest.cc index e8df554..c27fd615 100644 --- a/net/socket/sequenced_socket_data_unittest.cc +++ b/net/socket/sequenced_socket_data_unittest.cc
@@ -235,7 +235,6 @@ tcp_params_(new TransportSocketParams( endpoint_, false, - false, OnHostResolutionCallback(), TransportSocketParams::COMBINE_CONNECT_AND_WRITE_DEFAULT)), socket_pool_(10, 10, &socket_factory_), @@ -262,7 +261,8 @@ EXPECT_EQ(OK, connection_.Init( - endpoint_.ToString(), tcp_params_, LOWEST, CompletionCallback(), + endpoint_.ToString(), tcp_params_, LOWEST, + ClientSocketPool::RespectLimits::ENABLED, CompletionCallback(), reinterpret_cast<TransportClientSocketPool*>(&socket_pool_), BoundNetLog())); sock_ = connection_.socket();
diff --git a/net/socket/socket_test_util.cc b/net/socket/socket_test_util.cc index 095ebe83..072cbe0 100644 --- a/net/socket/socket_test_util.cc +++ b/net/socket/socket_test_util.cc
@@ -1611,9 +1611,13 @@ MockTransportClientSocketPool::~MockTransportClientSocketPool() {} int MockTransportClientSocketPool::RequestSocket( - const std::string& group_name, const void* socket_params, - RequestPriority priority, ClientSocketHandle* handle, - const CompletionCallback& callback, const BoundNetLog& net_log) { + const std::string& group_name, + const void* socket_params, + RequestPriority priority, + RespectLimits respect_limits, + ClientSocketHandle* handle, + const CompletionCallback& callback, + const BoundNetLog& net_log) { last_request_priority_ = priority; scoped_ptr<StreamSocket> socket = client_socket_factory_->CreateTransportClientSocket( @@ -1656,12 +1660,16 @@ MockSOCKSClientSocketPool::~MockSOCKSClientSocketPool() {} -int MockSOCKSClientSocketPool::RequestSocket( - const std::string& group_name, const void* socket_params, - RequestPriority priority, ClientSocketHandle* handle, - const CompletionCallback& callback, const BoundNetLog& net_log) { - return transport_pool_->RequestSocket( - group_name, socket_params, priority, handle, callback, net_log); +int MockSOCKSClientSocketPool::RequestSocket(const std::string& group_name, + const void* socket_params, + RequestPriority priority, + RespectLimits respect_limits, + ClientSocketHandle* handle, + const CompletionCallback& callback, + const BoundNetLog& net_log) { + return transport_pool_->RequestSocket(group_name, socket_params, priority, + respect_limits, handle, callback, + net_log); } void MockSOCKSClientSocketPool::CancelRequest(
diff --git a/net/socket/socket_test_util.h b/net/socket/socket_test_util.h index 90f7fda..3470b5d 100644 --- a/net/socket/socket_test_util.h +++ b/net/socket/socket_test_util.h
@@ -830,17 +830,15 @@ PoolType* socket_pool, const std::string& group_name, RequestPriority priority, + ClientSocketPool::RespectLimits respect_limits, const scoped_refptr<typename PoolType::SocketParams>& socket_params) { DCHECK(socket_pool); TestSocketRequest* request( new TestSocketRequest(&request_order_, &completion_count_)); requests_.push_back(make_scoped_ptr(request)); - int rv = request->handle()->Init(group_name, - socket_params, - priority, - request->callback(), - socket_pool, - BoundNetLog()); + int rv = request->handle()->Init(group_name, socket_params, priority, + respect_limits, request->callback(), + socket_pool, BoundNetLog()); if (rv != ERR_IO_PENDING) request_order_.push_back(request); return rv; @@ -924,6 +922,7 @@ int RequestSocket(const std::string& group_name, const void* socket_params, RequestPriority priority, + RespectLimits respect_limits, ClientSocketHandle* handle, const CompletionCallback& callback, const BoundNetLog& net_log) override; @@ -956,6 +955,7 @@ int RequestSocket(const std::string& group_name, const void* socket_params, RequestPriority priority, + RespectLimits respect_limits, ClientSocketHandle* handle, const CompletionCallback& callback, const BoundNetLog& net_log) override;
diff --git a/net/socket/socks_client_socket_pool.cc b/net/socket/socks_client_socket_pool.cc index 543c2c4..d7f97f3e 100644 --- a/net/socket/socks_client_socket_pool.cc +++ b/net/socket/socks_client_socket_pool.cc
@@ -27,10 +27,6 @@ : transport_params_(proxy_server), destination_(host_port_pair), socks_v5_(socks_v5) { - if (transport_params_.get()) - ignore_limits_ = transport_params_->ignore_limits(); - else - ignore_limits_ = false; } SOCKSSocketParams::~SOCKSSocketParams() {} @@ -42,20 +38,24 @@ SOCKSConnectJob::SOCKSConnectJob( const std::string& group_name, RequestPriority priority, + ClientSocketPool::RespectLimits respect_limits, const scoped_refptr<SOCKSSocketParams>& socks_params, const base::TimeDelta& timeout_duration, TransportClientSocketPool* transport_pool, HostResolver* host_resolver, Delegate* delegate, NetLog* net_log) - : ConnectJob(group_name, timeout_duration, priority, delegate, + : ConnectJob(group_name, + timeout_duration, + priority, + respect_limits, + delegate, BoundNetLog::Make(net_log, NetLog::SOURCE_CONNECT_JOB)), socks_params_(socks_params), transport_pool_(transport_pool), resolver_(host_resolver), - callback_(base::Bind(&SOCKSConnectJob::OnIOComplete, - base::Unretained(this))) { -} + callback_( + base::Bind(&SOCKSConnectJob::OnIOComplete, base::Unretained(this))) {} SOCKSConnectJob::~SOCKSConnectJob() { // We don't worry about cancelling the tcp socket since the destructor in @@ -118,12 +118,9 @@ int SOCKSConnectJob::DoTransportConnect() { next_state_ = STATE_TRANSPORT_CONNECT_COMPLETE; transport_socket_handle_.reset(new ClientSocketHandle()); - return transport_socket_handle_->Init(group_name(), - socks_params_->transport_params(), - priority(), - callback_, - transport_pool_, - net_log()); + return transport_socket_handle_->Init( + group_name(), socks_params_->transport_params(), priority(), + respect_limits(), callback_, transport_pool_, net_log()); } int SOCKSConnectJob::DoTransportConnectComplete(int result) { @@ -174,14 +171,10 @@ const std::string& group_name, const PoolBase::Request& request, ConnectJob::Delegate* delegate) const { - return scoped_ptr<ConnectJob>(new SOCKSConnectJob(group_name, - request.priority(), - request.params(), - ConnectionTimeout(), - transport_pool_, - host_resolver_, - delegate, - net_log_)); + return scoped_ptr<ConnectJob>(new SOCKSConnectJob( + group_name, request.priority(), request.respect_limits(), + request.params(), ConnectionTimeout(), transport_pool_, host_resolver_, + delegate, net_log_)); } base::TimeDelta @@ -212,15 +205,18 @@ SOCKSClientSocketPool::~SOCKSClientSocketPool() { } -int SOCKSClientSocketPool::RequestSocket( - const std::string& group_name, const void* socket_params, - RequestPriority priority, ClientSocketHandle* handle, - const CompletionCallback& callback, const BoundNetLog& net_log) { +int SOCKSClientSocketPool::RequestSocket(const std::string& group_name, + const void* socket_params, + RequestPriority priority, + RespectLimits respect_limits, + ClientSocketHandle* handle, + const CompletionCallback& callback, + const BoundNetLog& net_log) { const scoped_refptr<SOCKSSocketParams>* casted_socket_params = static_cast<const scoped_refptr<SOCKSSocketParams>*>(socket_params); return base_.RequestSocket(group_name, *casted_socket_params, priority, - handle, callback, net_log); + respect_limits, handle, callback, net_log); } void SOCKSClientSocketPool::RequestSockets(
diff --git a/net/socket/socks_client_socket_pool.h b/net/socket/socks_client_socket_pool.h index 8aaf726c..66d0e537 100644 --- a/net/socket/socks_client_socket_pool.h +++ b/net/socket/socks_client_socket_pool.h
@@ -34,7 +34,6 @@ } const HostResolver::RequestInfo& destination() const { return destination_; } bool is_socks_v5() const { return socks_v5_; } - bool ignore_limits() const { return ignore_limits_; } private: friend class base::RefCounted<SOCKSSocketParams>; @@ -45,7 +44,6 @@ // This is the HTTP destination. HostResolver::RequestInfo destination_; const bool socks_v5_; - bool ignore_limits_; DISALLOW_COPY_AND_ASSIGN(SOCKSSocketParams); }; @@ -56,6 +54,7 @@ public: SOCKSConnectJob(const std::string& group_name, RequestPriority priority, + ClientSocketPool::RespectLimits respect_limits, const scoped_refptr<SOCKSSocketParams>& params, const base::TimeDelta& timeout_duration, TransportClientSocketPool* transport_pool, @@ -121,6 +120,7 @@ int RequestSocket(const std::string& group_name, const void* connect_params, RequestPriority priority, + RespectLimits respect_limits, ClientSocketHandle* handle, const CompletionCallback& callback, const BoundNetLog& net_log) override;
diff --git a/net/socket/socks_client_socket_pool_unittest.cc b/net/socket/socks_client_socket_pool_unittest.cc index 587f1fa..5d16ce4 100644 --- a/net/socket/socks_client_socket_pool_unittest.cc +++ b/net/socket/socks_client_socket_pool_unittest.cc
@@ -43,7 +43,7 @@ scoped_refptr<TransportSocketParams> CreateProxyHostParams() { return new TransportSocketParams( - HostPortPair("proxy", 80), false, false, OnHostResolutionCallback(), + HostPortPair("proxy", 80), false, OnHostResolutionCallback(), TransportSocketParams::COMBINE_CONNECT_AND_WRITE_DEFAULT); } @@ -102,7 +102,8 @@ int StartRequestV5(const std::string& group_name, RequestPriority priority) { return test_base_.StartRequestUsingPool( - &pool_, group_name, priority, CreateSOCKSv5Params()); + &pool_, group_name, priority, ClientSocketPool::RespectLimits::ENABLED, + CreateSOCKSv5Params()); } int GetOrderOfRequest(size_t index) const { @@ -127,8 +128,9 @@ transport_client_socket_factory_.AddSocketDataProvider(data.data_provider()); ClientSocketHandle handle; - int rv = handle.Init("a", CreateSOCKSv5Params(), LOW, CompletionCallback(), - &pool_, BoundNetLog()); + int rv = handle.Init("a", CreateSOCKSv5Params(), LOW, + ClientSocketPool::RespectLimits::ENABLED, + CompletionCallback(), &pool_, BoundNetLog()); EXPECT_EQ(OK, rv); EXPECT_TRUE(handle.is_initialized()); EXPECT_TRUE(handle.socket()); @@ -146,9 +148,9 @@ data.data_provider()); ClientSocketHandle handle; - EXPECT_EQ(OK, - handle.Init("a", CreateSOCKSv5Params(), priority, - CompletionCallback(), &pool_, BoundNetLog())); + EXPECT_EQ(OK, handle.Init("a", CreateSOCKSv5Params(), priority, + ClientSocketPool::RespectLimits::ENABLED, + CompletionCallback(), &pool_, BoundNetLog())); EXPECT_EQ(priority, transport_socket_pool_.last_request_priority()); handle.socket()->Disconnect(); } @@ -167,6 +169,7 @@ ClientSocketHandle handle; EXPECT_EQ(ERR_IO_PENDING, handle.Init("a", CreateSOCKSv4Params(), priority, + ClientSocketPool::RespectLimits::ENABLED, CompletionCallback(), &pool_, BoundNetLog())); EXPECT_EQ(priority, transport_socket_pool_.last_request_priority()); EXPECT_EQ(priority, host_resolver_.last_request_priority()); @@ -180,8 +183,9 @@ TestCompletionCallback callback; ClientSocketHandle handle; - int rv = handle.Init("a", CreateSOCKSv5Params(), LOW, callback.callback(), - &pool_, BoundNetLog()); + int rv = handle.Init("a", CreateSOCKSv5Params(), LOW, + ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), &pool_, BoundNetLog()); EXPECT_EQ(ERR_IO_PENDING, rv); EXPECT_FALSE(handle.is_initialized()); EXPECT_FALSE(handle.socket()); @@ -199,8 +203,9 @@ transport_client_socket_factory_.AddSocketDataProvider(&socket_data); ClientSocketHandle handle; - int rv = handle.Init("a", CreateSOCKSv5Params(), LOW, CompletionCallback(), - &pool_, BoundNetLog()); + int rv = handle.Init("a", CreateSOCKSv5Params(), LOW, + ClientSocketPool::RespectLimits::ENABLED, + CompletionCallback(), &pool_, BoundNetLog()); EXPECT_EQ(ERR_PROXY_CONNECTION_FAILED, rv); EXPECT_FALSE(handle.is_initialized()); EXPECT_FALSE(handle.socket()); @@ -213,8 +218,9 @@ TestCompletionCallback callback; ClientSocketHandle handle; - int rv = handle.Init("a", CreateSOCKSv5Params(), LOW, callback.callback(), - &pool_, BoundNetLog()); + int rv = handle.Init("a", CreateSOCKSv5Params(), LOW, + ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), &pool_, BoundNetLog()); EXPECT_EQ(ERR_IO_PENDING, rv); EXPECT_FALSE(handle.is_initialized()); EXPECT_FALSE(handle.socket()); @@ -235,8 +241,9 @@ ClientSocketHandle handle; EXPECT_EQ(0, transport_socket_pool_.release_count()); - int rv = handle.Init("a", CreateSOCKSv5Params(), LOW, CompletionCallback(), - &pool_, BoundNetLog()); + int rv = handle.Init("a", CreateSOCKSv5Params(), LOW, + ClientSocketPool::RespectLimits::ENABLED, + CompletionCallback(), &pool_, BoundNetLog()); EXPECT_EQ(ERR_SOCKS_CONNECTION_FAILED, rv); EXPECT_FALSE(handle.is_initialized()); EXPECT_FALSE(handle.socket()); @@ -255,8 +262,9 @@ TestCompletionCallback callback; ClientSocketHandle handle; EXPECT_EQ(0, transport_socket_pool_.release_count()); - int rv = handle.Init("a", CreateSOCKSv5Params(), LOW, callback.callback(), - &pool_, BoundNetLog()); + int rv = handle.Init("a", CreateSOCKSv5Params(), LOW, + ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), &pool_, BoundNetLog()); EXPECT_EQ(ERR_IO_PENDING, rv); EXPECT_FALSE(handle.is_initialized()); EXPECT_FALSE(handle.socket());
diff --git a/net/socket/ssl_client_socket_pool.cc b/net/socket/ssl_client_socket_pool.cc index f9a4058..371ec00c 100644 --- a/net/socket/ssl_client_socket_pool.cc +++ b/net/socket/ssl_client_socket_pool.cc
@@ -45,19 +45,11 @@ ssl_config_(ssl_config), privacy_mode_(privacy_mode), load_flags_(load_flags), - expect_spdy_(expect_spdy), - ignore_limits_(false) { - if (direct_params_.get()) { - DCHECK(!socks_proxy_params_.get()); - DCHECK(!http_proxy_params_.get()); - ignore_limits_ = direct_params_->ignore_limits(); - } else if (socks_proxy_params_.get()) { - DCHECK(!http_proxy_params_.get()); - ignore_limits_ = socks_proxy_params_->ignore_limits(); - } else { - DCHECK(http_proxy_params_.get()); - ignore_limits_ = http_proxy_params_->ignore_limits(); - } + expect_spdy_(expect_spdy) { + // Only one set of lower level pool params should be non-NULL. + DCHECK((direct_params_ && !socks_proxy_params_ && !http_proxy_params_) || + (!direct_params_ && socks_proxy_params_ && !http_proxy_params_) || + (!direct_params_ && !socks_proxy_params_ && http_proxy_params_)); } SSLSocketParams::~SSLSocketParams() {} @@ -101,6 +93,7 @@ SSLConnectJob::SSLConnectJob(const std::string& group_name, RequestPriority priority, + ClientSocketPool::RespectLimits respect_limits, const scoped_refptr<SSLSocketParams>& params, const base::TimeDelta& timeout_duration, TransportClientSocketPool* transport_pool, @@ -113,6 +106,7 @@ : ConnectJob(group_name, timeout_duration, priority, + respect_limits, delegate, BoundNetLog::Make(net_log, NetLog::SOURCE_CONNECT_JOB)), params_(params), @@ -129,8 +123,7 @@ ? "pm/" + context.ssl_session_cache_shard : context.ssl_session_cache_shard)), callback_( - base::Bind(&SSLConnectJob::OnIOComplete, base::Unretained(this))) { -} + base::Bind(&SSLConnectJob::OnIOComplete, base::Unretained(this))) {} SSLConnectJob::~SSLConnectJob() { } @@ -232,7 +225,8 @@ scoped_refptr<TransportSocketParams> direct_params = params_->GetDirectConnectionParams(); return transport_socket_handle_->Init(group_name(), direct_params, priority(), - callback_, transport_pool_, net_log()); + respect_limits(), callback_, + transport_pool_, net_log()); } int SSLConnectJob::DoTransportConnectComplete(int result) { @@ -252,8 +246,8 @@ scoped_refptr<SOCKSSocketParams> socks_proxy_params = params_->GetSocksProxyConnectionParams(); return transport_socket_handle_->Init(group_name(), socks_proxy_params, - priority(), callback_, socks_pool_, - net_log()); + priority(), respect_limits(), callback_, + socks_pool_, net_log()); } int SSLConnectJob::DoSOCKSConnectComplete(int result) { @@ -271,8 +265,8 @@ scoped_refptr<HttpProxySocketParams> http_proxy_params = params_->GetHttpProxyConnectionParams(); return transport_socket_handle_->Init(group_name(), http_proxy_params, - priority(), callback_, http_proxy_pool_, - net_log()); + priority(), respect_limits(), callback_, + http_proxy_pool_, net_log()); } int SSLConnectJob::DoTunnelConnectComplete(int result) { @@ -558,17 +552,10 @@ const std::string& group_name, const PoolBase::Request& request, ConnectJob::Delegate* delegate) const { - return scoped_ptr<ConnectJob>(new SSLConnectJob(group_name, - request.priority(), - request.params(), - ConnectionTimeout(), - transport_pool_, - socks_pool_, - http_proxy_pool_, - client_socket_factory_, - context_, - delegate, - net_log_)); + return scoped_ptr<ConnectJob>(new SSLConnectJob( + group_name, request.priority(), request.respect_limits(), + request.params(), ConnectionTimeout(), transport_pool_, socks_pool_, + http_proxy_pool_, client_socket_factory_, context_, delegate, net_log_)); } base::TimeDelta SSLClientSocketPool::SSLConnectJobFactory::ConnectionTimeout() @@ -579,6 +566,7 @@ int SSLClientSocketPool::RequestSocket(const std::string& group_name, const void* socket_params, RequestPriority priority, + RespectLimits respect_limits, ClientSocketHandle* handle, const CompletionCallback& callback, const BoundNetLog& net_log) { @@ -586,7 +574,7 @@ static_cast<const scoped_refptr<SSLSocketParams>*>(socket_params); return base_.RequestSocket(group_name, *casted_socket_params, priority, - handle, callback, net_log); + respect_limits, handle, callback, net_log); } void SSLClientSocketPool::RequestSockets(
diff --git a/net/socket/ssl_client_socket_pool.h b/net/socket/ssl_client_socket_pool.h index b015baeb..d5f4807 100644 --- a/net/socket/ssl_client_socket_pool.h +++ b/net/socket/ssl_client_socket_pool.h
@@ -72,7 +72,6 @@ PrivacyMode privacy_mode() const { return privacy_mode_; } int load_flags() const { return load_flags_; } bool expect_spdy() const { return expect_spdy_; } - bool ignore_limits() const { return ignore_limits_; } private: friend class base::RefCounted<SSLSocketParams>; @@ -86,7 +85,6 @@ const PrivacyMode privacy_mode_; const int load_flags_; const bool expect_spdy_; - bool ignore_limits_; DISALLOW_COPY_AND_ASSIGN(SSLSocketParams); }; @@ -99,6 +97,7 @@ // job. SSLConnectJob(const std::string& group_name, RequestPriority priority, + ClientSocketPool::RespectLimits respect_limits, const scoped_refptr<SSLSocketParams>& params, const base::TimeDelta& timeout_duration, TransportClientSocketPool* transport_pool, @@ -205,6 +204,7 @@ int RequestSocket(const std::string& group_name, const void* connect_params, RequestPriority priority, + RespectLimits respect_limits, ClientSocketHandle* handle, const CompletionCallback& callback, const BoundNetLog& net_log) override;
diff --git a/net/socket/ssl_client_socket_pool_unittest.cc b/net/socket/ssl_client_socket_pool_unittest.cc index 2baae896..7b518f4 100644 --- a/net/socket/ssl_client_socket_pool_unittest.cc +++ b/net/socket/ssl_client_socket_pool_unittest.cc
@@ -87,7 +87,6 @@ direct_transport_socket_params_(new TransportSocketParams( HostPortPair("host", 443), false, - false, OnHostResolutionCallback(), TransportSocketParams::COMBINE_CONNECT_AND_WRITE_DEFAULT)), transport_socket_pool_(kMaxSockets, @@ -96,7 +95,6 @@ proxy_transport_socket_params_(new TransportSocketParams( HostPortPair("proxy", 443), false, - false, OnHostResolutionCallback(), TransportSocketParams::COMBINE_CONNECT_AND_WRITE_DEFAULT)), socks_socket_params_( @@ -217,8 +215,9 @@ false); ClientSocketHandle handle; - int rv = handle.Init("a", params, MEDIUM, CompletionCallback(), pool_.get(), - BoundNetLog()); + int rv = + handle.Init("a", params, MEDIUM, ClientSocketPool::RespectLimits::ENABLED, + CompletionCallback(), pool_.get(), BoundNetLog()); EXPECT_EQ(ERR_CONNECTION_FAILED, rv); EXPECT_FALSE(handle.is_initialized()); EXPECT_FALSE(handle.socket()); @@ -238,8 +237,9 @@ ClientSocketHandle handle; TestCompletionCallback callback; - int rv = handle.Init( - "a", params, MEDIUM, callback.callback(), pool_.get(), BoundNetLog()); + int rv = + handle.Init("a", params, MEDIUM, ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), pool_.get(), BoundNetLog()); EXPECT_EQ(ERR_IO_PENDING, rv); EXPECT_FALSE(handle.is_initialized()); EXPECT_FALSE(handle.socket()); @@ -265,8 +265,9 @@ ClientSocketHandle handle; TestCompletionCallback callback; - int rv = handle.Init( - "a", params, MEDIUM, callback.callback(), pool_.get(), BoundNetLog()); + int rv = + handle.Init("a", params, MEDIUM, ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), pool_.get(), BoundNetLog()); EXPECT_EQ(OK, rv); EXPECT_TRUE(handle.is_initialized()); EXPECT_TRUE(handle.socket()); @@ -291,8 +292,9 @@ ClientSocketHandle handle; TestCompletionCallback callback; - EXPECT_EQ(OK, handle.Init("a", params, priority, callback.callback(), - pool_.get(), BoundNetLog())); + EXPECT_EQ(OK, handle.Init("a", params, priority, + ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), pool_.get(), BoundNetLog())); EXPECT_EQ(priority, transport_socket_pool_.last_request_priority()); handle.socket()->Disconnect(); } @@ -310,8 +312,9 @@ ClientSocketHandle handle; TestCompletionCallback callback; - int rv = handle.Init( - "a", params, MEDIUM, callback.callback(), pool_.get(), BoundNetLog()); + int rv = + handle.Init("a", params, MEDIUM, ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), pool_.get(), BoundNetLog()); EXPECT_EQ(ERR_IO_PENDING, rv); EXPECT_FALSE(handle.is_initialized()); EXPECT_FALSE(handle.socket()); @@ -334,8 +337,9 @@ ClientSocketHandle handle; TestCompletionCallback callback; - int rv = handle.Init( - "a", params, MEDIUM, callback.callback(), pool_.get(), BoundNetLog()); + int rv = + handle.Init("a", params, MEDIUM, ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), pool_.get(), BoundNetLog()); EXPECT_EQ(ERR_IO_PENDING, rv); EXPECT_FALSE(handle.is_initialized()); EXPECT_FALSE(handle.socket()); @@ -358,8 +362,9 @@ ClientSocketHandle handle; TestCompletionCallback callback; - int rv = handle.Init( - "a", params, MEDIUM, callback.callback(), pool_.get(), BoundNetLog()); + int rv = + handle.Init("a", params, MEDIUM, ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), pool_.get(), BoundNetLog()); EXPECT_EQ(ERR_IO_PENDING, rv); EXPECT_FALSE(handle.is_initialized()); EXPECT_FALSE(handle.socket()); @@ -383,8 +388,9 @@ ClientSocketHandle handle; TestCompletionCallback callback; - int rv = handle.Init( - "a", params, MEDIUM, callback.callback(), pool_.get(), BoundNetLog()); + int rv = + handle.Init("a", params, MEDIUM, ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), pool_.get(), BoundNetLog()); EXPECT_EQ(ERR_IO_PENDING, rv); EXPECT_FALSE(handle.is_initialized()); EXPECT_FALSE(handle.socket()); @@ -410,8 +416,9 @@ ClientSocketHandle handle; TestCompletionCallback callback; - int rv = handle.Init( - "a", params, MEDIUM, callback.callback(), pool_.get(), BoundNetLog()); + int rv = + handle.Init("a", params, MEDIUM, ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), pool_.get(), BoundNetLog()); EXPECT_EQ(ERR_IO_PENDING, rv); EXPECT_FALSE(handle.is_initialized()); EXPECT_FALSE(handle.socket()); @@ -435,8 +442,9 @@ ClientSocketHandle handle; TestCompletionCallback callback; - int rv = handle.Init( - "a", params, MEDIUM, callback.callback(), pool_.get(), BoundNetLog()); + int rv = + handle.Init("a", params, MEDIUM, ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), pool_.get(), BoundNetLog()); EXPECT_EQ(ERR_IO_PENDING, rv); EXPECT_FALSE(handle.is_initialized()); EXPECT_FALSE(handle.socket()); @@ -466,8 +474,9 @@ ClientSocketHandle handle; TestCompletionCallback callback; - int rv = handle.Init( - "a", params, MEDIUM, callback.callback(), pool_.get(), BoundNetLog()); + int rv = + handle.Init("a", params, MEDIUM, ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), pool_.get(), BoundNetLog()); EXPECT_EQ(ERR_IO_PENDING, rv); EXPECT_FALSE(handle.is_initialized()); EXPECT_FALSE(handle.socket()); @@ -495,8 +504,9 @@ ClientSocketHandle handle; TestCompletionCallback callback; - int rv = handle.Init( - "a", params, MEDIUM, callback.callback(), pool_.get(), BoundNetLog()); + int rv = + handle.Init("a", params, MEDIUM, ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), pool_.get(), BoundNetLog()); EXPECT_EQ(ERR_CONNECTION_FAILED, rv); EXPECT_FALSE(handle.is_initialized()); EXPECT_FALSE(handle.socket()); @@ -514,8 +524,9 @@ ClientSocketHandle handle; TestCompletionCallback callback; - int rv = handle.Init( - "a", params, MEDIUM, callback.callback(), pool_.get(), BoundNetLog()); + int rv = + handle.Init("a", params, MEDIUM, ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), pool_.get(), BoundNetLog()); EXPECT_EQ(ERR_IO_PENDING, rv); EXPECT_FALSE(handle.is_initialized()); EXPECT_FALSE(handle.socket()); @@ -539,8 +550,9 @@ ClientSocketHandle handle; TestCompletionCallback callback; - int rv = handle.Init( - "a", params, MEDIUM, callback.callback(), pool_.get(), BoundNetLog()); + int rv = + handle.Init("a", params, MEDIUM, ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), pool_.get(), BoundNetLog()); EXPECT_EQ(OK, rv); EXPECT_TRUE(handle.is_initialized()); EXPECT_TRUE(handle.socket()); @@ -564,8 +576,9 @@ ClientSocketHandle handle; TestCompletionCallback callback; - EXPECT_EQ(OK, handle.Init("a", params, HIGHEST, callback.callback(), - pool_.get(), BoundNetLog())); + EXPECT_EQ(OK, handle.Init("a", params, HIGHEST, + ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), pool_.get(), BoundNetLog())); EXPECT_EQ(HIGHEST, transport_socket_pool_.last_request_priority()); } @@ -581,8 +594,9 @@ ClientSocketHandle handle; TestCompletionCallback callback; - int rv = handle.Init( - "a", params, MEDIUM, callback.callback(), pool_.get(), BoundNetLog()); + int rv = + handle.Init("a", params, MEDIUM, ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), pool_.get(), BoundNetLog()); EXPECT_EQ(ERR_IO_PENDING, rv); EXPECT_FALSE(handle.is_initialized()); EXPECT_FALSE(handle.socket()); @@ -606,8 +620,9 @@ ClientSocketHandle handle; TestCompletionCallback callback; - int rv = handle.Init( - "a", params, MEDIUM, callback.callback(), pool_.get(), BoundNetLog()); + int rv = + handle.Init("a", params, MEDIUM, ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), pool_.get(), BoundNetLog()); EXPECT_EQ(ERR_PROXY_CONNECTION_FAILED, rv); EXPECT_FALSE(handle.is_initialized()); EXPECT_FALSE(handle.socket()); @@ -625,8 +640,9 @@ ClientSocketHandle handle; TestCompletionCallback callback; - int rv = handle.Init( - "a", params, MEDIUM, callback.callback(), pool_.get(), BoundNetLog()); + int rv = + handle.Init("a", params, MEDIUM, ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), pool_.get(), BoundNetLog()); EXPECT_EQ(ERR_IO_PENDING, rv); EXPECT_FALSE(handle.is_initialized()); EXPECT_FALSE(handle.socket()); @@ -662,8 +678,9 @@ ClientSocketHandle handle; TestCompletionCallback callback; - int rv = handle.Init( - "a", params, MEDIUM, callback.callback(), pool_.get(), BoundNetLog()); + int rv = + handle.Init("a", params, MEDIUM, ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), pool_.get(), BoundNetLog()); EXPECT_EQ(OK, rv); EXPECT_TRUE(handle.is_initialized()); EXPECT_TRUE(handle.socket()); @@ -697,8 +714,9 @@ ClientSocketHandle handle; TestCompletionCallback callback; - EXPECT_EQ(OK, handle.Init("a", params, HIGHEST, callback.callback(), - pool_.get(), BoundNetLog())); + EXPECT_EQ(OK, handle.Init("a", params, HIGHEST, + ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), pool_.get(), BoundNetLog())); EXPECT_EQ(HIGHEST, transport_socket_pool_.last_request_priority()); } @@ -726,8 +744,9 @@ ClientSocketHandle handle; TestCompletionCallback callback; - int rv = handle.Init( - "a", params, MEDIUM, callback.callback(), pool_.get(), BoundNetLog()); + int rv = + handle.Init("a", params, MEDIUM, ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), pool_.get(), BoundNetLog()); EXPECT_EQ(ERR_IO_PENDING, rv); EXPECT_FALSE(handle.is_initialized()); EXPECT_FALSE(handle.socket()); @@ -763,8 +782,9 @@ ClientSocketHandle handle; TestCompletionCallback callback; - int rv = handle.Init( - "a", params, MEDIUM, callback.callback(), pool_.get(), BoundNetLog()); + int rv = + handle.Init("a", params, MEDIUM, ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), pool_.get(), BoundNetLog()); EXPECT_EQ(ERR_IO_PENDING, rv); EXPECT_FALSE(handle.is_initialized()); EXPECT_FALSE(handle.socket());
diff --git a/net/socket/transport_client_socket_pool.cc b/net/socket/transport_client_socket_pool.cc index 0949193..94f97c2 100644 --- a/net/socket/transport_client_socket_pool.cc +++ b/net/socket/transport_client_socket_pool.cc
@@ -61,11 +61,9 @@ TransportSocketParams::TransportSocketParams( const HostPortPair& host_port_pair, bool disable_resolver_cache, - bool ignore_limits, const OnHostResolutionCallback& host_resolution_callback, CombineConnectAndWritePolicy combine_connect_and_write_if_supported) : destination_(host_port_pair), - ignore_limits_(ignore_limits), host_resolution_callback_(host_resolution_callback), combine_connect_and_write_(combine_connect_and_write_if_supported) { if (disable_resolver_cache) @@ -196,6 +194,7 @@ TransportConnectJob::TransportConnectJob( const std::string& group_name, RequestPriority priority, + ClientSocketPool::RespectLimits respect_limits, const scoped_refptr<TransportSocketParams>& params, base::TimeDelta timeout_duration, ClientSocketFactory* client_socket_factory, @@ -205,6 +204,7 @@ : ConnectJob(group_name, timeout_duration, priority, + respect_limits, delegate, BoundNetLog::Make(net_log, NetLog::SOURCE_CONNECT_JOB)), helper_(params, client_socket_factory, host_resolver, &connect_timing_), @@ -487,15 +487,10 @@ const std::string& group_name, const PoolBase::Request& request, ConnectJob::Delegate* delegate) const { - return scoped_ptr<ConnectJob>( - new TransportConnectJob(group_name, - request.priority(), - request.params(), - ConnectionTimeout(), - client_socket_factory_, - host_resolver_, - delegate, - net_log_)); + return scoped_ptr<ConnectJob>(new TransportConnectJob( + group_name, request.priority(), request.respect_limits(), + request.params(), ConnectionTimeout(), client_socket_factory_, + host_resolver_, delegate, net_log_)); } base::TimeDelta @@ -523,20 +518,20 @@ TransportClientSocketPool::~TransportClientSocketPool() {} -int TransportClientSocketPool::RequestSocket( - const std::string& group_name, - const void* params, - RequestPriority priority, - ClientSocketHandle* handle, - const CompletionCallback& callback, - const BoundNetLog& net_log) { +int TransportClientSocketPool::RequestSocket(const std::string& group_name, + const void* params, + RequestPriority priority, + RespectLimits respect_limits, + ClientSocketHandle* handle, + const CompletionCallback& callback, + const BoundNetLog& net_log) { const scoped_refptr<TransportSocketParams>* casted_params = static_cast<const scoped_refptr<TransportSocketParams>*>(params); NetLogTcpClientSocketPoolRequestedSocket(net_log, casted_params); - return base_.RequestSocket(group_name, *casted_params, priority, handle, - callback, net_log); + return base_.RequestSocket(group_name, *casted_params, priority, + respect_limits, handle, callback, net_log); } void TransportClientSocketPool::NetLogTcpClientSocketPoolRequestedSocket(
diff --git a/net/socket/transport_client_socket_pool.h b/net/socket/transport_client_socket_pool.h index 07a67b5..085fbb9 100644 --- a/net/socket/transport_client_socket_pool.h +++ b/net/socket/transport_client_socket_pool.h
@@ -50,12 +50,10 @@ TransportSocketParams( const HostPortPair& host_port_pair, bool disable_resolver_cache, - bool ignore_limits, const OnHostResolutionCallback& host_resolution_callback, CombineConnectAndWritePolicy combine_connect_and_write); const HostResolver::RequestInfo& destination() const { return destination_; } - bool ignore_limits() const { return ignore_limits_; } const OnHostResolutionCallback& host_resolution_callback() const { return host_resolution_callback_; } @@ -69,7 +67,6 @@ ~TransportSocketParams(); HostResolver::RequestInfo destination_; - bool ignore_limits_; const OnHostResolutionCallback host_resolution_callback_; CombineConnectAndWritePolicy combine_connect_and_write_; @@ -158,6 +155,7 @@ public: TransportConnectJob(const std::string& group_name, RequestPriority priority, + ClientSocketPool::RespectLimits respect_limits, const scoped_refptr<TransportSocketParams>& params, base::TimeDelta timeout_duration, ClientSocketFactory* client_socket_factory, @@ -241,6 +239,7 @@ int RequestSocket(const std::string& group_name, const void* resolve_info, RequestPriority priority, + RespectLimits respect_limits, ClientSocketHandle* handle, const CompletionCallback& callback, const BoundNetLog& net_log) override;
diff --git a/net/socket/transport_client_socket_pool_unittest.cc b/net/socket/transport_client_socket_pool_unittest.cc index dab0d076..aeab2b1 100644 --- a/net/socket/transport_client_socket_pool_unittest.cc +++ b/net/socket/transport_client_socket_pool_unittest.cc
@@ -43,7 +43,6 @@ new TransportSocketParams( HostPortPair("www.google.com", 80), false, - false, OnHostResolutionCallback(), TransportSocketParams::COMBINE_CONNECT_AND_WRITE_DEFAULT)), host_resolver_(new MockHostResolver), @@ -61,18 +60,18 @@ } scoped_refptr<TransportSocketParams> CreateParamsForTCPFastOpen() { - return new TransportSocketParams(HostPortPair("www.google.com", 80), - false, false, OnHostResolutionCallback(), - TransportSocketParams::COMBINE_CONNECT_AND_WRITE_DESIRED); + return new TransportSocketParams( + HostPortPair("www.google.com", 80), false, OnHostResolutionCallback(), + TransportSocketParams::COMBINE_CONNECT_AND_WRITE_DESIRED); } int StartRequest(const std::string& group_name, RequestPriority priority) { scoped_refptr<TransportSocketParams> params(new TransportSocketParams( - HostPortPair("www.google.com", 80), false, false, - OnHostResolutionCallback(), + HostPortPair("www.google.com", 80), false, OnHostResolutionCallback(), TransportSocketParams::COMBINE_CONNECT_AND_WRITE_DEFAULT)); return test_base_.StartRequestUsingPool( - &pool_, group_name, priority, params); + &pool_, group_name, priority, ClientSocketPool::RespectLimits::ENABLED, + params); } int GetOrderOfRequest(size_t index) { @@ -178,8 +177,9 @@ TEST_F(TransportClientSocketPoolTest, Basic) { TestCompletionCallback callback; ClientSocketHandle handle; - int rv = handle.Init("a", params_, LOW, callback.callback(), &pool_, - BoundNetLog()); + int rv = + handle.Init("a", params_, LOW, ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), &pool_, BoundNetLog()); EXPECT_EQ(ERR_IO_PENDING, rv); EXPECT_FALSE(handle.is_initialized()); EXPECT_FALSE(handle.socket()); @@ -199,8 +199,9 @@ TestCompletionCallback callback; ClientSocketHandle handle; EXPECT_EQ(ERR_IO_PENDING, - handle.Init("a", params_, priority, callback.callback(), &pool_, - BoundNetLog())); + handle.Init("a", params_, priority, + ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), &pool_, BoundNetLog())); EXPECT_EQ(priority, host_resolver_->last_request_priority()); } } @@ -211,11 +212,12 @@ ClientSocketHandle handle; HostPortPair host_port_pair("unresolvable.host.name", 80); scoped_refptr<TransportSocketParams> dest(new TransportSocketParams( - host_port_pair, false, false, OnHostResolutionCallback(), + host_port_pair, false, OnHostResolutionCallback(), TransportSocketParams::COMBINE_CONNECT_AND_WRITE_DEFAULT)); EXPECT_EQ(ERR_IO_PENDING, - handle.Init("a", dest, kDefaultPriority, callback.callback(), - &pool_, BoundNetLog())); + handle.Init("a", dest, kDefaultPriority, + ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), &pool_, BoundNetLog())); EXPECT_EQ(ERR_NAME_NOT_RESOLVED, callback.WaitForResult()); ASSERT_EQ(1u, handle.connection_attempts().size()); EXPECT_TRUE(handle.connection_attempts()[0].endpoint.address().empty()); @@ -228,8 +230,9 @@ TestCompletionCallback callback; ClientSocketHandle handle; EXPECT_EQ(ERR_IO_PENDING, - handle.Init("a", params_, kDefaultPriority, callback.callback(), - &pool_, BoundNetLog())); + handle.Init("a", params_, kDefaultPriority, + ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), &pool_, BoundNetLog())); EXPECT_EQ(ERR_CONNECTION_FAILED, callback.WaitForResult()); ASSERT_EQ(1u, handle.connection_attempts().size()); EXPECT_EQ("127.0.0.1:80", @@ -239,8 +242,9 @@ // Make the host resolutions complete synchronously this time. host_resolver_->set_synchronous_mode(true); EXPECT_EQ(ERR_CONNECTION_FAILED, - handle.Init("a", params_, kDefaultPriority, callback.callback(), - &pool_, BoundNetLog())); + handle.Init("a", params_, kDefaultPriority, + ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), &pool_, BoundNetLog())); ASSERT_EQ(1u, handle.connection_attempts().size()); EXPECT_EQ("127.0.0.1:80", handle.connection_attempts()[0].endpoint.ToString()); @@ -350,8 +354,9 @@ TestCompletionCallback callback; ClientSocketHandle handle; EXPECT_EQ(ERR_IO_PENDING, - handle.Init("a", params_, kDefaultPriority, callback.callback(), - &pool_, BoundNetLog())); + handle.Init("a", params_, kDefaultPriority, + ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), &pool_, BoundNetLog())); handle.Reset(); } @@ -362,11 +367,13 @@ TestCompletionCallback callback2; EXPECT_EQ(ERR_IO_PENDING, - handle.Init("a", params_, kDefaultPriority, callback.callback(), - &pool_, BoundNetLog())); + handle.Init("a", params_, kDefaultPriority, + ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), &pool_, BoundNetLog())); EXPECT_EQ(ERR_IO_PENDING, - handle2.Init("a", params_, kDefaultPriority, callback2.callback(), - &pool_, BoundNetLog())); + handle2.Init("a", params_, kDefaultPriority, + ClientSocketPool::RespectLimits::ENABLED, + callback2.callback(), &pool_, BoundNetLog())); handle.Reset(); @@ -380,15 +387,17 @@ ClientSocketHandle handle; TestCompletionCallback callback; EXPECT_EQ(ERR_IO_PENDING, - handle.Init("a", params_, kDefaultPriority, callback.callback(), - &pool_, BoundNetLog())); + handle.Init("a", params_, kDefaultPriority, + ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), &pool_, BoundNetLog())); handle.Reset(); TestCompletionCallback callback2; EXPECT_EQ(ERR_IO_PENDING, - handle.Init("a", params_, kDefaultPriority, callback2.callback(), - &pool_, BoundNetLog())); + handle.Init("a", params_, kDefaultPriority, + ClientSocketPool::RespectLimits::ENABLED, + callback2.callback(), &pool_, BoundNetLog())); host_resolver_->set_synchronous_mode(true); // At this point, handle has two ConnectingSockets out for it. Due to the @@ -497,11 +506,11 @@ } within_callback_ = true; scoped_refptr<TransportSocketParams> dest(new TransportSocketParams( - HostPortPair("www.google.com", 80), false, false, - OnHostResolutionCallback(), + HostPortPair("www.google.com", 80), false, OnHostResolutionCallback(), TransportSocketParams::COMBINE_CONNECT_AND_WRITE_DEFAULT)); - int rv = handle_->Init("a", dest, LOWEST, callback(), pool_, - BoundNetLog()); + int rv = handle_->Init("a", dest, LOWEST, + ClientSocketPool::RespectLimits::ENABLED, + callback(), pool_, BoundNetLog()); EXPECT_EQ(OK, rv); } } @@ -518,11 +527,11 @@ ClientSocketHandle handle; RequestSocketCallback callback(&handle, &pool_); scoped_refptr<TransportSocketParams> dest(new TransportSocketParams( - HostPortPair("www.google.com", 80), false, false, - OnHostResolutionCallback(), + HostPortPair("www.google.com", 80), false, OnHostResolutionCallback(), TransportSocketParams::COMBINE_CONNECT_AND_WRITE_DEFAULT)); - int rv = handle.Init("a", dest, LOWEST, callback.callback(), &pool_, - BoundNetLog()); + int rv = + handle.Init("a", dest, LOWEST, ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), &pool_, BoundNetLog()); ASSERT_EQ(ERR_IO_PENDING, rv); // The callback is going to request "www.google.com". We want it to complete @@ -584,8 +593,9 @@ TEST_F(TransportClientSocketPoolTest, IdleSocketLoadTiming) { TestCompletionCallback callback; ClientSocketHandle handle; - int rv = handle.Init("a", params_, LOW, callback.callback(), &pool_, - BoundNetLog()); + int rv = + handle.Init("a", params_, LOW, ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), &pool_, BoundNetLog()); EXPECT_EQ(ERR_IO_PENDING, rv); EXPECT_FALSE(handle.is_initialized()); EXPECT_FALSE(handle.socket()); @@ -602,8 +612,8 @@ // Now we should have 1 idle socket. EXPECT_EQ(1, pool_.IdleSocketCount()); - rv = handle.Init("a", params_, LOW, callback.callback(), &pool_, - BoundNetLog()); + rv = handle.Init("a", params_, LOW, ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), &pool_, BoundNetLog()); EXPECT_EQ(OK, rv); EXPECT_EQ(0, pool_.IdleSocketCount()); TestLoadTimingInfoConnectedReused(handle); @@ -612,8 +622,9 @@ TEST_F(TransportClientSocketPoolTest, ResetIdleSocketsOnIPAddressChange) { TestCompletionCallback callback; ClientSocketHandle handle; - int rv = handle.Init("a", params_, LOW, callback.callback(), &pool_, - BoundNetLog()); + int rv = + handle.Init("a", params_, LOW, ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), &pool_, BoundNetLog()); EXPECT_EQ(ERR_IO_PENDING, rv); EXPECT_FALSE(handle.is_initialized()); EXPECT_FALSE(handle.socket()); @@ -668,8 +679,9 @@ TestCompletionCallback callback; ClientSocketHandle handle; - int rv = handle.Init("b", params_, LOW, callback.callback(), &pool_, - BoundNetLog()); + int rv = + handle.Init("b", params_, LOW, ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), &pool_, BoundNetLog()); EXPECT_EQ(ERR_IO_PENDING, rv); EXPECT_FALSE(handle.is_initialized()); EXPECT_FALSE(handle.socket()); @@ -710,8 +722,9 @@ TestCompletionCallback callback; ClientSocketHandle handle; - int rv = handle.Init("c", params_, LOW, callback.callback(), &pool_, - BoundNetLog()); + int rv = + handle.Init("c", params_, LOW, ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), &pool_, BoundNetLog()); EXPECT_EQ(ERR_IO_PENDING, rv); EXPECT_FALSE(handle.is_initialized()); EXPECT_FALSE(handle.socket()); @@ -756,8 +769,9 @@ TestCompletionCallback callback; ClientSocketHandle handle; - int rv = handle.Init("b", params_, LOW, callback.callback(), &pool_, - BoundNetLog()); + int rv = + handle.Init("b", params_, LOW, ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), &pool_, BoundNetLog()); EXPECT_EQ(ERR_IO_PENDING, rv); EXPECT_FALSE(handle.is_initialized()); EXPECT_FALSE(handle.socket()); @@ -806,8 +820,9 @@ TestCompletionCallback callback; ClientSocketHandle handle; - int rv = handle.Init("b", params_, LOW, callback.callback(), &pool_, - BoundNetLog()); + int rv = + handle.Init("b", params_, LOW, ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), &pool_, BoundNetLog()); EXPECT_EQ(ERR_IO_PENDING, rv); EXPECT_FALSE(handle.is_initialized()); EXPECT_FALSE(handle.socket()); @@ -863,8 +878,9 @@ TestCompletionCallback callback; ClientSocketHandle handle; - int rv = handle.Init("a", params_, LOW, callback.callback(), &pool, - BoundNetLog()); + int rv = + handle.Init("a", params_, LOW, ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), &pool, BoundNetLog()); EXPECT_EQ(ERR_IO_PENDING, rv); EXPECT_FALSE(handle.is_initialized()); EXPECT_FALSE(handle.socket()); @@ -915,8 +931,9 @@ TestCompletionCallback callback; ClientSocketHandle handle; - int rv = handle.Init("a", params_, LOW, callback.callback(), &pool, - BoundNetLog()); + int rv = + handle.Init("a", params_, LOW, ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), &pool, BoundNetLog()); EXPECT_EQ(ERR_IO_PENDING, rv); EXPECT_FALSE(handle.is_initialized()); EXPECT_FALSE(handle.socket()); @@ -957,8 +974,9 @@ TestCompletionCallback callback; ClientSocketHandle handle; - int rv = handle.Init("a", params_, LOW, callback.callback(), &pool, - BoundNetLog()); + int rv = + handle.Init("a", params_, LOW, ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), &pool, BoundNetLog()); EXPECT_EQ(ERR_IO_PENDING, rv); EXPECT_FALSE(handle.is_initialized()); EXPECT_FALSE(handle.socket()); @@ -990,8 +1008,9 @@ TestCompletionCallback callback; ClientSocketHandle handle; - int rv = handle.Init("a", params_, LOW, callback.callback(), &pool, - BoundNetLog()); + int rv = + handle.Init("a", params_, LOW, ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), &pool, BoundNetLog()); EXPECT_EQ(ERR_IO_PENDING, rv); EXPECT_FALSE(handle.is_initialized()); EXPECT_FALSE(handle.socket()); @@ -1025,7 +1044,8 @@ ClientSocketHandle handle; // Enable TCP FastOpen in TransportSocketParams. scoped_refptr<TransportSocketParams> params = CreateParamsForTCPFastOpen(); - handle.Init("a", params, LOW, callback.callback(), &pool, BoundNetLog()); + handle.Init("a", params, LOW, ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), &pool, BoundNetLog()); EXPECT_EQ(OK, callback.WaitForResult()); EXPECT_TRUE(handle.socket()->UsingTCPFastOpen()); } @@ -1050,7 +1070,8 @@ ClientSocketHandle handle; // Enable TCP FastOpen in TransportSocketParams. scoped_refptr<TransportSocketParams> params = CreateParamsForTCPFastOpen(); - handle.Init("a", params, LOW, callback.callback(), &pool, BoundNetLog()); + handle.Init("a", params, LOW, ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), &pool, BoundNetLog()); EXPECT_EQ(OK, callback.WaitForResult()); EXPECT_TRUE(handle.socket()->UsingTCPFastOpen()); } @@ -1083,7 +1104,8 @@ ClientSocketHandle handle; // Enable TCP FastOpen in TransportSocketParams. scoped_refptr<TransportSocketParams> params = CreateParamsForTCPFastOpen(); - handle.Init("a", params, LOW, callback.callback(), &pool, BoundNetLog()); + handle.Init("a", params, LOW, ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), &pool, BoundNetLog()); EXPECT_EQ(OK, callback.WaitForResult()); // Verify that the socket used is connected to the fallback IPv4 address. IPEndPoint endpoint; @@ -1122,7 +1144,8 @@ ClientSocketHandle handle; // Enable TCP FastOpen in TransportSocketParams. scoped_refptr<TransportSocketParams> params = CreateParamsForTCPFastOpen(); - handle.Init("a", params, LOW, callback.callback(), &pool, BoundNetLog()); + handle.Init("a", params, LOW, ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), &pool, BoundNetLog()); EXPECT_EQ(OK, callback.WaitForResult()); // Verify that the socket used is connected to the IPv6 address. IPEndPoint endpoint;
diff --git a/net/socket/websocket_transport_client_socket_pool.cc b/net/socket/websocket_transport_client_socket_pool.cc index 73d8599b0..983afaf 100644 --- a/net/socket/websocket_transport_client_socket_pool.cc +++ b/net/socket/websocket_transport_client_socket_pool.cc
@@ -39,6 +39,7 @@ WebSocketTransportConnectJob::WebSocketTransportConnectJob( const std::string& group_name, RequestPriority priority, + ClientSocketPool::RespectLimits respect_limits, const scoped_refptr<TransportSocketParams>& params, TimeDelta timeout_duration, const CompletionCallback& callback, @@ -51,6 +52,7 @@ : ConnectJob(group_name, timeout_duration, priority, + respect_limits, delegate, BoundNetLog::Make(pool_net_log, NetLog::SOURCE_CONNECT_JOB)), helper_(params, client_socket_factory, host_resolver, &connect_timing_), @@ -272,6 +274,7 @@ const std::string& group_name, const void* params, RequestPriority priority, + RespectLimits respect_limits, ClientSocketHandle* handle, const CompletionCallback& callback, const BoundNetLog& request_net_log) { @@ -286,7 +289,8 @@ request_net_log.BeginEvent(NetLog::TYPE_SOCKET_POOL); - if (ReachedMaxSocketsLimit() && !casted_params->ignore_limits()) { + if (ReachedMaxSocketsLimit() && + respect_limits == ClientSocketPool::RespectLimits::ENABLED) { request_net_log.AddEvent(NetLog::TYPE_SOCKET_POOL_STALLED_MAX_SOCKETS); // TODO(ricea): Use emplace_back when C++11 becomes allowed. StalledRequest request( @@ -306,17 +310,10 @@ } scoped_ptr<WebSocketTransportConnectJob> connect_job( - new WebSocketTransportConnectJob(group_name, - priority, - casted_params, - ConnectionTimeout(), - callback, - client_socket_factory_, - host_resolver_, - handle, - &connect_job_delegate_, - pool_net_log_, - request_net_log)); + new WebSocketTransportConnectJob( + group_name, priority, respect_limits, casted_params, + ConnectionTimeout(), callback, client_socket_factory_, host_resolver_, + handle, &connect_job_delegate_, pool_net_log_, request_net_log)); int rv = connect_job->Connect(); // Regardless of the outcome of |connect_job|, it will always be bound to @@ -589,12 +586,11 @@ StalledRequest request(stalled_request_queue_.front()); stalled_request_queue_.pop_front(); stalled_request_map_.erase(request.handle); - int rv = RequestSocket("ignored", - &request.params, - request.priority, - request.handle, - request.callback, - request.net_log); + int rv = RequestSocket("ignored", &request.params, request.priority, + // Stalled requests can't have |respect_limits| + // DISABLED. + RespectLimits::ENABLED, request.handle, + request.callback, request.net_log); // ActivateStalledRequest() never returns synchronously, so it is never // called re-entrantly. if (rv != ERR_IO_PENDING)
diff --git a/net/socket/websocket_transport_client_socket_pool.h b/net/socket/websocket_transport_client_socket_pool.h index c0f1351..6374374 100644 --- a/net/socket/websocket_transport_client_socket_pool.h +++ b/net/socket/websocket_transport_client_socket_pool.h
@@ -43,6 +43,7 @@ WebSocketTransportConnectJob( const std::string& group_name, RequestPriority priority, + ClientSocketPool::RespectLimits respect_limits, const scoped_refptr<TransportSocketParams>& params, base::TimeDelta timeout_duration, const CompletionCallback& callback, @@ -134,6 +135,7 @@ int RequestSocket(const std::string& group_name, const void* resolve_info, RequestPriority priority, + RespectLimits respect_limits, ClientSocketHandle* handle, const CompletionCallback& callback, const BoundNetLog& net_log) override;
diff --git a/net/socket/websocket_transport_client_socket_pool_unittest.cc b/net/socket/websocket_transport_client_socket_pool_unittest.cc index 96aa84a9..e45dcc2a 100644 --- a/net/socket/websocket_transport_client_socket_pool_unittest.cc +++ b/net/socket/websocket_transport_client_socket_pool_unittest.cc
@@ -55,7 +55,6 @@ : params_(new TransportSocketParams( HostPortPair("www.google.com", 80), false, - false, OnHostResolutionCallback(), TransportSocketParams::COMBINE_CONNECT_AND_WRITE_DEFAULT)), host_resolver_(new MockHostResolver), @@ -81,11 +80,11 @@ new TransportSocketParams( HostPortPair("www.google.com", 80), false, - false, OnHostResolutionCallback(), TransportSocketParams::COMBINE_CONNECT_AND_WRITE_DEFAULT)); return test_base_.StartRequestUsingPool( - &pool_, group_name, priority, params); + &pool_, group_name, priority, ClientSocketPool::RespectLimits::ENABLED, + params); } int GetOrderOfRequest(size_t index) { @@ -122,8 +121,9 @@ TEST_F(WebSocketTransportClientSocketPoolTest, Basic) { TestCompletionCallback callback; ClientSocketHandle handle; - int rv = handle.Init( - "a", params_, LOW, callback.callback(), &pool_, BoundNetLog()); + int rv = + handle.Init("a", params_, LOW, ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), &pool_, BoundNetLog()); EXPECT_EQ(ERR_IO_PENDING, rv); EXPECT_FALSE(handle.is_initialized()); EXPECT_FALSE(handle.socket()); @@ -142,12 +142,9 @@ TestCompletionCallback callback; ClientSocketHandle handle; EXPECT_EQ(ERR_IO_PENDING, - handle.Init("a", - params_, - priority, - callback.callback(), - &pool_, - BoundNetLog())); + handle.Init("a", params_, priority, + ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), &pool_, BoundNetLog())); EXPECT_EQ(priority, host_resolver_->last_request_priority()); } } @@ -158,15 +155,12 @@ ClientSocketHandle handle; HostPortPair host_port_pair("unresolvable.host.name", 80); scoped_refptr<TransportSocketParams> dest(new TransportSocketParams( - host_port_pair, false, false, OnHostResolutionCallback(), + host_port_pair, false, OnHostResolutionCallback(), TransportSocketParams::COMBINE_CONNECT_AND_WRITE_DEFAULT)); EXPECT_EQ(ERR_IO_PENDING, - handle.Init("a", - dest, - kDefaultPriority, - callback.callback(), - &pool_, - BoundNetLog())); + handle.Init("a", dest, kDefaultPriority, + ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), &pool_, BoundNetLog())); EXPECT_EQ(ERR_NAME_NOT_RESOLVED, callback.WaitForResult()); } @@ -176,23 +170,17 @@ TestCompletionCallback callback; ClientSocketHandle handle; EXPECT_EQ(ERR_IO_PENDING, - handle.Init("a", - params_, - kDefaultPriority, - callback.callback(), - &pool_, - BoundNetLog())); + handle.Init("a", params_, kDefaultPriority, + ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), &pool_, BoundNetLog())); EXPECT_EQ(ERR_CONNECTION_FAILED, callback.WaitForResult()); // Make the host resolutions complete synchronously this time. host_resolver_->set_synchronous_mode(true); EXPECT_EQ(ERR_CONNECTION_FAILED, - handle.Init("a", - params_, - kDefaultPriority, - callback.callback(), - &pool_, - BoundNetLog())); + handle.Init("a", params_, kDefaultPriority, + ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), &pool_, BoundNetLog())); } TEST_F(WebSocketTransportClientSocketPoolTest, PendingRequestsFinishFifo) { @@ -267,12 +255,9 @@ TestCompletionCallback callback; ClientSocketHandle handle; EXPECT_EQ(ERR_IO_PENDING, - handle.Init("a", - params_, - kDefaultPriority, - callback.callback(), - &pool_, - BoundNetLog())); + handle.Init("a", params_, kDefaultPriority, + ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), &pool_, BoundNetLog())); handle.Reset(); } @@ -283,19 +268,13 @@ TestCompletionCallback callback2; EXPECT_EQ(ERR_IO_PENDING, - handle.Init("a", - params_, - kDefaultPriority, - callback.callback(), - &pool_, - BoundNetLog())); + handle.Init("a", params_, kDefaultPriority, + ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), &pool_, BoundNetLog())); EXPECT_EQ(ERR_IO_PENDING, - handle2.Init("a", - params_, - kDefaultPriority, - callback2.callback(), - &pool_, - BoundNetLog())); + handle2.Init("a", params_, kDefaultPriority, + ClientSocketPool::RespectLimits::ENABLED, + callback2.callback(), &pool_, BoundNetLog())); handle.Reset(); @@ -309,23 +288,17 @@ ClientSocketHandle handle; TestCompletionCallback callback; EXPECT_EQ(ERR_IO_PENDING, - handle.Init("a", - params_, - kDefaultPriority, - callback.callback(), - &pool_, - BoundNetLog())); + handle.Init("a", params_, kDefaultPriority, + ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), &pool_, BoundNetLog())); handle.Reset(); TestCompletionCallback callback2; EXPECT_EQ(ERR_IO_PENDING, - handle.Init("a", - params_, - kDefaultPriority, - callback2.callback(), - &pool_, - BoundNetLog())); + handle.Init("a", params_, kDefaultPriority, + ClientSocketPool::RespectLimits::ENABLED, + callback2.callback(), &pool_, BoundNetLog())); host_resolver_->set_synchronous_mode(true); // At this point, handle has two ConnectingSockets out for it. Due to the @@ -395,11 +368,11 @@ handle->Reset(); scoped_refptr<TransportSocketParams> dest(new TransportSocketParams( - HostPortPair("www.google.com", 80), false, false, - OnHostResolutionCallback(), + HostPortPair("www.google.com", 80), false, OnHostResolutionCallback(), TransportSocketParams::COMBINE_CONNECT_AND_WRITE_DEFAULT)); int rv = - handle->Init("a", dest, LOWEST, nested_callback, pool, BoundNetLog()); + handle->Init("a", dest, LOWEST, ClientSocketPool::RespectLimits::ENABLED, + nested_callback, pool, BoundNetLog()); EXPECT_EQ(ERR_IO_PENDING, rv); if (ERR_IO_PENDING != rv) nested_callback.Run(rv); @@ -414,14 +387,14 @@ new TransportSocketParams( HostPortPair("www.google.com", 80), false, - false, OnHostResolutionCallback(), TransportSocketParams::COMBINE_CONNECT_AND_WRITE_DEFAULT)); TestCompletionCallback second_result_callback; - int rv = handle.Init("a", dest, LOWEST, - base::Bind(&RequestSocketOnComplete, &handle, &pool_, - second_result_callback.callback()), - &pool_, BoundNetLog()); + int rv = + handle.Init("a", dest, LOWEST, ClientSocketPool::RespectLimits::ENABLED, + base::Bind(&RequestSocketOnComplete, &handle, &pool_, + second_result_callback.callback()), + &pool_, BoundNetLog()); ASSERT_EQ(ERR_IO_PENDING, rv); EXPECT_EQ(OK, second_result_callback.WaitForResult()); @@ -492,8 +465,9 @@ TEST_F(WebSocketTransportClientSocketPoolTest, LockReleasedOnHandleDelete) { TestCompletionCallback callback; scoped_ptr<ClientSocketHandle> handle(new ClientSocketHandle); - int rv = handle->Init( - "a", params_, LOW, callback.callback(), &pool_, BoundNetLog()); + int rv = + handle->Init("a", params_, LOW, ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), &pool_, BoundNetLog()); EXPECT_EQ(ERR_IO_PENDING, rv); EXPECT_EQ(ERR_IO_PENDING, StartRequest("a", kDefaultPriority)); @@ -560,7 +534,8 @@ TestCompletionCallback callback; ClientSocketHandle handle; int rv = - handle.Init("a", params_, LOW, callback.callback(), &pool, BoundNetLog()); + handle.Init("a", params_, LOW, ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), &pool, BoundNetLog()); EXPECT_EQ(ERR_IO_PENDING, rv); EXPECT_FALSE(handle.is_initialized()); EXPECT_FALSE(handle.socket()); @@ -602,7 +577,8 @@ TestCompletionCallback callback; ClientSocketHandle handle; int rv = - handle.Init("a", params_, LOW, callback.callback(), &pool, BoundNetLog()); + handle.Init("a", params_, LOW, ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), &pool, BoundNetLog()); EXPECT_EQ(ERR_IO_PENDING, rv); EXPECT_FALSE(handle.is_initialized()); EXPECT_FALSE(handle.socket()); @@ -634,7 +610,8 @@ TestCompletionCallback callback; ClientSocketHandle handle; int rv = - handle.Init("a", params_, LOW, callback.callback(), &pool, BoundNetLog()); + handle.Init("a", params_, LOW, ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), &pool, BoundNetLog()); EXPECT_EQ(ERR_IO_PENDING, rv); EXPECT_FALSE(handle.is_initialized()); EXPECT_FALSE(handle.socket()); @@ -664,7 +641,8 @@ TestCompletionCallback callback; ClientSocketHandle handle; int rv = - handle.Init("a", params_, LOW, callback.callback(), &pool, BoundNetLog()); + handle.Init("a", params_, LOW, ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), &pool, BoundNetLog()); EXPECT_EQ(ERR_IO_PENDING, rv); EXPECT_FALSE(handle.is_initialized()); EXPECT_FALSE(handle.socket()); @@ -705,7 +683,8 @@ TestCompletionCallback callback; ClientSocketHandle handle; int rv = - handle.Init("a", params_, LOW, callback.callback(), &pool, BoundNetLog()); + handle.Init("a", params_, LOW, ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), &pool, BoundNetLog()); EXPECT_EQ(OK, rv); ASSERT_TRUE(handle.socket()); @@ -741,7 +720,8 @@ TestCompletionCallback callback; ClientSocketHandle handle; int rv = - handle.Init("a", params_, LOW, callback.callback(), &pool, BoundNetLog()); + handle.Init("a", params_, LOW, ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), &pool, BoundNetLog()); EXPECT_EQ(ERR_IO_PENDING, rv); EXPECT_FALSE(handle.socket()); @@ -777,7 +757,8 @@ TestCompletionCallback callback; ClientSocketHandle handle; int rv = - handle.Init("a", params_, LOW, callback.callback(), &pool, BoundNetLog()); + handle.Init("a", params_, LOW, ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), &pool, BoundNetLog()); EXPECT_EQ(ERR_IO_PENDING, rv); ASSERT_FALSE(handle.socket()); @@ -829,7 +810,8 @@ ClientSocketHandle handle; base::TimeTicks start(base::TimeTicks::Now()); int rv = - handle.Init("a", params_, LOW, callback.callback(), &pool, BoundNetLog()); + handle.Init("a", params_, LOW, ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), &pool, BoundNetLog()); EXPECT_EQ(ERR_IO_PENDING, rv); EXPECT_EQ(ERR_CONNECTION_FAILED, callback.WaitForResult()); @@ -866,7 +848,8 @@ ClientSocketHandle handle; int rv = - handle.Init("a", params_, LOW, callback.callback(), &pool, BoundNetLog()); + handle.Init("a", params_, LOW, ClientSocketPool::RespectLimits::ENABLED, + callback.callback(), &pool, BoundNetLog()); EXPECT_EQ(ERR_IO_PENDING, rv); EXPECT_EQ(ERR_TIMED_OUT, callback.WaitForResult());
diff --git a/net/spdy/spdy_session_unittest.cc b/net/spdy/spdy_session_unittest.cc index dda8d949..10901fa 100644 --- a/net/spdy/spdy_session_unittest.cc +++ b/net/spdy/spdy_session_unittest.cc
@@ -3186,13 +3186,13 @@ // post a task asynchronously to try and close the session. TestCompletionCallback callback2; HostPortPair host_port2("2.com", 80); - scoped_refptr<TransportSocketParams> params2( - new TransportSocketParams( - host_port2, false, false, OnHostResolutionCallback(), - TransportSocketParams::COMBINE_CONNECT_AND_WRITE_DEFAULT)); + scoped_refptr<TransportSocketParams> params2(new TransportSocketParams( + host_port2, false, OnHostResolutionCallback(), + TransportSocketParams::COMBINE_CONNECT_AND_WRITE_DEFAULT)); scoped_ptr<ClientSocketHandle> connection2(new ClientSocketHandle); EXPECT_EQ(ERR_IO_PENDING, connection2->Init(host_port2.ToString(), params2, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, callback2.callback(), pool, BoundNetLog())); EXPECT_TRUE(pool->IsStalled()); @@ -3261,13 +3261,13 @@ // post a task asynchronously to try and close the session. TestCompletionCallback callback3; HostPortPair host_port3("3.com", 80); - scoped_refptr<TransportSocketParams> params3( - new TransportSocketParams( - host_port3, false, false, OnHostResolutionCallback(), - TransportSocketParams::COMBINE_CONNECT_AND_WRITE_DEFAULT)); + scoped_refptr<TransportSocketParams> params3(new TransportSocketParams( + host_port3, false, OnHostResolutionCallback(), + TransportSocketParams::COMBINE_CONNECT_AND_WRITE_DEFAULT)); scoped_ptr<ClientSocketHandle> connection3(new ClientSocketHandle); EXPECT_EQ(ERR_IO_PENDING, connection3->Init(host_port3.ToString(), params3, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, callback3.callback(), pool, BoundNetLog())); EXPECT_TRUE(pool->IsStalled()); @@ -3342,13 +3342,13 @@ // post a task asynchronously to try and close the session. TestCompletionCallback callback2; HostPortPair host_port2("2.com", 80); - scoped_refptr<TransportSocketParams> params2( - new TransportSocketParams( - host_port2, false, false, OnHostResolutionCallback(), - TransportSocketParams::COMBINE_CONNECT_AND_WRITE_DEFAULT)); + scoped_refptr<TransportSocketParams> params2(new TransportSocketParams( + host_port2, false, OnHostResolutionCallback(), + TransportSocketParams::COMBINE_CONNECT_AND_WRITE_DEFAULT)); scoped_ptr<ClientSocketHandle> connection2(new ClientSocketHandle); EXPECT_EQ(ERR_IO_PENDING, connection2->Init(host_port2.ToString(), params2, DEFAULT_PRIORITY, + ClientSocketPool::RespectLimits::ENABLED, callback2.callback(), pool, BoundNetLog())); EXPECT_TRUE(pool->IsStalled());
diff --git a/net/spdy/spdy_test_util_common.cc b/net/spdy/spdy_test_util_common.cc index 48ce695..292cc1f 100644 --- a/net/spdy/spdy_test_util_common.cc +++ b/net/spdy/spdy_test_util_common.cc
@@ -503,7 +503,7 @@ scoped_refptr<TransportSocketParams> transport_params( new TransportSocketParams( - key.host_port_pair(), false, false, OnHostResolutionCallback(), + key.host_port_pair(), false, OnHostResolutionCallback(), TransportSocketParams::COMBINE_CONNECT_AND_WRITE_DEFAULT)); scoped_ptr<ClientSocketHandle> connection(new ClientSocketHandle); @@ -521,17 +521,14 @@ key.privacy_mode(), 0, false)); - rv = connection->Init(key.host_port_pair().ToString(), - ssl_params, - MEDIUM, - callback.callback(), - http_session->GetSSLSocketPool( - HttpNetworkSession::NORMAL_SOCKET_POOL), - net_log); + rv = connection->Init( + key.host_port_pair().ToString(), ssl_params, MEDIUM, + ClientSocketPool::RespectLimits::ENABLED, callback.callback(), + http_session->GetSSLSocketPool(HttpNetworkSession::NORMAL_SOCKET_POOL), + net_log); } else { - rv = connection->Init(key.host_port_pair().ToString(), - transport_params, - MEDIUM, + rv = connection->Init(key.host_port_pair().ToString(), transport_params, + MEDIUM, ClientSocketPool::RespectLimits::ENABLED, callback.callback(), http_session->GetTransportSocketPool( HttpNetworkSession::NORMAL_SOCKET_POOL),
diff --git a/net/websockets/websocket_basic_stream_test.cc b/net/websockets/websocket_basic_stream_test.cc index d7796d3..f60a105 100644 --- a/net/websockets/websocket_basic_stream_test.cc +++ b/net/websockets/websocket_basic_stream_test.cc
@@ -128,12 +128,9 @@ scoped_ptr<ClientSocketHandle> transport_socket(new ClientSocketHandle); scoped_refptr<MockTransportSocketParams> params; - transport_socket->Init("a", - params, - MEDIUM, - CompletionCallback(), - &pool_, - bound_net_log_.bound()); + transport_socket->Init( + "a", params, MEDIUM, ClientSocketPool::RespectLimits::ENABLED, + CompletionCallback(), &pool_, bound_net_log_.bound()); return transport_socket; }
diff --git a/net/websockets/websocket_handshake_stream_create_helper_test.cc b/net/websockets/websocket_handshake_stream_create_helper_test.cc index ffdbfe2..6a8499c 100644 --- a/net/websockets/websocket_handshake_stream_create_helper_test.cc +++ b/net/websockets/websocket_handshake_stream_create_helper_test.cc
@@ -41,13 +41,9 @@ const std::string& return_to_read) { socket_factory_maker_.SetExpectations(expect_written, return_to_read); scoped_ptr<ClientSocketHandle> socket_handle(new ClientSocketHandle); - socket_handle->Init( - "a", - scoped_refptr<MockTransportSocketParams>(), - MEDIUM, - CompletionCallback(), - &pool_, - BoundNetLog()); + socket_handle->Init("a", scoped_refptr<MockTransportSocketParams>(), MEDIUM, + ClientSocketPool::RespectLimits::ENABLED, + CompletionCallback(), &pool_, BoundNetLog()); return socket_handle; }
diff --git a/ppapi/tests/test_file_chooser.cc b/ppapi/tests/test_file_chooser.cc index 58addc5..dbacc0b6 100644 --- a/ppapi/tests/test_file_chooser.cc +++ b/ppapi/tests/test_file_chooser.cc
@@ -35,6 +35,7 @@ RUN_TEST(SaveAsCancel, filter); RUN_TEST(SaveAsDangerousExecutableAllowed, filter); RUN_TEST(SaveAsDangerousExecutableDisallowed, filter); + RUN_TEST(SaveAsDangerousExtensionListDisallowed, filter); } bool TestFileChooser::WriteDefaultContentsToFile(const pp::FileRef& file_ref) { @@ -197,3 +198,24 @@ ASSERT_EQ(0u, output_ref.size()); PASS(); } + +// Checks that a dangerous file is not allowed to be downloaded via the +// FileChooser_Trusted API. Chrome should delegate the decision of which files +// are allowed over to SafeBrowsing (if enabled), and the current SafeBrowsing +// configuration should disallow downloading of dangerous files for this test to +// work. +std::string TestFileChooser::TestSaveAsDangerousExtensionListDisallowed() { + pp::FileChooser_Trusted file_chooser(instance(), PP_FILECHOOSERMODE_OPEN, + ".txt,.exe", true /* save_as */, + "innocuous.txt"); + ASSERT_FALSE(file_chooser.is_null()); + + TestCompletionCallbackWithOutput<std::vector<pp::FileRef>> + filechooser_callback(instance_->pp_instance(), callback_type()); + filechooser_callback.WaitForResult( + file_chooser.Show(filechooser_callback.GetCallback())); + + const std::vector<pp::FileRef>& output_ref = filechooser_callback.output(); + ASSERT_EQ(0u, output_ref.size()); + PASS(); +}
diff --git a/ppapi/tests/test_file_chooser.h b/ppapi/tests/test_file_chooser.h index 1b44f61..bb2399b3 100644 --- a/ppapi/tests/test_file_chooser.h +++ b/ppapi/tests/test_file_chooser.h
@@ -31,6 +31,7 @@ std::string TestSaveAsCancel(); std::string TestSaveAsDangerousExecutableAllowed(); std::string TestSaveAsDangerousExecutableDisallowed(); + std::string TestSaveAsDangerousExtensionListDisallowed(); }; #endif // PPAPI_TESTS_TEST_FILE_CHOOSER_H_
diff --git a/printing/pdf_metafile_skia.cc b/printing/pdf_metafile_skia.cc index 04a8c40f..1a60b5b2 100644 --- a/printing/pdf_metafile_skia.cc +++ b/printing/pdf_metafile_skia.cc
@@ -15,6 +15,7 @@ #include "base/time/time.h" #include "printing/print_settings.h" #include "skia/ext/refptr.h" +#include "third_party/skia/include/core/SkCanvas.h" #include "third_party/skia/include/core/SkData.h" #include "third_party/skia/include/core/SkDocument.h" #include "third_party/skia/include/core/SkPictureRecorder.h" @@ -114,7 +115,7 @@ NULL, 0); } -skia::PlatformCanvas* PdfMetafileSkia::GetVectorCanvasForNewPage( +SkCanvas* PdfMetafileSkia::GetVectorCanvasForNewPage( const gfx::Size& page_size, const gfx::Rect& content_area, const float& scale_factor) {
diff --git a/printing/pdf_metafile_skia.h b/printing/pdf_metafile_skia.h index cd92d618..aa5acd7 100644 --- a/printing/pdf_metafile_skia.h +++ b/printing/pdf_metafile_skia.h
@@ -75,13 +75,13 @@ // This method calls StartPage and then returns an appropriate // PlatformCanvas implementation bound to the context created by - // StartPage or NULL on error. The skia::PlatformCanvas pointer that + // StartPage or NULL on error. The SkCanvas pointer that // is returned is owned by this PdfMetafileSkia object and does not // need to be ref()ed or unref()ed. The canvas will remain valid // until FinishPage() or FinishDocument() is called. - skia::PlatformCanvas* GetVectorCanvasForNewPage(const gfx::Size& page_size, - const gfx::Rect& content_area, - const float& scale_factor); + SkCanvas* GetVectorCanvasForNewPage(const gfx::Size& page_size, + const gfx::Rect& content_area, + const float& scale_factor); private: scoped_ptr<PdfMetafileSkiaData> data_;
diff --git a/remoting/test/fake_port_allocator.cc b/remoting/test/fake_port_allocator.cc index 65d9047..49db553 100644 --- a/remoting/test/fake_port_allocator.cc +++ b/remoting/test/fake_port_allocator.cc
@@ -46,8 +46,10 @@ FakePortAllocator::FakePortAllocator( rtc::NetworkManager* network_manager, - rtc::PacketSocketFactory* socket_factory) - : BasicPortAllocator(network_manager, socket_factory) { + rtc::PacketSocketFactory* socket_factory, + scoped_refptr<protocol::TransportContext> transport_context) + : BasicPortAllocator(network_manager, socket_factory), + transport_context_(transport_context) { set_flags(cricket::PORTALLOCATOR_DISABLE_TCP | cricket::PORTALLOCATOR_ENABLE_SHARED_UFRAG | cricket::PORTALLOCATOR_ENABLE_IPV6 | @@ -78,8 +80,8 @@ scoped_ptr<cricket::PortAllocator> FakePortAllocatorFactory::CreatePortAllocator( scoped_refptr<protocol::TransportContext> transport_context) { - return make_scoped_ptr( - new FakePortAllocator(network_manager_.get(), socket_factory_.get())); + return make_scoped_ptr(new FakePortAllocator( + network_manager_.get(), socket_factory_.get(), transport_context)); } } // namespace remoting
diff --git a/remoting/test/fake_port_allocator.h b/remoting/test/fake_port_allocator.h index ed2e095..cc5e6ebb 100644 --- a/remoting/test/fake_port_allocator.h +++ b/remoting/test/fake_port_allocator.h
@@ -20,8 +20,10 @@ class FakePortAllocator : public cricket::BasicPortAllocator { public: - FakePortAllocator(rtc::NetworkManager* network_manager, - rtc::PacketSocketFactory* socket_factory); + FakePortAllocator( + rtc::NetworkManager* network_manager, + rtc::PacketSocketFactory* socket_factory, + scoped_refptr<protocol::TransportContext> transport_context_); ~FakePortAllocator() override; // cricket::BasicPortAllocator overrides. @@ -32,6 +34,8 @@ const std::string& ice_password) override; private: + scoped_refptr<protocol::TransportContext> transport_context_; + DISALLOW_COPY_AND_ASSIGN(FakePortAllocator); };
diff --git a/skia/ext/platform_canvas.h b/skia/ext/platform_canvas.h index 89b8c326..5b8849b 100644 --- a/skia/ext/platform_canvas.h +++ b/skia/ext/platform_canvas.h
@@ -20,9 +20,11 @@ class SkBaseDevice; -namespace skia { +// A PlatformCanvas is a software-rasterized SkCanvas which is *also* +// addressable by the platform-specific drawing API (GDI, Core Graphics, +// Cairo...). -typedef SkCanvas PlatformCanvas; +namespace skia { // // Note about error handling. @@ -51,7 +53,7 @@ OnFailureType failure_type); // Draws the top layer of the canvas into the specified HDC. Only works - // with a PlatformCanvas with a BitmapPlatformDevice. + // with a SkCanvas with a BitmapPlatformDevice. SK_API void DrawToNativeContext(SkCanvas* canvas, HDC hdc, int x,
diff --git a/skia/ext/platform_canvas_unittest.cc b/skia/ext/platform_canvas_unittest.cc index 57b37f8..e0f89812 100644 --- a/skia/ext/platform_canvas_unittest.cc +++ b/skia/ext/platform_canvas_unittest.cc
@@ -14,6 +14,7 @@ #include "skia/ext/platform_device.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/skia/include/core/SkBitmap.h" +#include "third_party/skia/include/core/SkCanvas.h" #include "third_party/skia/include/core/SkColor.h" #include "third_party/skia/include/core/SkColorPriv.h" #include "third_party/skia/include/core/SkPixelRef.h" @@ -41,10 +42,10 @@ // rectangle filled to rect_color. This function ignores the alpha channel, // since Windows will sometimes clear the alpha channel when drawing, and we // will fix that up later in cases it's necessary. -bool VerifyRect(const PlatformCanvas& canvas, +bool VerifyRect(const SkCanvas& canvas, uint32_t canvas_color, uint32_t rect_color, int x, int y, int w, int h) { - const SkBitmap bitmap = skia::ReadPixels(const_cast<PlatformCanvas*>(&canvas)); + const SkBitmap bitmap = skia::ReadPixels(const_cast<SkCanvas*>(&canvas)); SkAutoLockPixels lock(bitmap); for (int cur_y = 0; cur_y < bitmap.height(); cur_y++) { @@ -68,7 +69,7 @@ // Return true if canvas has something that passes for a rounded-corner // rectangle. Basically, we're just checking to make sure that the pixels in the // middle are of rect_color and pixels in the corners are of canvas_color. -bool VerifyRoundedRect(const PlatformCanvas& canvas, +bool VerifyRoundedRect(const SkCanvas& canvas, uint32_t canvas_color, uint32_t rect_color, int x, @@ -97,19 +98,19 @@ // Checks whether there is a white canvas with a black square at the given // location in pixels (not in the canvas coordinate system). -bool VerifyBlackRect(const PlatformCanvas& canvas, int x, int y, int w, int h) { +bool VerifyBlackRect(const SkCanvas& canvas, int x, int y, int w, int h) { return VerifyRect(canvas, SK_ColorWHITE, SK_ColorBLACK, x, y, w, h); } #if !defined(USE_AURA) // http://crbug.com/154358 // Check that every pixel in the canvas is a single color. -bool VerifyCanvasColor(const PlatformCanvas& canvas, uint32_t canvas_color) { +bool VerifyCanvasColor(const SkCanvas& canvas, uint32_t canvas_color) { return VerifyRect(canvas, canvas_color, 0, 0, 0, 0, 0); } #endif // !defined(USE_AURA) #if defined(OS_WIN) -void DrawNativeRect(PlatformCanvas& canvas, int x, int y, int w, int h) { +void DrawNativeRect(SkCanvas& canvas, int x, int y, int w, int h) { skia::ScopedPlatformPaint scoped_platform_paint(&canvas); HDC dc = scoped_platform_paint.GetPlatformSurface(); @@ -121,7 +122,7 @@ FillRect(dc, &inner_rc, reinterpret_cast<HBRUSH>(GetStockObject(BLACK_BRUSH))); } #elif defined(OS_MACOSX) -void DrawNativeRect(PlatformCanvas& canvas, int x, int y, int w, int h) { +void DrawNativeRect(SkCanvas& canvas, int x, int y, int w, int h) { skia::ScopedPlatformPaint scoped_platform_paint(&canvas); CGContextRef context = scoped_platform_paint.GetPlatformSurface(); @@ -133,14 +134,14 @@ CGContextFillRect(context, inner_rc); } #else -void DrawNativeRect(PlatformCanvas& canvas, int x, int y, int w, int h) { +void DrawNativeRect(SkCanvas& canvas, int x, int y, int w, int h) { NOTIMPLEMENTED(); } #endif // Clips the contents of the canvas to the given rectangle. This will be // intersected with any existing clip. -void AddClip(PlatformCanvas& canvas, int x, int y, int w, int h) { +void AddClip(SkCanvas& canvas, int x, int y, int w, int h) { SkRect rect; rect.set(SkIntToScalar(x), SkIntToScalar(y), SkIntToScalar(x + w), SkIntToScalar(y + h)); @@ -149,7 +150,7 @@ class LayerSaver { public: - LayerSaver(PlatformCanvas& canvas, int x, int y, int w, int h) + LayerSaver(SkCanvas& canvas, int x, int y, int w, int h) : canvas_(canvas), x_(x), y_(y), @@ -176,7 +177,7 @@ int bottom() const { return y_ + h_; } private: - PlatformCanvas& canvas_; + SkCanvas& canvas_; int x_, y_, w_, h_; };
diff --git a/testing/buildbot/chromium.android.json b/testing/buildbot/chromium.android.json index d0f1343..4f50d12 100644 --- a/testing/buildbot/chromium.android.json +++ b/testing/buildbot/chromium.android.json
@@ -229,7 +229,7 @@ }, { "args": [ - "--isolate_file_path=src/ui/base/ui_base_unittests.isolate" + "--isolate_file_path=src/ui/base/ui_base_tests.isolate" ], "test": "ui_base_unittests" }, @@ -344,7 +344,7 @@ }, { "args": [ - "--isolate_file_path=src/ui/base/ui_base_unittests.isolate" + "--isolate_file_path=src/ui/base/ui_base_tests.isolate" ], "test": "ui_base_unittests" }, @@ -459,7 +459,7 @@ }, { "args": [ - "--isolate_file_path=src/ui/base/ui_base_unittests.isolate" + "--isolate_file_path=src/ui/base/ui_base_tests.isolate" ], "test": "ui_base_unittests" }, @@ -574,7 +574,7 @@ }, { "args": [ - "--isolate_file_path=src/ui/base/ui_base_unittests.isolate" + "--isolate_file_path=src/ui/base/ui_base_tests.isolate" ], "test": "ui_base_unittests" }, @@ -689,7 +689,7 @@ }, { "args": [ - "--isolate_file_path=src/ui/base/ui_base_unittests.isolate" + "--isolate_file_path=src/ui/base/ui_base_tests.isolate" ], "test": "ui_base_unittests" }, @@ -804,7 +804,7 @@ }, { "args": [ - "--isolate_file_path=src/ui/base/ui_base_unittests.isolate" + "--isolate_file_path=src/ui/base/ui_base_tests.isolate" ], "test": "ui_base_unittests" }, @@ -919,7 +919,7 @@ }, { "args": [ - "--isolate_file_path=src/ui/base/ui_base_unittests.isolate" + "--isolate_file_path=src/ui/base/ui_base_tests.isolate" ], "test": "ui_base_unittests" }, @@ -1034,7 +1034,7 @@ }, { "args": [ - "--isolate_file_path=src/ui/base/ui_base_unittests.isolate" + "--isolate_file_path=src/ui/base/ui_base_tests.isolate" ], "test": "ui_base_unittests" },
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json index efb4ef6..7fca0af7 100644 --- a/testing/buildbot/chromium.fyi.json +++ b/testing/buildbot/chromium.fyi.json
@@ -931,7 +931,8 @@ }, { "swarming": { - "can_use_on_swarming_builders": true + "can_use_on_swarming_builders": true, + "shards": 5 }, "test": "browser_tests" }, @@ -1323,7 +1324,8 @@ }, { "swarming": { - "can_use_on_swarming_builders": true + "can_use_on_swarming_builders": true, + "shards": 5 }, "test": "content_browsertests" },
diff --git a/testing/buildbot/chromium.gpu.fyi.json b/testing/buildbot/chromium.gpu.fyi.json index 045bb8c..7f004cd4 100644 --- a/testing/buildbot/chromium.gpu.fyi.json +++ b/testing/buildbot/chromium.gpu.fyi.json
@@ -1,4 +1,6 @@ { + "AAAAA1 AUTOGENERATED FILE DO NOT EDIT": {}, + "AAAAA2 See generate_buildbot_json.py to make changes": {}, "GPU NextGen Linux Builder": {}, "GPU NextGen Linux Builder (dbg)": {}, "GPU NextGen Mac Builder": {}, @@ -68,6 +70,18 @@ "test": "content_gl_tests" }, { + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "10de:104a", + "os": "Linux" + } + ] + }, + "test": "content_unittests" + }, + { "args": [ "--use-gpu-in-tests" ], @@ -341,10 +355,12 @@ "--show-stdout", "--browser=debug", "-v", - "--extra-browser-args=\"--enable-logging=stderr --js-flags=--expose-gc\"" + "--extra-browser-args=\"--enable-logging=stderr --js-flags=--expose-gc\"", + "--webgl-conformance-version=2.0.0", + "--webgl2-only=true" ], "isolate_name": "telemetry_gpu_test", - "name": "webgl_conformance_tests", + "name": "webgl2_conformance_tests", "override_compile_targets": [ "telemetry_gpu_test_run" ], @@ -364,12 +380,10 @@ "--show-stdout", "--browser=debug", "-v", - "--extra-browser-args=\"--enable-logging=stderr --js-flags=--expose-gc\"", - "--webgl-conformance-version=2.0.0", - "--webgl2-only=true" + "--extra-browser-args=\"--enable-logging=stderr --js-flags=--expose-gc\"" ], "isolate_name": "telemetry_gpu_test", - "name": "webgl2_conformance_tests", + "name": "webgl_conformance_tests", "override_compile_targets": [ "telemetry_gpu_test_run" ], @@ -448,6 +462,18 @@ "test": "content_gl_tests" }, { + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "10de:104a", + "os": "Linux" + } + ] + }, + "test": "content_unittests" + }, + { "args": [ "--use-gpu-in-tests" ], @@ -736,6 +762,31 @@ "--show-stdout", "--browser=release", "-v", + "--extra-browser-args=\"--enable-logging=stderr --js-flags=--expose-gc\"", + "--webgl-conformance-version=2.0.0", + "--webgl2-only=true" + ], + "isolate_name": "telemetry_gpu_test", + "name": "webgl2_conformance_tests", + "override_compile_targets": [ + "telemetry_gpu_test_run" + ], + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "10de:104a", + "os": "Linux" + } + ] + } + }, + { + "args": [ + "webgl_conformance", + "--show-stdout", + "--browser=release", + "-v", "--extra-browser-args=\"--enable-logging=stderr --js-flags=--expose-gc\"" ], "isolate_name": "telemetry_gpu_test", @@ -752,6 +803,751 @@ } ] } + } + ] + }, + "Mac 10.10 Debug (ATI)": { + "gtest_tests": [ + { + "args": [ + "--use-gpu-in-tests" + ], + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "1002:679e", + "os": "Mac-10.10" + } + ] + }, + "test": "angle_end2end_tests" + }, + { + "args": [ + "--use-gpu-in-tests" + ], + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "1002:679e", + "os": "Mac-10.10" + } + ] + }, + "test": "angle_unittests" + }, + { + "args": [ + "--use-gpu-in-tests" + ], + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "1002:679e", + "os": "Mac-10.10" + } + ] + }, + "test": "audio_unittests" + }, + { + "args": [ + "--use-gpu-in-tests" + ], + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "1002:679e", + "os": "Mac-10.10" + } + ] + }, + "test": "content_gl_tests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "1002:679e", + "os": "Mac-10.10" + } + ] + }, + "test": "content_unittests" + }, + { + "args": [ + "--use-gpu-in-tests" + ], + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "1002:679e", + "os": "Mac-10.10" + } + ] + }, + "test": "gl_tests" + }, + { + "args": [ + "--use-gpu-in-tests" + ], + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "1002:679e", + "os": "Mac-10.10" + } + ] + }, + "test": "gl_unittests" + }, + { + "args": [ + "--use-gpu-in-tests" + ], + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "1002:679e", + "os": "Mac-10.10" + } + ] + }, + "test": "gles2_conform_test" + } + ], + "isolated_scripts": [ + { + "args": [ + "context_lost", + "--show-stdout", + "--browser=debug", + "-v", + "--extra-browser-args=\"--enable-logging=stderr --js-flags=--expose-gc\"" + ], + "isolate_name": "telemetry_gpu_test", + "name": "context_lost_tests", + "override_compile_targets": [ + "telemetry_gpu_test_run" + ], + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "1002:679e", + "os": "Mac-10.10" + } + ] + } + }, + { + "args": [ + "gpu_process", + "--show-stdout", + "--browser=debug", + "-v", + "--extra-browser-args=\"--enable-logging=stderr --js-flags=--expose-gc\"" + ], + "isolate_name": "telemetry_gpu_test", + "name": "gpu_process_launch_tests", + "override_compile_targets": [ + "telemetry_gpu_test_run" + ], + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "1002:679e", + "os": "Mac-10.10" + } + ] + } + }, + { + "args": [ + "gpu_rasterization", + "--show-stdout", + "--browser=debug", + "-v", + "--extra-browser-args=\"--enable-logging=stderr --js-flags=--expose-gc\"" + ], + "isolate_name": "telemetry_gpu_test", + "name": "gpu_rasterization_tests", + "override_compile_targets": [ + "telemetry_gpu_test_run" + ], + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "1002:679e", + "os": "Mac-10.10" + } + ] + } + }, + { + "args": [ + "hardware_accelerated_feature", + "--show-stdout", + "--browser=debug", + "-v", + "--extra-browser-args=\"--enable-logging=stderr --js-flags=--expose-gc\"" + ], + "isolate_name": "telemetry_gpu_test", + "name": "hardware_accelerated_feature_tests", + "override_compile_targets": [ + "telemetry_gpu_test_run" + ], + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "1002:679e", + "os": "Mac-10.10" + } + ] + } + }, + { + "args": [ + "maps", + "--show-stdout", + "--browser=debug", + "-v", + "--extra-browser-args=\"--enable-logging=stderr --js-flags=--expose-gc\"" + ], + "isolate_name": "telemetry_gpu_test", + "name": "maps_pixel_test", + "override_compile_targets": [ + "telemetry_gpu_test_run" + ], + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "1002:679e", + "os": "Mac-10.10" + } + ] + } + }, + { + "args": [ + "memory_test", + "--show-stdout", + "--browser=debug", + "-v", + "--extra-browser-args=\"--enable-logging=stderr --js-flags=--expose-gc\"" + ], + "isolate_name": "telemetry_gpu_test", + "name": "memory_test", + "override_compile_targets": [ + "telemetry_gpu_test_run" + ], + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "1002:679e", + "os": "Mac-10.10" + } + ] + } + }, + { + "args": [ + "pixel", + "--show-stdout", + "--browser=debug", + "-v", + "--extra-browser-args=\"--enable-logging=stderr --js-flags=--expose-gc\"", + "--refimg-cloud-storage-bucket", + "chromium-gpu-archive/reference-images", + "--os-type", + "mac", + "--build-revision", + "${got_revision}", + "--test-machine-name", + "${buildername}" + ], + "isolate_name": "telemetry_gpu_test", + "name": "pixel_test", + "non_precommit_args": [ + "--upload-refimg-to-cloud-storage" + ], + "override_compile_targets": [ + "telemetry_gpu_test_run" + ], + "precommit_args": [ + "--download-refimg-from-cloud-storage" + ], + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "1002:679e", + "os": "Mac-10.10" + } + ] + } + }, + { + "args": [ + "screenshot_sync", + "--show-stdout", + "--browser=debug", + "-v", + "--extra-browser-args=\"--enable-logging=stderr --js-flags=--expose-gc\"" + ], + "isolate_name": "telemetry_gpu_test", + "name": "screenshot_sync_tests", + "override_compile_targets": [ + "telemetry_gpu_test_run" + ], + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "1002:679e", + "os": "Mac-10.10" + } + ] + } + }, + { + "args": [ + "trace_test", + "--show-stdout", + "--browser=debug", + "-v", + "--extra-browser-args=\"--enable-logging=stderr --js-flags=--expose-gc\"" + ], + "isolate_name": "telemetry_gpu_test", + "name": "trace_test", + "override_compile_targets": [ + "telemetry_gpu_test_run" + ], + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "1002:679e", + "os": "Mac-10.10" + } + ] + } + }, + { + "args": [ + "webgl_conformance", + "--show-stdout", + "--browser=debug", + "-v", + "--extra-browser-args=\"--enable-logging=stderr --js-flags=--expose-gc\"", + "--webgl-conformance-version=2.0.0", + "--webgl2-only=true" + ], + "isolate_name": "telemetry_gpu_test", + "name": "webgl2_conformance_tests", + "override_compile_targets": [ + "telemetry_gpu_test_run" + ], + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "1002:679e", + "os": "Mac-10.10" + } + ] + } + }, + { + "args": [ + "webgl_conformance", + "--show-stdout", + "--browser=debug", + "-v", + "--extra-browser-args=\"--enable-logging=stderr --js-flags=--expose-gc\"" + ], + "isolate_name": "telemetry_gpu_test", + "name": "webgl_conformance_tests", + "override_compile_targets": [ + "telemetry_gpu_test_run" + ], + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "1002:679e", + "os": "Mac-10.10" + } + ] + } + } + ] + }, + "Mac 10.10 Release (ATI)": { + "gtest_tests": [ + { + "args": [ + "--use-gpu-in-tests" + ], + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "1002:679e", + "os": "Mac-10.10" + } + ] + }, + "test": "angle_end2end_tests" + }, + { + "args": [ + "--use-gpu-in-tests" + ], + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "1002:679e", + "os": "Mac-10.10" + } + ] + }, + "test": "angle_unittests" + }, + { + "args": [ + "--use-gpu-in-tests" + ], + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "1002:679e", + "os": "Mac-10.10" + } + ] + }, + "test": "audio_unittests" + }, + { + "args": [ + "--enable-gpu", + "--test-launcher-jobs=1", + "--gtest_filter=CastStreamingApiTestWithPixelOutput.EndToEnd*:TabCaptureApiPixelTest.EndToEnd*" + ], + "name": "tab_capture_end2end_tests", + "test": "browser_tests" + }, + { + "args": [ + "--use-gpu-in-tests" + ], + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "1002:679e", + "os": "Mac-10.10" + } + ] + }, + "test": "content_gl_tests" + }, + { + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "1002:679e", + "os": "Mac-10.10" + } + ] + }, + "test": "content_unittests" + }, + { + "args": [ + "--use-gpu-in-tests" + ], + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "1002:679e", + "os": "Mac-10.10" + } + ] + }, + "test": "gl_tests" + }, + { + "args": [ + "--use-gpu-in-tests" + ], + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "1002:679e", + "os": "Mac-10.10" + } + ] + }, + "test": "gl_unittests" + }, + { + "args": [ + "--use-gpu-in-tests" + ], + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "1002:679e", + "os": "Mac-10.10" + } + ] + }, + "test": "gles2_conform_test" + } + ], + "isolated_scripts": [ + { + "args": [ + "context_lost", + "--show-stdout", + "--browser=release", + "-v", + "--extra-browser-args=\"--enable-logging=stderr --js-flags=--expose-gc\"" + ], + "isolate_name": "telemetry_gpu_test", + "name": "context_lost_tests", + "override_compile_targets": [ + "telemetry_gpu_test_run" + ], + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "1002:679e", + "os": "Mac-10.10" + } + ] + } + }, + { + "args": [ + "gpu_process", + "--show-stdout", + "--browser=release", + "-v", + "--extra-browser-args=\"--enable-logging=stderr --js-flags=--expose-gc\"" + ], + "isolate_name": "telemetry_gpu_test", + "name": "gpu_process_launch_tests", + "override_compile_targets": [ + "telemetry_gpu_test_run" + ], + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "1002:679e", + "os": "Mac-10.10" + } + ] + } + }, + { + "args": [ + "gpu_rasterization", + "--show-stdout", + "--browser=release", + "-v", + "--extra-browser-args=\"--enable-logging=stderr --js-flags=--expose-gc\"" + ], + "isolate_name": "telemetry_gpu_test", + "name": "gpu_rasterization_tests", + "override_compile_targets": [ + "telemetry_gpu_test_run" + ], + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "1002:679e", + "os": "Mac-10.10" + } + ] + } + }, + { + "args": [ + "hardware_accelerated_feature", + "--show-stdout", + "--browser=release", + "-v", + "--extra-browser-args=\"--enable-logging=stderr --js-flags=--expose-gc\"" + ], + "isolate_name": "telemetry_gpu_test", + "name": "hardware_accelerated_feature_tests", + "override_compile_targets": [ + "telemetry_gpu_test_run" + ], + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "1002:679e", + "os": "Mac-10.10" + } + ] + } + }, + { + "args": [ + "maps", + "--show-stdout", + "--browser=release", + "-v", + "--extra-browser-args=\"--enable-logging=stderr --js-flags=--expose-gc\"" + ], + "isolate_name": "telemetry_gpu_test", + "name": "maps_pixel_test", + "override_compile_targets": [ + "telemetry_gpu_test_run" + ], + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "1002:679e", + "os": "Mac-10.10" + } + ] + } + }, + { + "args": [ + "memory_test", + "--show-stdout", + "--browser=release", + "-v", + "--extra-browser-args=\"--enable-logging=stderr --js-flags=--expose-gc\"" + ], + "isolate_name": "telemetry_gpu_test", + "name": "memory_test", + "override_compile_targets": [ + "telemetry_gpu_test_run" + ], + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "1002:679e", + "os": "Mac-10.10" + } + ] + } + }, + { + "args": [ + "pixel", + "--show-stdout", + "--browser=release", + "-v", + "--extra-browser-args=\"--enable-logging=stderr --js-flags=--expose-gc\"", + "--refimg-cloud-storage-bucket", + "chromium-gpu-archive/reference-images", + "--os-type", + "mac", + "--build-revision", + "${got_revision}", + "--test-machine-name", + "${buildername}" + ], + "isolate_name": "telemetry_gpu_test", + "name": "pixel_test", + "non_precommit_args": [ + "--upload-refimg-to-cloud-storage" + ], + "override_compile_targets": [ + "telemetry_gpu_test_run" + ], + "precommit_args": [ + "--download-refimg-from-cloud-storage" + ], + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "1002:679e", + "os": "Mac-10.10" + } + ] + } + }, + { + "args": [ + "screenshot_sync", + "--show-stdout", + "--browser=release", + "-v", + "--extra-browser-args=\"--enable-logging=stderr --js-flags=--expose-gc\"" + ], + "isolate_name": "telemetry_gpu_test", + "name": "screenshot_sync_tests", + "override_compile_targets": [ + "telemetry_gpu_test_run" + ], + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "1002:679e", + "os": "Mac-10.10" + } + ] + } + }, + { + "args": [ + "trace_test", + "--show-stdout", + "--browser=release", + "-v", + "--extra-browser-args=\"--enable-logging=stderr --js-flags=--expose-gc\"" + ], + "isolate_name": "telemetry_gpu_test", + "name": "trace_test", + "override_compile_targets": [ + "telemetry_gpu_test_run" + ], + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "1002:679e", + "os": "Mac-10.10" + } + ] + } }, { "args": [ @@ -772,8 +1568,31 @@ "can_use_on_swarming_builders": true, "dimension_sets": [ { - "gpu": "10de:104a", - "os": "Linux" + "gpu": "1002:679e", + "os": "Mac-10.10" + } + ] + } + }, + { + "args": [ + "webgl_conformance", + "--show-stdout", + "--browser=release", + "-v", + "--extra-browser-args=\"--enable-logging=stderr --js-flags=--expose-gc\"" + ], + "isolate_name": "telemetry_gpu_test", + "name": "webgl_conformance_tests", + "override_compile_targets": [ + "telemetry_gpu_test_run" + ], + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "1002:679e", + "os": "Mac-10.10" } ] } @@ -1145,10 +1964,12 @@ "--show-stdout", "--browser=debug", "-v", - "--extra-browser-args=\"--enable-logging=stderr --js-flags=--expose-gc\"" + "--extra-browser-args=\"--enable-logging=stderr --js-flags=--expose-gc\"", + "--webgl-conformance-version=2.0.0", + "--webgl2-only=true" ], "isolate_name": "telemetry_gpu_test", - "name": "webgl_conformance_tests", + "name": "webgl2_conformance_tests", "override_compile_targets": [ "telemetry_gpu_test_run" ], @@ -1169,12 +1990,10 @@ "--show-stdout", "--browser=debug", "-v", - "--extra-browser-args=\"--enable-logging=stderr --js-flags=--expose-gc\"", - "--webgl-conformance-version=2.0.0", - "--webgl2-only=true" + "--extra-browser-args=\"--enable-logging=stderr --js-flags=--expose-gc\"" ], "isolate_name": "telemetry_gpu_test", - "name": "webgl2_conformance_tests", + "name": "webgl_conformance_tests", "override_compile_targets": [ "telemetry_gpu_test_run" ], @@ -1572,10 +2391,12 @@ "--show-stdout", "--browser=release", "-v", - "--extra-browser-args=\"--enable-logging=stderr --js-flags=--expose-gc\"" + "--extra-browser-args=\"--enable-logging=stderr --js-flags=--expose-gc\"", + "--webgl-conformance-version=2.0.0", + "--webgl2-only=true" ], "isolate_name": "telemetry_gpu_test", - "name": "webgl_conformance_tests", + "name": "webgl2_conformance_tests", "override_compile_targets": [ "telemetry_gpu_test_run" ], @@ -1596,12 +2417,10 @@ "--show-stdout", "--browser=release", "-v", - "--extra-browser-args=\"--enable-logging=stderr --js-flags=--expose-gc\"", - "--webgl-conformance-version=2.0.0", - "--webgl2-only=true" + "--extra-browser-args=\"--enable-logging=stderr --js-flags=--expose-gc\"" ], "isolate_name": "telemetry_gpu_test", - "name": "webgl2_conformance_tests", + "name": "webgl_conformance_tests", "override_compile_targets": [ "telemetry_gpu_test_run" ], @@ -1681,6 +2500,18 @@ "test": "content_gl_tests" }, { + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "10de:104a", + "os": "Windows-2008ServerR2-SP1" + } + ] + }, + "test": "content_unittests" + }, + { "args": [ "--use-gpu-in-tests" ], @@ -1712,21 +2543,6 @@ }, { "args": [ - "--use-gpu-in-tests" - ], - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "gpu": "10de:104a", - "os": "Windows-2008ServerR2-SP1" - } - ] - }, - "test": "gles2_conform_test" - }, - { - "args": [ "--use-gpu-in-tests", "--use-angle=d3d9" ], @@ -1759,6 +2575,21 @@ ] }, "test": "gles2_conform_test" + }, + { + "args": [ + "--use-gpu-in-tests" + ], + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "10de:104a", + "os": "Windows-2008ServerR2-SP1" + } + ] + }, + "test": "gles2_conform_test" } ], "isolated_scripts": [ @@ -1989,10 +2820,12 @@ "--show-stdout", "--browser=debug", "-v", - "--extra-browser-args=\"--enable-logging=stderr --js-flags=--expose-gc\"" + "--extra-browser-args=\"--enable-logging=stderr --js-flags=--expose-gc\"", + "--webgl-conformance-version=2.0.0", + "--webgl2-only=true" ], "isolate_name": "telemetry_gpu_test", - "name": "webgl_conformance_tests", + "name": "webgl2_conformance_tests", "override_compile_targets": [ "telemetry_gpu_test_run" ], @@ -2058,12 +2891,10 @@ "--show-stdout", "--browser=debug", "-v", - "--extra-browser-args=\"--enable-logging=stderr --js-flags=--expose-gc\"", - "--webgl-conformance-version=2.0.0", - "--webgl2-only=true" + "--extra-browser-args=\"--enable-logging=stderr --js-flags=--expose-gc\"" ], "isolate_name": "telemetry_gpu_test", - "name": "webgl2_conformance_tests", + "name": "webgl_conformance_tests", "override_compile_targets": [ "telemetry_gpu_test_run" ], @@ -2142,6 +2973,18 @@ "test": "content_gl_tests" }, { + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "1002:6779", + "os": "Windows-2008ServerR2-SP1" + } + ] + }, + "test": "content_unittests" + }, + { "args": [ "--use-gpu-in-tests" ], @@ -2173,21 +3016,6 @@ }, { "args": [ - "--use-gpu-in-tests" - ], - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "gpu": "1002:6779", - "os": "Windows-2008ServerR2-SP1" - } - ] - }, - "test": "gles2_conform_test" - }, - { - "args": [ "--use-gpu-in-tests", "--use-angle=d3d9" ], @@ -2222,6 +3050,21 @@ "test": "gles2_conform_test" }, { + "args": [ + "--use-gpu-in-tests" + ], + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "1002:6779", + "os": "Windows-2008ServerR2-SP1" + } + ] + }, + "test": "gles2_conform_test" + }, + { "override_compile_targets": [ "tab_capture_end2end_tests_run" ], @@ -2465,10 +3308,12 @@ "--show-stdout", "--browser=release", "-v", - "--extra-browser-args=\"--enable-logging=stderr --js-flags=--expose-gc\"" + "--extra-browser-args=\"--enable-logging=stderr --js-flags=--expose-gc\"", + "--webgl-conformance-version=2.0.0", + "--webgl2-only=true" ], "isolate_name": "telemetry_gpu_test", - "name": "webgl_conformance_tests", + "name": "webgl2_conformance_tests", "override_compile_targets": [ "telemetry_gpu_test_run" ], @@ -2534,12 +3379,10 @@ "--show-stdout", "--browser=release", "-v", - "--extra-browser-args=\"--enable-logging=stderr --js-flags=--expose-gc\"", - "--webgl-conformance-version=2.0.0", - "--webgl2-only=true" + "--extra-browser-args=\"--enable-logging=stderr --js-flags=--expose-gc\"" ], "isolate_name": "telemetry_gpu_test", - "name": "webgl2_conformance_tests", + "name": "webgl_conformance_tests", "override_compile_targets": [ "telemetry_gpu_test_run" ], @@ -2609,15 +3452,6 @@ "--gtest_filter=CastStreamingApiTestWithPixelOutput.EndToEnd*:TabCaptureApiPixelTest.EndToEnd*" ], "name": "tab_capture_end2end_tests", - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "gpu": "8086:041a", - "os": "Windows-2008ServerR2-SP1" - } - ] - }, "test": "browser_tests" }, { @@ -2636,6 +3470,18 @@ "test": "content_gl_tests" }, { + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "8086:041a", + "os": "Windows-2008ServerR2-SP1" + } + ] + }, + "test": "content_unittests" + }, + { "args": [ "--use-gpu-in-tests" ], @@ -2667,21 +3513,6 @@ }, { "args": [ - "--use-gpu-in-tests" - ], - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "gpu": "8086:041a", - "os": "Windows-2008ServerR2-SP1" - } - ] - }, - "test": "gles2_conform_test" - }, - { - "args": [ "--use-gpu-in-tests", "--use-angle=d3d9" ], @@ -2714,6 +3545,21 @@ ] }, "test": "gles2_conform_test" + }, + { + "args": [ + "--use-gpu-in-tests" + ], + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "8086:041a", + "os": "Windows-2008ServerR2-SP1" + } + ] + }, + "test": "gles2_conform_test" } ], "isolated_scripts": [ @@ -2944,10 +3790,12 @@ "--show-stdout", "--browser=release", "-v", - "--extra-browser-args=\"--enable-logging=stderr --js-flags=--expose-gc\"" + "--extra-browser-args=\"--enable-logging=stderr --js-flags=--expose-gc\"", + "--webgl-conformance-version=2.0.0", + "--webgl2-only=true" ], "isolate_name": "telemetry_gpu_test", - "name": "webgl_conformance_tests", + "name": "webgl2_conformance_tests", "override_compile_targets": [ "telemetry_gpu_test_run" ], @@ -3013,12 +3861,10 @@ "--show-stdout", "--browser=release", "-v", - "--extra-browser-args=\"--enable-logging=stderr --js-flags=--expose-gc\"", - "--webgl-conformance-version=2.0.0", - "--webgl2-only=true" + "--extra-browser-args=\"--enable-logging=stderr --js-flags=--expose-gc\"" ], "isolate_name": "telemetry_gpu_test", - "name": "webgl2_conformance_tests", + "name": "webgl_conformance_tests", "override_compile_targets": [ "telemetry_gpu_test_run" ], @@ -3097,6 +3943,18 @@ "test": "content_gl_tests" }, { + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "10de:104a", + "os": "Windows-2008ServerR2-SP1" + } + ] + }, + "test": "content_unittests" + }, + { "args": [ "--use-gpu-in-tests" ], @@ -3128,21 +3986,6 @@ }, { "args": [ - "--use-gpu-in-tests" - ], - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "gpu": "10de:104a", - "os": "Windows-2008ServerR2-SP1" - } - ] - }, - "test": "gles2_conform_test" - }, - { - "args": [ "--use-gpu-in-tests", "--use-angle=d3d9" ], @@ -3177,6 +4020,21 @@ "test": "gles2_conform_test" }, { + "args": [ + "--use-gpu-in-tests" + ], + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "10de:104a", + "os": "Windows-2008ServerR2-SP1" + } + ] + }, + "test": "gles2_conform_test" + }, + { "override_compile_targets": [ "tab_capture_end2end_tests_run" ], @@ -3420,10 +4278,12 @@ "--show-stdout", "--browser=release", "-v", - "--extra-browser-args=\"--enable-logging=stderr --js-flags=--expose-gc\"" + "--extra-browser-args=\"--enable-logging=stderr --js-flags=--expose-gc\"", + "--webgl-conformance-version=2.0.0", + "--webgl2-only=true" ], "isolate_name": "telemetry_gpu_test", - "name": "webgl_conformance_tests", + "name": "webgl2_conformance_tests", "override_compile_targets": [ "telemetry_gpu_test_run" ], @@ -3489,12 +4349,10 @@ "--show-stdout", "--browser=release", "-v", - "--extra-browser-args=\"--enable-logging=stderr --js-flags=--expose-gc\"", - "--webgl-conformance-version=2.0.0", - "--webgl2-only=true" + "--extra-browser-args=\"--enable-logging=stderr --js-flags=--expose-gc\"" ], "isolate_name": "telemetry_gpu_test", - "name": "webgl2_conformance_tests", + "name": "webgl_conformance_tests", "override_compile_targets": [ "telemetry_gpu_test_run" ], @@ -3603,6 +4461,18 @@ "test": "content_gl_tests" }, { + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "10de:104a", + "os": "Windows-2012ServerR2-SP0" + } + ] + }, + "test": "content_unittests" + }, + { "args": [ "--use-gpu-in-tests" ], @@ -3634,21 +4504,6 @@ }, { "args": [ - "--use-gpu-in-tests" - ], - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "gpu": "10de:104a", - "os": "Windows-2012ServerR2-SP0" - } - ] - }, - "test": "gles2_conform_test" - }, - { - "args": [ "--use-gpu-in-tests", "--use-angle=d3d9" ], @@ -3681,6 +4536,21 @@ ] }, "test": "gles2_conform_test" + }, + { + "args": [ + "--use-gpu-in-tests" + ], + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "10de:104a", + "os": "Windows-2012ServerR2-SP0" + } + ] + }, + "test": "gles2_conform_test" } ], "isolated_scripts": [ @@ -3911,10 +4781,12 @@ "--show-stdout", "--browser=debug", "-v", - "--extra-browser-args=\"--enable-logging=stderr --js-flags=--expose-gc\"" + "--extra-browser-args=\"--enable-logging=stderr --js-flags=--expose-gc\"", + "--webgl-conformance-version=2.0.0", + "--webgl2-only=true" ], "isolate_name": "telemetry_gpu_test", - "name": "webgl_conformance_tests", + "name": "webgl2_conformance_tests", "override_compile_targets": [ "telemetry_gpu_test_run" ], @@ -3980,12 +4852,10 @@ "--show-stdout", "--browser=debug", "-v", - "--extra-browser-args=\"--enable-logging=stderr --js-flags=--expose-gc\"", - "--webgl-conformance-version=2.0.0", - "--webgl2-only=true" + "--extra-browser-args=\"--enable-logging=stderr --js-flags=--expose-gc\"" ], "isolate_name": "telemetry_gpu_test", - "name": "webgl2_conformance_tests", + "name": "webgl_conformance_tests", "override_compile_targets": [ "telemetry_gpu_test_run" ], @@ -4064,6 +4934,18 @@ "test": "content_gl_tests" }, { + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "10de:104a", + "os": "Windows-2012ServerR2-SP0" + } + ] + }, + "test": "content_unittests" + }, + { "args": [ "--use-gpu-in-tests" ], @@ -4095,21 +4977,6 @@ }, { "args": [ - "--use-gpu-in-tests" - ], - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "gpu": "10de:104a", - "os": "Windows-2012ServerR2-SP0" - } - ] - }, - "test": "gles2_conform_test" - }, - { - "args": [ "--use-gpu-in-tests", "--use-angle=d3d9" ], @@ -4144,6 +5011,21 @@ "test": "gles2_conform_test" }, { + "args": [ + "--use-gpu-in-tests" + ], + "swarming": { + "can_use_on_swarming_builders": true, + "dimension_sets": [ + { + "gpu": "10de:104a", + "os": "Windows-2012ServerR2-SP0" + } + ] + }, + "test": "gles2_conform_test" + }, + { "override_compile_targets": [ "tab_capture_end2end_tests_run" ], @@ -4387,10 +5269,12 @@ "--show-stdout", "--browser=release", "-v", - "--extra-browser-args=\"--enable-logging=stderr --js-flags=--expose-gc\"" + "--extra-browser-args=\"--enable-logging=stderr --js-flags=--expose-gc\"", + "--webgl-conformance-version=2.0.0", + "--webgl2-only=true" ], "isolate_name": "telemetry_gpu_test", - "name": "webgl_conformance_tests", + "name": "webgl2_conformance_tests", "override_compile_targets": [ "telemetry_gpu_test_run" ], @@ -4456,12 +5340,10 @@ "--show-stdout", "--browser=release", "-v", - "--extra-browser-args=\"--enable-logging=stderr --js-flags=--expose-gc\"", - "--webgl-conformance-version=2.0.0", - "--webgl2-only=true" + "--extra-browser-args=\"--enable-logging=stderr --js-flags=--expose-gc\"" ], "isolate_name": "telemetry_gpu_test", - "name": "webgl2_conformance_tests", + "name": "webgl_conformance_tests", "override_compile_targets": [ "telemetry_gpu_test_run" ],
diff --git a/testing/buildbot/chromium.memory.fyi.json b/testing/buildbot/chromium.memory.fyi.json index 6d82bfd..ea9d76e 100644 --- a/testing/buildbot/chromium.memory.fyi.json +++ b/testing/buildbot/chromium.memory.fyi.json
@@ -28,7 +28,7 @@ { "swarming": { "can_use_on_swarming_builders": true, - "shards": 5 + "shards": 10 }, "test": "browser_tests" }, @@ -319,7 +319,7 @@ { "swarming": { "can_use_on_swarming_builders": true, - "shards": 5 + "shards": 10 }, "test": "browser_tests" },
diff --git a/testing/buildbot/filters/browser-side-navigation.linux.content_browsertests.filter b/testing/buildbot/filters/browser-side-navigation.linux.content_browsertests.filter index ad615600..1ba78c2 100644 --- a/testing/buildbot/filters/browser-side-navigation.linux.content_browsertests.filter +++ b/testing/buildbot/filters/browser-side-navigation.linux.content_browsertests.filter
@@ -16,7 +16,6 @@ -LoFiResourceDispatcherHostBrowserTest.ShouldEnableLoFiModeReload -LoFiResourceDispatcherHostBrowserTest.ShouldEnableLoFiModeReloadDisableLoFi -NavigationControllerBrowserTest.CorrectLengthWithCurrentItemReplacement --NavigationControllerBrowserTest.FrameNavigationEntry_FrameUniqueName -NavigationControllerBrowserTest.FrameNavigationEntry_SubframeHistoryFallback -NavigationControllerBrowserTest.NavigationTypeClassification_ClientSideRedirect -NavigationControllerBrowserTest.NavigationTypeClassification_EmptyGURL
diff --git a/third_party/WebKit/LayoutTests/OilpanLeakExpectations b/third_party/WebKit/LayoutTests/OilpanLeakExpectations index fc756d4..87656421 100644 --- a/third_party/WebKit/LayoutTests/OilpanLeakExpectations +++ b/third_party/WebKit/LayoutTests/OilpanLeakExpectations
@@ -4,3 +4,7 @@ # This list isn't comprehensive yet, and Leak Detector bots are not tree closers atm. # Gardeners are welcome to touch this file, but you can ignore the failures # and wait for kouhei@ or hajimehoshi@ to maintain this file. +# +# Also, while Oilpan is enabled on ToT it will not read leak expectations from this +# file. So gardeners, put Oilpan leak expectations in LeakExpectations in a section +# labelled "Oilpan" or some such.
diff --git a/third_party/WebKit/LayoutTests/TestExpectations b/third_party/WebKit/LayoutTests/TestExpectations index 5300b21..f178826 100644 --- a/third_party/WebKit/LayoutTests/TestExpectations +++ b/third_party/WebKit/LayoutTests/TestExpectations
@@ -27,6 +27,7 @@ crbug.com/417181 http/tests/xmlhttprequest/abort-on-changestate-headers-received.html [ Failure Pass ] crbug.com/420008 inspector/tracing/worker-js-frames.html [ Pass Timeout Failure ] +crbug.com/420008 virtual/threaded/inspector/tracing/worker-js-frames.html [ Pass Timeout Failure ] crbug.com/572723 inspector/sources/debugger/debugger-autocontinue-on-syntax-error.html [ Pass Failure ] crbug.com/569901 crbug.com/24182 [ Debug ] jquery/manipulation.html [ Timeout Failure Pass ] @@ -41,6 +42,16 @@ crbug.com/569901 [ Debug ] imported/web-platform-tests/html/syntax/parsing/html5lib_template.html [ Timeout Failure ] crbug.com/569901 [ Debug ] imported/web-platform-tests/html/rendering/replaced-elements/svg-embedded-sizing/svg-in-iframe-fixed.html [ Timeout Failure ] +crbug.com/299010 [ Win ] fast/forms/text/text-font-height-mismatch.html [ Pass Failure ] +crbug.com/299010 [ Linux Debug ] fast/forms/text/text-font-height-mismatch.html [ Pass Failure ] +crbug.com/581990 [ Win ] fast/writing-mode/english-lr-text.html [ Pass Failure ] +crbug.com/581974 [ Win Debug ] fast/text/justify-ideograph-vertical.html [ Pass Failure ] +crbug.com/581974 [ Linux Debug ] fast/text/justify-ideograph-vertical.html [ Pass Failure ] + +# See also crbug.com/521730 for the these two text/emphasis tests (non-Oilpan) Win10 failures. +crbug.com/574660 [ Win7 ] fast/text/emphasis-combined-text.html [ Pass Failure ] +crbug.com/574660 [ Win7 ] fast/text/emphasis-vertical.html [ Pass Failure ] + # ====== Oilpan-only failures until here ====== # Run these tests with under virtual/spv2 only. @@ -116,13 +127,12 @@ crbug.com/492664 [ Win ] imported/csswg-test/css-writing-modes-3/bidi-override-005.html [ Failure ] crbug.com/492664 [ Win ] imported/csswg-test/css-writing-modes-3/bidi-plaintext-001.html [ Failure ] crbug.com/418091 [ Mac10.6 ] fast/text/aat-morx.html [ Failure ] -#crbug.com/463358 [ Linux Mac Debug ] svg/transforms/text-with-pattern-inside-transformed-html.xhtml [ Failure ] +crbug.com/463358 crbug.com/581963 [ Linux Mac Debug ] svg/transforms/text-with-pattern-inside-transformed-html.xhtml [ Failure ] crbug.com/463358 [ Mac Linux Debug ] fast/backgrounds/transformed-body-html-background.html [ Failure ] crbug.com/463358 [ Mac Linux Debug ] css3/masking/clip-path-polygon-nonzero.html [ Failure ] crbug.com/463358 [ Mac Linux ] fast/transforms/transformed-caret.html [ Pass Failure ] crbug.com/463358 [ Mac Linux Debug ] fast/backgrounds/transformed-body-background.html [ Failure ] -# TODO(fmalita): Re-enable after https://codereview.chromium.org/1623073003/ -# crbug.com/463358 [ Mac Linux Debug ] svg/W3C-SVG-1.1/paths-data-02-t.svg [ Failure ] +crbug.com/463358, crbug.com/581978 [ Mac10.7 Linux Debug ] svg/W3C-SVG-1.1/paths-data-02-t.svg [ Failure ] crbug.com/463358 [ Mac Linux Debug ] css3/masking/clip-path-polygon.html [ Failure ] crbug.com/267206 [ Mac ] virtual/rootlayerscrolls/fast/scrolling/scrollbar-tickmarks-hittest.html [ Timeout ] @@ -675,8 +685,10 @@ crbug.com/492664 imported/csswg-test/css-writing-modes-3/table-column-order-004.xht [ Failure ] crbug.com/492664 imported/csswg-test/css-writing-modes-3/table-column-order-005.xht [ Failure ] crbug.com/492664 imported/csswg-test/css-writing-modes-3/table-progression-vlr-001.html [ Failure ] +crbug.com/492664 imported/csswg-test/css-writing-modes-3/table-progression-vlr-003.html [ Failure ] crbug.com/492664 imported/csswg-test/css-writing-modes-3/table-progression-vlr-004.html [ Failure ] crbug.com/492664 imported/csswg-test/css-writing-modes-3/table-progression-vrl-001.html [ Failure ] +crbug.com/492664 imported/csswg-test/css-writing-modes-3/table-progression-vrl-003.html [ Failure ] crbug.com/492664 imported/csswg-test/css-writing-modes-3/table-progression-vrl-004.html [ Failure ] # Test sometimes flakes on most platforms @@ -963,7 +975,7 @@ crbug.com/463798 [ Mac ] svg/as-image/svg-invalid-image-1.html [ Failure ] crbug.com/463358 [ Mac Linux Debug ] css3/masking/clip-path-polygon-evenodd.html [ Failure ] -#crbug.com/463358 [ Mac ] svg/transforms/animated-path-inside-transformed-html.xhtml [ Failure ] +crbug.com/463358 [ Mac10.7 Debug ] svg/transforms/animated-path-inside-transformed-html.xhtml [ Failure ] crbug.com/482229 compositing/layer-creation/fixed-position-under-transform.html [ Failure ] @@ -971,13 +983,17 @@ crbug.com/471824 virtual/pointerevent/imported/web-platform-tests/pointerevents/pointerevent_touch-action-illegal.html [ Skip ] crbug.com/471824 virtual/pointerevent/imported/web-platform-tests/pointerevents/pointerevent_touch-action-verification.html [ Skip ] +# These testcases are incorrect, mark them as failing until they're fixed in the testsuite. +# https://lists.w3.org/Archives/Public/www-style/2016Jan/0275.html +# https://lists.w3.org/Archives/Public/www-style/2016Jan/0276.html +crbug.com/249112 imported/csswg-test/css-flexbox-1/flex-minimum-height-flex-items-005.xht [ Failure ] +crbug.com/249112 imported/csswg-test/css-flexbox-1/flex-minimum-height-flex-items-007.xht [ Failure ] +crbug.com/249112 imported/csswg-test/css-flexbox-1/flex-minimum-width-flex-items-005.xht [ Failure ] +crbug.com/249112 imported/csswg-test/css-flexbox-1/flex-minimum-width-flex-items-007.xht [ Failure ] + # Not implemented yet crbug.com/336604 imported/csswg-test/css-flexbox-1/flexbox_visibility-collapse-line-wrapping.html [ Failure ] crbug.com/336604 imported/csswg-test/css-flexbox-1/flexbox_visibility-collapse.html [ Failure ] -crbug.com/249112 imported/csswg-test/css-flexbox-1/flex-minimum-height-flex-items-005.xht [ Failure ] -crbug.com/249112 imported/csswg-test/css-flexbox-1/flex-minimum-height-flex-items-007.xht [ Failure ] -crbug.com/249112 imported/csswg-test/css-flexbox-1/flex-minimum-height-flex-items-008.xht [ Failure ] -crbug.com/249112 imported/csswg-test/css-flexbox-1/flex-minimum-width-flex-items-005.xht [ Failure ] crbug.com/249112 imported/csswg-test/css-flexbox-1/flex-minimum-width-flex-items-006.xht [ Failure ] crbug.com/467127 imported/csswg-test/css-flexbox-1/flex-grow-006.html [ Failure ] @@ -987,7 +1003,6 @@ crbug.com/467127 imported/csswg-test/css-flexbox-1/getcomputedstyle/flexbox_computedstyle_flex-basis-0percent.html [ Failure ] crbug.com/467127 imported/csswg-test/css-flexbox-1/getcomputedstyle/flexbox_computedstyle_flex-basis-percent.html [ Failure ] crbug.com/467127 imported/csswg-test/css-flexbox-1/getcomputedstyle/flexbox_computedstyle_flex-shorthand-number.html [ Failure ] -crbug.com/467127 [ Mac ] imported/csswg-test/css-flexbox-1/flex-minimum-width-flex-items-007.xht [ Failure ] crbug.com/467127 [ Mac Win ] imported/csswg-test/css-flexbox-1/ttwf-reftest-flex-wrap-reverse.html [ Failure ] crbug.com/467127 [ Mac Win ] imported/csswg-test/css-flexbox-1/ttwf-reftest-flex-wrap.html [ Failure ] @@ -1004,9 +1019,12 @@ crbug.com/521124 crbug.com/410145 [ Win ] fast/text/international/vertical-text-glyph-test.html [ Pass Failure ] crbug.com/521124 crbug.com/410145 [ Win ] fast/text/international/text-combine-image-test.html [ Pass Failure ] crbug.com/521124 crbug.com/410145 [ Win7 ] fast/css/font-weight-1.html [ Pass Failure ] -crbug.com/521124 crbug.com/410145 [ Win ] fast/text/justify-ideograph-vertical.html [ Pass Failure ] crbug.com/521124 crbug.com/571481 crbug.com/410145 [ Win ] fast/text/orientation-sideways.html [ Pass Failure ] +crbug.com/581974 [ Mac10.7 Debug ] fast/text/justify-ideograph-vertical.html [ Failure ] +crbug.com/581974 [ Mac10.7 Debug ] fast/text/justify-ideograph-simple.html [ Failure ] +crbug.com/581974 [ Mac10.7 Debug ] fast/text/justify-ideograph-complex.html [ Failure ] + # Temporary, until we stop use_system_harfbuzz on Linux including non-official builds crbug.com/462689 [ Linux ] fast/text/unicode-variation-selector.html [ Failure ] @@ -1093,6 +1111,8 @@ crbug.com/509025 [ Mac10.10 ] http/tests/navigation/navigation-redirect-schedule-crash.html [ Failure ] crbug.com/509025 [ Mac10.10 ] http/tests/security/contentTypeOptions/nosniff-script-without-content-type-blocked.html [ Failure ] +crbug.com/569643 compositing/iframes/invisible-nested-iframe-hide.html [ NeedsRebaseline ] + crbug.com/545140 [ Mac10.10 ] fast/encoding/denormalised-voiced-japanese-chars.html [ Failure ] crbug.com/545141 [ Mac10.10 ] fast/writing-mode/text-orientation-basic.html [ Failure ] @@ -1251,6 +1271,11 @@ crbug.com/521730 [ Win10 ] svg/css/text-shadow-multiple.xhtml [ Failure ] crbug.com/521730 [ Win10 ] svg/custom/textPath-change-id2-pattern.svg [ Failure ] +crbug.com/390040 [ Win10 ] virtual/threaded/printing/ellipsis-printing-style.html [ Skip ] +crbug.com/390040 [ Win10 ] printing/ellipsis-printing-style.html [ Skip ] +crbug.com/390040 [ Win10 ] virtual/threaded/printing/iframe-print.html [ Failure ] +crbug.com/390040 [ Win10 ] printing/iframe-print.html [ Failure ] + crbug.com/571233 compositing/background-color/background-color-outside-document.html [ Skip ] crbug.com/474759 fast/writing-mode/vertical-rl-replaced-selection.html [ Failure ] @@ -1328,7 +1353,7 @@ crbug.com/320139 fast/repaint/block-layout-inline-children-replaced.html [ Pass Failure ] crbug.com/575766 http/tests/inspector/resource-tree/resource-tree-frame-add.html [ Timeout Pass ] -crbug.com/581468 [ Win ] http/tests/inspector/resource-tree/resource-tree-non-unique-url.html [ Pass Failure ] +crbug.com/581468 http/tests/inspector/resource-tree/resource-tree-non-unique-url.html [ Pass Failure ] crbug.com/571710 http/tests/inspector/search/source-frame-search.html [ Timeout Pass ]
diff --git a/third_party/WebKit/LayoutTests/compositing/composited-iframe-hidden-expected.html b/third_party/WebKit/LayoutTests/compositing/composited-iframe-hidden-expected.html new file mode 100644 index 0000000..14bf34b0 --- /dev/null +++ b/third_party/WebKit/LayoutTests/compositing/composited-iframe-hidden-expected.html
@@ -0,0 +1,4 @@ +<!DOCTYPE html> +<div style="visibility: hidden;"><iframe></iframe></div> +<p>This test passes if there is no assert failure in debug builds and there is no visible +content in the iframe above after the page fully settles.
diff --git a/third_party/WebKit/LayoutTests/compositing/composited-iframe-hidden.html b/third_party/WebKit/LayoutTests/compositing/composited-iframe-hidden.html new file mode 100644 index 0000000..2259f1a --- /dev/null +++ b/third_party/WebKit/LayoutTests/compositing/composited-iframe-hidden.html
@@ -0,0 +1,36 @@ +<!DOCTYPE html> +<script src="../resources/run-after-layout-and-paint.js"></script> +<div id="frameContainer"> + <iframe src="./resources/composited-iframe-hidden-subframe.html"></iframe> +</div> +<p>This test passes if there is no assert failure in debug builds and there is no visible +content in the iframe above after the page fully settles. +<script> +function hideFrameContainer() { + frameContainer.style.visibility = 'hidden'; +} + +function showFrameContainer() { + frameContainer.style.visibility = 'visible'; +} + +// We were seeing assert failure when we hid and then re-showed the iframe due +// to a stale graphics layer with an old invalidation posted by the animated +// element. To prevent regression we hide and re-show the iframe, and hide again +// to ensure the content is actually hidden. +if (window.testRunner) + testRunner.waitUntilDone(); +runAfterLayoutAndPaint(function() { + hideFrameContainer(); + runAfterLayoutAndPaint(function() { + showFrameContainer(); + runAfterLayoutAndPaint(function() { + hideFrameContainer(); + if (window.testRunner) + runAfterLayoutAndPaint(function() { + testRunner.notifyDone(); + }); + }); + }); +}); +</script>
diff --git a/third_party/WebKit/LayoutTests/compositing/iframes/invisible-nested-iframe-show.html b/third_party/WebKit/LayoutTests/compositing/iframes/invisible-nested-iframe-show.html index 11e6c7d..013259b0 100644 --- a/third_party/WebKit/LayoutTests/compositing/iframes/invisible-nested-iframe-show.html +++ b/third_party/WebKit/LayoutTests/compositing/iframes/invisible-nested-iframe-show.html
@@ -48,7 +48,7 @@ </head> <body> - <!-- The nested iframe should appear when we remove "diplay:none". --> + <!-- The nested iframe should appear when we remove "display:none". --> <div id="invisible" style="display:none;"> <iframe src="resources/intermediate-frame.html"></iframe> </div>
diff --git a/third_party/WebKit/LayoutTests/compositing/resources/composited-iframe-hidden-subframe.html b/third_party/WebKit/LayoutTests/compositing/resources/composited-iframe-hidden-subframe.html new file mode 100644 index 0000000..aaeefbd8 --- /dev/null +++ b/third_party/WebKit/LayoutTests/compositing/resources/composited-iframe-hidden-subframe.html
@@ -0,0 +1,25 @@ +<!DOCTYPE html> +<style> +.animatedBackground { + width: 70px; + height: 80px; + position: absolute; + background: url("./square-blue-100x100.png") no-repeat 0 0 transparent; + animation: anim 4s steps(6) infinite; +} + +.transformedItem { + transform: translate3d(42px, 43px, 0); + width: 40px; + height: 50px; + background-color: green; +} + +@keyframes anim { + 100% { + background-position: 9px 10px + } +} +</style> +<div class="animatedBackground"></div> +<div class="transformedItem"></div>
diff --git a/third_party/WebKit/LayoutTests/compositing/resources/square-blue-100x100.png b/third_party/WebKit/LayoutTests/compositing/resources/square-blue-100x100.png new file mode 100644 index 0000000..aca6578a --- /dev/null +++ b/third_party/WebKit/LayoutTests/compositing/resources/square-blue-100x100.png Binary files differ
diff --git a/third_party/WebKit/LayoutTests/css3/flexbox/minimum-size-image.html b/third_party/WebKit/LayoutTests/css3/flexbox/minimum-size-image.html new file mode 100644 index 0000000..1840859 --- /dev/null +++ b/third_party/WebKit/LayoutTests/css3/flexbox/minimum-size-image.html
@@ -0,0 +1,70 @@ +<!DOCTYPE html> + +<link href="resources/flexbox.css" rel="stylesheet"> +<script src="../../resources/testharness.js"></script> +<script src="../../resources/testharnessreport.js"></script> +<script src="../../resources/check-layout-th.js"></script> + +<body onload="checkLayout('.flexbox')"> +<div id=log></div> + +<div class="flexbox" style="width: 10px;" data-expected-width="10"> + <!-- should use content width, clamped by converted max-height, as minimum width. --> + <img src="../images/resources/green-100.png" style="max-height: 5px;" + data-expected-width="5" data-expected-height="5"> +</div> + +<div class="flexbox" style="width: 10px;" data-expected-width="10"> + <!-- should use min(specified, content width) = 10px as minimum width, + which the image will shrink to due to default flex-shrink. --> + <img src="../images/resources/green-10.png" style="width: 100px;" data-expected-width="10"> +</div> + + +<div class="flexbox" style="width: 10px;" data-expected-width="10"> + <!-- should use content width, clamped by converted min-height, as minimum width. --> + <img src="../images/resources/green-100.png" style="max-height: 5px;" + data-expected-width="5" data-expected-height="5"> +</div> + +<div class="flexbox" style="width: 10px;" data-expected-width="10"> + <!-- should use content width, clamped by converted min-height, as minimum width. --> + <img src="../images/resources/green-100.png" style="max-height: 5px; min-height: 10px;" + data-expected-width="10" data-expected-height="10"> +</div> + +<div class="flexbox" style="width: 10px;" data-expected-width="10"> + <!-- should use min(transferred, content width) = 10px as minimum width, + which the image will shrink to due to default flex-shrink. --> + <img src="../images/resources/green-10.png" style="height: 100px;" data-expected-width="10"> +</div> + +<div class="flexbox column" style="height: 10px;" data-expected-height="10"> + <!-- should use content height, clamped by converted max-width, as minimum height. --> + <img src="../images/resources/green-100.png" style="max-width: 5px;" + data-expected-width="5" data-expected-height="5"> +</div> + +<div class="flexbox column" style="height: 10px;" data-expected-height="10"> + <!-- should use min(specified, content height) = 10px as minimum height, + which the image will shrink to due to default flex-shrink. --> + <img src="../images/resources/green-10.png" style="height: 100px;" data-expected-height="10"> +</div> + +<div class="flexbox" style="height: 10px;" data-expected-height="10"> + <!-- should use content height, clamped by converted min-height, as minimum height. --> + <img src="../images/resources/green-100.png" style="max-height: 5px;" + data-expected-height="5" data-expected-height="5"> +</div> + +<div class="flexbox" style="height: 10px;" data-expected-height="10"> + <!-- should use content height, clamped by converted min-width, as minimum height. --> + <img src="../images/resources/green-100.png" style="max-width: 5px; min-width: 10px;" + data-expected-height="10" data-expected-width="10"> +</div> + +<div class="flexbox column" style="height: 10px;" data-expected-height="10"> + <!-- should use min(transferred, content height) = 10px as minimum height, + which the image will shrink to due to default flex-shrink. --> + <img src="../images/resources/green-10.png" style="width: 100px;" data-expected-height="10"> +</div>
diff --git a/third_party/WebKit/LayoutTests/fast/css/invalidation/universal-sibling-before-expected.html b/third_party/WebKit/LayoutTests/fast/css/invalidation/universal-sibling-before-expected.html new file mode 100644 index 0000000..2f083ed4 --- /dev/null +++ b/third_party/WebKit/LayoutTests/fast/css/invalidation/universal-sibling-before-expected.html
@@ -0,0 +1,3 @@ +<!DOCTYPE html> +<p>You should see the word PASS below.</p> +PASS
diff --git a/third_party/WebKit/LayoutTests/fast/css/invalidation/universal-sibling-before.html b/third_party/WebKit/LayoutTests/fast/css/invalidation/universal-sibling-before.html new file mode 100644 index 0000000..9948728f9 --- /dev/null +++ b/third_party/WebKit/LayoutTests/fast/css/invalidation/universal-sibling-before.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +<style> +.a + span::before { content: "PA" } +.b + ::before { content: "SS" } +</style> +<p>You should see the word PASS below.</p> +<span id="t1"></span><span></span><span id="t2"></span><span></span> +<script> +document.body.offsetTop; +t1.className = "a"; +t2.className = "b"; +</script>
diff --git a/third_party/WebKit/LayoutTests/harness-tests/mojo-helpers.html b/third_party/WebKit/LayoutTests/harness-tests/mojo-helpers.html index 79cbcec0..c16f63c 100644 --- a/third_party/WebKit/LayoutTests/harness-tests/mojo-helpers.html +++ b/third_party/WebKit/LayoutTests/harness-tests/mojo-helpers.html
@@ -13,59 +13,4 @@ assert_true(mojo.router instanceof Object); assert_true(mojo.serviceRegistry instanceof Object); }, 'Mojo system APIs should be available to layout tests.'); - -mojo_test(mojo => { - return new Promise(resolve => { - // Complete the test as soon as a request comes in for a Frobinator service. - mojo.serviceRegistry.addServiceOverrideForTesting('Frobinator', resolve); - - // Try to connect to the browser's Frobinator service. This should be - // intercepted by the above override. - mojo.serviceRegistry.connectToService('Frobinator'); - }); -}, 'Service registry overrides should be properly intercepted.'); - -mojo_test(mojo => { - return new Promise(resolve => { - let TEST_REQUEST = new Uint8Array([42, 0, 2, 3, 5, 7, 11, 13, 17, 19, 23]); - - mojo.serviceRegistry.addServiceOverrideForTesting('Frobinator', pipe => { - resolve(mojo_wait_for_incoming_message(mojo, pipe) - .then(message => { - assert_array_equals(new Uint8Array(message.buffer), TEST_REQUEST); - assert_array_equals(message.handles, []); - })); - }); - - let pipe = mojo.serviceRegistry.connectToService('Frobinator'); - assert_equals(mojo.core.writeMessage(pipe, TEST_REQUEST, [], 0), - mojo.core.RESULT_OK); - }); -}, 'Mock services can receive messages from test code.'); - -mojo_test(mojo => { - let TEST_REQUEST = new Uint8Array([1, 2, 3, 4, 5]); - let EXPECTED_RESPONSE = new Uint8Array([5, 4, 3, 2, 1]); - - // Mock service should respond to any message with its reverse. - mojo.serviceRegistry.addServiceOverrideForTesting('Reversinator', pipe => { - mojo_wait_for_incoming_message(mojo, pipe) - .then(message => { - let response = new Uint8Array(message.buffer); - response.reverse(); - assert_equals(mojo.core.writeMessage(pipe, response, [], 0), - mojo.core.RESULT_OK); - }); - }); - - let pipe = mojo.serviceRegistry.connectToService('Reversinator'); - assert_equals(mojo.core.writeMessage(pipe, TEST_REQUEST, [], 0), - mojo.core.RESULT_OK); - - return mojo_wait_for_incoming_message(mojo, pipe) - .then(response => { - assert_array_equals(new Uint8Array(response.buffer), EXPECTED_RESPONSE); - assert_array_equals(response.handles, []); - }); -}, 'Test code can receive response messages from mock services.'); </script>
diff --git a/third_party/WebKit/LayoutTests/hittesting/culled-inline-crash.html b/third_party/WebKit/LayoutTests/hittesting/culled-inline-crash.html new file mode 100644 index 0000000..09da680b --- /dev/null +++ b/third_party/WebKit/LayoutTests/hittesting/culled-inline-crash.html
@@ -0,0 +1,31 @@ +<!DOCTYPE html> +<script src="../resources/testharness.js"></script> +<script src="../resources/testharnessreport.js"></script> +<style> +* { + line-height: 12px; +} +li { + position: relative; + padding-top: 0.3px; +} +</style> +<div id="container"> +<ul> +<li><a href="#">HoverHoverHoverHover</a></li> +<li><a href="#">HoverHoverHoverHover</a></li> +<li><a href="#">HoverHoverHoverHover</a></li> +<li><a href="#">HoverHoverHoverHover</a></li> +<li><a href="#">HoverHoverHoverHover</a></li> +<li><a href="#">HoverHoverHoverHover</a></li> +<li><a href="#">HoverHoverHoverHover</a></li> +<li><a href="#">HoverHoverHoverHover</a></li> +</ul> +</div> +<div id="log"></div> +<script> +test(function(t) +{ + assert_equals(document.elementFromPoint(139, 49).tagName, 'A'); +}, "This test passes if it does not crash."); +</script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/inspector/isolated-filesystem-test.js b/third_party/WebKit/LayoutTests/http/tests/inspector/isolated-filesystem-test.js index bf21460..1ac85af 100644 --- a/third_party/WebKit/LayoutTests/http/tests/inspector/isolated-filesystem-test.js +++ b/third_party/WebKit/LayoutTests/http/tests/inspector/isolated-filesystem-test.js
@@ -7,7 +7,7 @@ InspectorTest.TestFileSystem = function(fileSystemPath) { - this.root = new InspectorTest.TestFileSystem.Entry("", true, null); + this.root = new InspectorTest.TestFileSystem.Entry(this, "", true, null); this.fileSystemPath = fileSystemPath; } @@ -50,8 +50,9 @@ } } -InspectorTest.TestFileSystem.Entry = function(name, isDirectory, parent) +InspectorTest.TestFileSystem.Entry = function(fileSystem, name, isDirectory, parent) { + this._fileSystem = fileSystem; this.name = name; this._children = []; this._childrenMap = {}; @@ -66,9 +67,29 @@ return this.parent ? this.parent.fullPath + "/" + this.name : ""; }, + remove: function(success, failure) + { + this._parent._removeChild(this, success, failure); + }, + + _removeChild: function(child, success, failure) + { + var index = this._children.indexOf(child); + if (index === -1) { + failure("Failed to remove file: file not found."); + return; + } + var fullPath = this._fileSystem.fileSystemPath + child.fullPath; + this._children.splice(index, 1); + delete this._childrenMap[child.name]; + child.parent = null; + InspectorFrontendHost.events.dispatchEventToListeners(InspectorFrontendHostAPI.Events.FileSystemFilesChanged, [fullPath]); + success(); + }, + mkdir: function(name) { - var child = new InspectorTest.TestFileSystem.Entry(name, true, this); + var child = new InspectorTest.TestFileSystem.Entry(this._fileSystem, name, true, this); this._childrenMap[name] = child; this._children.push(child); child.parent = this; @@ -77,11 +98,12 @@ addFile: function(name, content) { - var child = new InspectorTest.TestFileSystem.Entry(name, false, this); + var child = new InspectorTest.TestFileSystem.Entry(this._fileSystem, name, false, this); this._childrenMap[name] = child; this._children.push(child); child.parent = this; child.content = new Blob([content], {type: 'text/plain'}); + return child; }, createReader: function()
diff --git a/third_party/WebKit/LayoutTests/http/tests/linkHeader/link-preload-in-js.html b/third_party/WebKit/LayoutTests/http/tests/linkHeader/link-preload-in-js.html new file mode 100644 index 0000000..c8a86003 --- /dev/null +++ b/third_party/WebKit/LayoutTests/http/tests/linkHeader/link-preload-in-js.html
@@ -0,0 +1,14 @@ +<!DOCTYPE html> +<script src="../resources/testharness.js"></script> +<script src="../resources/testharnessreport.js"></script> +<script> + var t = async_test('Makes sure link preload headers are loaded on subresources'); +</script> +<script src="resources/link-preload-js.php"></script> +<script src="../resources/slow-script.pl?delay=200"></script> +<script> + window.addEventListener("load", t.step_func(function() { + assert_equals(performance.getEntriesByType("resource").length, 5); + t.done(); + })); +</script>
diff --git a/third_party/WebKit/LayoutTests/http/tests/linkHeader/resources/link-preload-js.php b/third_party/WebKit/LayoutTests/http/tests/linkHeader/resources/link-preload-js.php new file mode 100644 index 0000000..1765c8d --- /dev/null +++ b/third_party/WebKit/LayoutTests/http/tests/linkHeader/resources/link-preload-js.php
@@ -0,0 +1,3 @@ +<?php +header("Link: <../resources/dummy.js>; rel=preload; as=script"); +?>
diff --git a/third_party/WebKit/LayoutTests/imported/csswg-test/css-writing-modes-3/inline-table-alignment-002-expected.xht b/third_party/WebKit/LayoutTests/imported/csswg-test/css-writing-modes-3/inline-table-alignment-002-expected.xht index 30cb8ca3..912cc73 100644 --- a/third_party/WebKit/LayoutTests/imported/csswg-test/css-writing-modes-3/inline-table-alignment-002-expected.xht +++ b/third_party/WebKit/LayoutTests/imported/csswg-test/css-writing-modes-3/inline-table-alignment-002-expected.xht
@@ -3,7 +3,7 @@ <head> <title>CSS Reftest Reference</title> <link rel="author" title="Hajime Shiozawa" href="mailto:hajime.shiozawa@gmail.com" /> - <link rel="reviewer" title="G?rard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" /> <!-- 2015-08-13 --> + <link rel="reviewer" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" /> <!-- 2015-08-13 --> <meta name="flags" content="image" /> <style type="text/css"><![CDATA[ img
diff --git a/third_party/WebKit/LayoutTests/imported/csswg-test/css-writing-modes-3/inline-table-alignment-002.xht b/third_party/WebKit/LayoutTests/imported/csswg-test/css-writing-modes-3/inline-table-alignment-002.xht index 7fdc8743..8f83af8 100644 --- a/third_party/WebKit/LayoutTests/imported/csswg-test/css-writing-modes-3/inline-table-alignment-002.xht +++ b/third_party/WebKit/LayoutTests/imported/csswg-test/css-writing-modes-3/inline-table-alignment-002.xht
@@ -3,7 +3,7 @@ <head> <title>CSS Writing Modes Test: inline-table alignment - central alignment with vertical layout</title> <link rel="author" title="Hajime Shiozawa" href="mailto:hajime.shiozawa@gmail.com" /> - <link rel="reviewer" title="G?rard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" /> <!-- 2015-08-13 --> + <link rel="reviewer" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" /> <!-- 2015-08-13 --> <link rel="help" title="CSS3 Writing modes: 4.3. Atomic Inline Baseline" href="http://www.w3.org/TR/css-writing-modes-3/#replaced-baselines" /> <link rel="help" title="10.8.1 Leading and half-leading" href="http://www.w3.org/TR/CSS21/visudet.html#leading" /> <link rel="match" href="inline-table-alignment-002-ref.xht" /> @@ -14,7 +14,6 @@ { color: orange; font: 60px/1 Ahem; /* computes to 60px/60px */ - height: 4em; writing-mode: vertical-rl; text-orientation: mixed; }
diff --git a/third_party/WebKit/LayoutTests/imported/csswg-test/css-writing-modes-3/inline-table-alignment-003-expected.xht b/third_party/WebKit/LayoutTests/imported/csswg-test/css-writing-modes-3/inline-table-alignment-003-expected.xht index 0d085df..431a2c6a 100644 --- a/third_party/WebKit/LayoutTests/imported/csswg-test/css-writing-modes-3/inline-table-alignment-003-expected.xht +++ b/third_party/WebKit/LayoutTests/imported/csswg-test/css-writing-modes-3/inline-table-alignment-003-expected.xht
@@ -3,7 +3,7 @@ <head> <title>CSS Reftest Reference</title> <link rel="author" title="Hajime Shiozawa" href="mailto:hajime.shiozawa@gmail.com" /> - <link rel="reviewer" title="G?rard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" /> <!-- 2015-08-13 --> + <link rel="reviewer" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" /> <!-- 2015-08-13 --> <meta name="flags" content="image" /> <style type="text/css"><![CDATA[ img
diff --git a/third_party/WebKit/LayoutTests/imported/csswg-test/css-writing-modes-3/inline-table-alignment-003.xht b/third_party/WebKit/LayoutTests/imported/csswg-test/css-writing-modes-3/inline-table-alignment-003.xht index 7359b12..3fe2349 100644 --- a/third_party/WebKit/LayoutTests/imported/csswg-test/css-writing-modes-3/inline-table-alignment-003.xht +++ b/third_party/WebKit/LayoutTests/imported/csswg-test/css-writing-modes-3/inline-table-alignment-003.xht
@@ -3,7 +3,7 @@ <head> <title>CSS Writing Modes Test: inline-table alignment - central alignment with vertical layout</title> <link rel="author" title="Hajime Shiozawa" href="mailto:hajime.shiozawa@gmail.com" /> - <link rel="reviewer" title="G?rard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" /> <!-- 2015-08-13 --> + <link rel="reviewer" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" /> <!-- 2015-08-13 --> <link rel="help" title="CSS3 Writing modes: 4.3. Atomic Inline Baseline" href="http://www.w3.org/TR/css-writing-modes-3/#replaced-baselines" /> <link rel="help" title="10.8.1 Leading and half-leading" href="http://www.w3.org/TR/CSS21/visudet.html#leading" /> <link rel="match" href="inline-table-alignment-003-ref.xht" /> @@ -14,7 +14,6 @@ { color: orange; font: 60px/1 Ahem; /* computes to 60px/60px */ - height: 4em; writing-mode: vertical-lr; text-orientation: mixed; }
diff --git a/third_party/WebKit/LayoutTests/imported/csswg-test/css-writing-modes-3/inline-table-alignment-004-expected.xht b/third_party/WebKit/LayoutTests/imported/csswg-test/css-writing-modes-3/inline-table-alignment-004-expected.xht index 30cb8ca3..912cc73 100644 --- a/third_party/WebKit/LayoutTests/imported/csswg-test/css-writing-modes-3/inline-table-alignment-004-expected.xht +++ b/third_party/WebKit/LayoutTests/imported/csswg-test/css-writing-modes-3/inline-table-alignment-004-expected.xht
@@ -3,7 +3,7 @@ <head> <title>CSS Reftest Reference</title> <link rel="author" title="Hajime Shiozawa" href="mailto:hajime.shiozawa@gmail.com" /> - <link rel="reviewer" title="G?rard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" /> <!-- 2015-08-13 --> + <link rel="reviewer" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" /> <!-- 2015-08-13 --> <meta name="flags" content="image" /> <style type="text/css"><![CDATA[ img
diff --git a/third_party/WebKit/LayoutTests/imported/csswg-test/css-writing-modes-3/inline-table-alignment-004.xht b/third_party/WebKit/LayoutTests/imported/csswg-test/css-writing-modes-3/inline-table-alignment-004.xht index b4aa280..7190a3e 100644 --- a/third_party/WebKit/LayoutTests/imported/csswg-test/css-writing-modes-3/inline-table-alignment-004.xht +++ b/third_party/WebKit/LayoutTests/imported/csswg-test/css-writing-modes-3/inline-table-alignment-004.xht
@@ -3,7 +3,7 @@ <head> <title>CSS Writing Modes Test: inline-table alignment - central alignment with vertical layout</title> <link rel="author" title="Hajime Shiozawa" href="mailto:hajime.shiozawa@gmail.com" /> - <link rel="reviewer" title="G?rard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" /> <!-- 2015-08-13 --> + <link rel="reviewer" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" /> <!-- 2015-08-13 --> <link rel="help" title="CSS3 Writing modes: 4.3. Atomic Inline Baseline" href="http://www.w3.org/TR/css-writing-modes-3/#replaced-baselines" /> <link rel="help" title="10.8.1 Leading and half-leading" href="http://www.w3.org/TR/CSS21/visudet.html#leading" /> <link rel="match" href="inline-table-alignment-002-ref.xht" /> @@ -14,7 +14,6 @@ { color: orange; font: 60px/1 Ahem; /* computes to 60px/60px */ - height: 4em; writing-mode: vertical-rl; text-orientation: upright; }
diff --git a/third_party/WebKit/LayoutTests/imported/csswg-test/css-writing-modes-3/inline-table-alignment-005-expected.xht b/third_party/WebKit/LayoutTests/imported/csswg-test/css-writing-modes-3/inline-table-alignment-005-expected.xht index 0d085df..431a2c6a 100644 --- a/third_party/WebKit/LayoutTests/imported/csswg-test/css-writing-modes-3/inline-table-alignment-005-expected.xht +++ b/third_party/WebKit/LayoutTests/imported/csswg-test/css-writing-modes-3/inline-table-alignment-005-expected.xht
@@ -3,7 +3,7 @@ <head> <title>CSS Reftest Reference</title> <link rel="author" title="Hajime Shiozawa" href="mailto:hajime.shiozawa@gmail.com" /> - <link rel="reviewer" title="G?rard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" /> <!-- 2015-08-13 --> + <link rel="reviewer" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" /> <!-- 2015-08-13 --> <meta name="flags" content="image" /> <style type="text/css"><![CDATA[ img
diff --git a/third_party/WebKit/LayoutTests/imported/csswg-test/css-writing-modes-3/inline-table-alignment-005.xht b/third_party/WebKit/LayoutTests/imported/csswg-test/css-writing-modes-3/inline-table-alignment-005.xht index 7d12c3b1..9f798bc 100644 --- a/third_party/WebKit/LayoutTests/imported/csswg-test/css-writing-modes-3/inline-table-alignment-005.xht +++ b/third_party/WebKit/LayoutTests/imported/csswg-test/css-writing-modes-3/inline-table-alignment-005.xht
@@ -3,7 +3,7 @@ <head> <title>CSS Writing Modes Test: inline-table alignment - central alignment with vertical layout</title> <link rel="author" title="Hajime Shiozawa" href="mailto:hajime.shiozawa@gmail.com" /> - <link rel="reviewer" title="G?rard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" /> <!-- 2015-08-13 --> + <link rel="reviewer" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" /> <!-- 2015-08-13 --> <link rel="help" title="CSS3 Writing modes: 4.3. Atomic Inline Baseline" href="http://www.w3.org/TR/css-writing-modes-3/#replaced-baselines" /> <link rel="help" title="10.8.1 Leading and half-leading" href="http://www.w3.org/TR/CSS21/visudet.html#leading" /> <link rel="match" href="inline-table-alignment-003-ref.xht" /> @@ -14,7 +14,6 @@ { color: orange; font: 60px/1 Ahem; /* computes to 60px/60px */ - height: 4em; writing-mode: vertical-lr; text-orientation: upright; }
diff --git a/third_party/WebKit/LayoutTests/imported/csswg-test/css-writing-modes-3/support/tcu-font.otf b/third_party/WebKit/LayoutTests/imported/csswg-test/css-writing-modes-3/support/tcu-font.otf new file mode 100644 index 0000000..d6e6e7f --- /dev/null +++ b/third_party/WebKit/LayoutTests/imported/csswg-test/css-writing-modes-3/support/tcu-font.otf Binary files differ
diff --git a/third_party/WebKit/LayoutTests/imported/csswg-test/css-writing-modes-3/table-progression-vlr-003.html b/third_party/WebKit/LayoutTests/imported/csswg-test/css-writing-modes-3/table-progression-vlr-003.html index cca9c66..d4b2b81 100644 --- a/third_party/WebKit/LayoutTests/imported/csswg-test/css-writing-modes-3/table-progression-vlr-003.html +++ b/third_party/WebKit/LayoutTests/imported/csswg-test/css-writing-modes-3/table-progression-vlr-003.html
@@ -1,6 +1,7 @@ <!DOCTYPE html> <title>CSS Test: vertical-lr upright orientation Table Row/Rowgroup/Cell Ordering</title> <link rel="author" title="Elika J. Etemad" href="http://fantasai.inkedblade.net/contact"> +<link rel="reviewer" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/"> <!-- 2016-01-19 --> <link rel="match" href="table-progression-001-ref.html"> <meta name="assert" content="This test checks that vertical-lr tables, whether LTR or RTL, order rows/rowgroups right to left and cells top-to-bottom when text-orientation is upright."> <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#block-flow" title="3.1 Block Flow Direction: the 'writing-mode' property"> @@ -68,28 +69,28 @@ <table class="test" dir=rtl> <thead> <tr> - <td class="teal"> - <td class="aqua"> <td colspan=2> + <td class="aqua"> + <td class="teal"> <tfoot> <tr> - <td colspan=2> - <td class="blue"> <td class="navy"> + <td class="blue"> + <td colspan=2> <tbody> <tr> - <td colspan=3> <td class="orng"> + <td colspan=3> <tbody> <tr> - <td rowspan=2 colspan=2> - <td class="yllw"> <td rowspan=3> + <td class="yllw"> + <td rowspan=2 colspan=2> <tr> <td class="pink"> <tr> - <td class="purp"> <td colspan=2> + <td class="purp"> </table> <table class="reference">
diff --git a/third_party/WebKit/LayoutTests/imported/csswg-test/css-writing-modes-3/table-progression-vrl-003.html b/third_party/WebKit/LayoutTests/imported/csswg-test/css-writing-modes-3/table-progression-vrl-003.html index 3e3530f..94357ef 100644 --- a/third_party/WebKit/LayoutTests/imported/csswg-test/css-writing-modes-3/table-progression-vrl-003.html +++ b/third_party/WebKit/LayoutTests/imported/csswg-test/css-writing-modes-3/table-progression-vrl-003.html
@@ -1,6 +1,7 @@ <!DOCTYPE html> <title>CSS Test: vertical-rl upright orientation Table Row/Rowgroup/Cell Ordering</title> <link rel="author" title="Elika J. Etemad" href="http://fantasai.inkedblade.net/contact"> +<link rel="reviewer" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/"> <!-- 2016-01-19 --> <link rel="match" href="table-progression-001-ref.html"> <meta name="assert" content="This test checks that vertical-rl tables, whether LTR or RTL, order rows/rowgroups right to left and cells top-to-bottom when text-orientation is upright."> <link rel="help" href="http://www.w3.org/TR/css-writing-modes-3/#block-flow" title="3.1 Block Flow Direction: the 'writing-mode' property"> @@ -68,28 +69,28 @@ <table class="test" dir=rtl> <thead> <tr> - <td colspan=2> - <td class="blue"> <td class="navy"> + <td class="blue"> + <td colspan=2> <tfoot> <tr> - <td class="teal"> - <td class="aqua"> <td colspan=2> + <td class="aqua"> + <td class="teal"> <tbody> <tr> - <td class="purp"> - <td colspan=2> <td rowspan=3> + <td colspan=2> + <td class="purp"> <tr> - <td rowspan=2 colspan=2> <td class="pink"> + <td rowspan=2 colspan=2> <tr> <td class="yllw"> <tbody> <tr> - <td colspan=3> <td class="orng"> + <td colspan=3> </table> <table class="reference">
diff --git a/third_party/WebKit/LayoutTests/imported/csswg-test/css-writing-modes-3/vertical-alignment-007.xht b/third_party/WebKit/LayoutTests/imported/csswg-test/css-writing-modes-3/vertical-alignment-007.xht index 1deaa9f..0cb6211 100644 --- a/third_party/WebKit/LayoutTests/imported/csswg-test/css-writing-modes-3/vertical-alignment-007.xht +++ b/third_party/WebKit/LayoutTests/imported/csswg-test/css-writing-modes-3/vertical-alignment-007.xht
@@ -3,7 +3,7 @@ <head> <title>CSS Writing Modes Test: vertical-align - 'text-bottom' and vertical-lr writing-mode</title> <link rel="author" title="Hajime Shiozawa" href="mailto:hajime.shiozawa@gmail.com" /> - <link rel="reviewer" title="G?rard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" /> <!-- 2015-09-03 --> + <link rel="reviewer" title="Gérard Talbot" href="http://www.gtalbot.org/BrowserBugsSection/css21testsuite/" /> <!-- 2015-09-03 --> <link rel="help" title="7.5 Line-Relative Mappings" href="http://www.w3.org/TR/css-writing-modes-3/#line-mappings" /> <link rel="help" title="10.8.1 Leading and half-leading" href="http://www.w3.org/TR/2011/REC-CSS2-20110607/visudet.html#leading" /> <meta name="assert" content="This test checks the position of an inline non-replaced box with vertical align property. When 'writing-mode' is 'vertical-lr', 'vertical-align' is 'text-bottom', the physical left (logical bottom) edge of an inline non-replaced box is aligned with the left side (logical bottom) of parent's content area." />
diff --git a/third_party/WebKit/LayoutTests/inspector/sass/sass-test.js b/third_party/WebKit/LayoutTests/inspector/sass/sass-test.js index 3714f7480..96eb57f 100644 --- a/third_party/WebKit/LayoutTests/inspector/sass/sass-test.js +++ b/third_party/WebKit/LayoutTests/inspector/sass/sass-test.js
@@ -2,10 +2,67 @@ InspectorTest.preloadModule("sass"); -InspectorTest.loadSourceMap = function(header, callback) +var sassWorkspaceAdapter = null; +InspectorTest.sassWorkspaceAdapter = function() { + if (!sassWorkspaceAdapter) + sassWorkspaceAdapter = new WebInspector.SASSWorkspaceAdapter(InspectorTest.cssModel, WebInspector.workspace, WebInspector.networkMapping); + return sassWorkspaceAdapter; +} + +var cssParser = null; + +InspectorTest.cssParser = function() +{ + if (!cssParser) + cssParser = new WebInspector.CSSParser(); + return cssParser; +} + +InspectorTest.parseCSS = function(url, text) +{ + return WebInspector.SASSSupport.parseCSS(InspectorTest.cssParser(), url, text); +} + +InspectorTest.parseSCSS = function(url, text) +{ + return self.runtime.instancePromise(WebInspector.TokenizerFactory) + .then(onTokenizer); + + function onTokenizer(tokenizer) + { + return WebInspector.SASSSupport.parseSCSS(url, text, tokenizer); + } +} + +InspectorTest.loadASTMapping = function(header, callback) +{ + console.assert(header.cssModel() === InspectorTest.sassWorkspaceAdapter()._cssModel, "The header could not be processed by main target workspaceAdapter"); + var tokenizerFactory = null; + var sourceMap = null; + var completeSourceMapURL = WebInspector.ParsedURL.completeURL(header.sourceURL, header.sourceMapURL); - WebInspector.SourceMap.load(completeSourceMapURL, header.sourceURL, callback); + WebInspector.SourceMap.load(completeSourceMapURL, header.sourceURL, onSourceMapLoaded); + + self.runtime.instancePromise(WebInspector.TokenizerFactory) + .then(tf => tokenizerFactory = tf) + .then(maybeStartLoading); + + function onSourceMapLoaded(sm) + { + sourceMap = sm; + maybeStartLoading(); + } + + function maybeStartLoading() + { + if (!sourceMap || !tokenizerFactory) + return; + var client = InspectorTest.sassWorkspaceAdapter().trackSources(sourceMap); + WebInspector.SASSLiveSourceMap._loadMapping(client, InspectorTest.cssParser(), tokenizerFactory, sourceMap) + .then(callback) + .then(() => client.dispose()) + } } InspectorTest.dumpAST = function(ast) @@ -140,7 +197,7 @@ } } -InspectorTest.validateMapping = function(mapping, cssAST, sassModels) +InspectorTest.validateMapping = function(mapping) { InspectorTest.addResult("Mapped CSS: " + mapping._cssToSass.size); InspectorTest.addResult("Mapped SCSS: " + mapping._sassToCss.size); @@ -149,9 +206,9 @@ var staleSASS = 0; for (var i = 0; i < cssNodes.length; ++i) { var cssNode = cssNodes[i]; - staleCSS += cssNode.document !== cssAST.document ? 1 : 0; + staleCSS += cssNode.document !== mapping.cssAST().document ? 1 : 0; var sassNode = mapping.toSASSNode(cssNode); - var sassAST = sassModels.get(sassNode.document.url); + var sassAST = mapping.sassModels().get(sassNode.document.url); staleSASS += sassNode.document !== sassAST.document ? 1 : 0; } if (staleCSS || staleSASS) { @@ -163,24 +220,17 @@ } } -InspectorTest.parseSCSS = function(url, text) +InspectorTest.updateCSSText = function(url, newText) { - return self.runtime.instancePromise(WebInspector.TokenizerFactory) - .then(onTokenizer); - - function onTokenizer(tokenizer) - { - return WebInspector.SASSSupport.parseSCSS(url, text, tokenizer); - } + var styleSheetIds = InspectorTest.cssModel.styleSheetIdsForURL(url) + var promises = styleSheetIds.map(id => InspectorTest.cssModel.setStyleSheetText(id, newText, true)); + return Promise.all(promises); } -var cssParser = null; - -InspectorTest.parseCSS = function(url, text) +InspectorTest.updateSASSText = function(url, newText) { - if (!cssParser) - cssParser = new WebInspector.CSSParser(); - return WebInspector.SASSSupport.parseCSS(cssParser, url, text); + var uiSourceCode = WebInspector.workspace.uiSourceCodeForURL(url); + uiSourceCode.addRevision(newText); } }
diff --git a/third_party/WebKit/LayoutTests/inspector/sass/test-mapping-bad-expected.txt b/third_party/WebKit/LayoutTests/inspector/sass/test-mapping-bad-expected.txt index bc22b47f..869a65a 100644 --- a/third_party/WebKit/LayoutTests/inspector/sass/test-mapping-bad-expected.txt +++ b/third_party/WebKit/LayoutTests/inspector/sass/test-mapping-bad-expected.txt
@@ -1 +1,4 @@ Verify that mapping is not valid for misaligned sources. + +OK: the mapping successfully reported misalignment. +
diff --git a/third_party/WebKit/LayoutTests/inspector/sass/test-mapping-bad.html b/third_party/WebKit/LayoutTests/inspector/sass/test-mapping-bad.html index a7fc2ffd..9f45628d 100644 --- a/third_party/WebKit/LayoutTests/inspector/sass/test-mapping-bad.html +++ b/third_party/WebKit/LayoutTests/inspector/sass/test-mapping-bad.html
@@ -11,43 +11,14 @@ function test() { var header = InspectorTest.cssModel.styleSheetHeaders().find(header => !!header.sourceMapURL) - InspectorTest.loadSourceMap(header, onSourceMapLoaded); - InspectorTest.waitForScriptSource("test-mapping-bad.css", onCSSLoaded); - InspectorTest.waitForScriptSource("test-mapping-bad.scss", onSCSSLoaded); + InspectorTest.loadASTMapping(header, onMapping); - var cssAST; - var sassModels = new Map(); - var sourceMap; - - function onCSSLoaded(uiSourceCode) + function onMapping(mapping) { - uiSourceCode.requestContent() - .then(text => InspectorTest.parseCSS(uiSourceCode.url(), text)) - .then(ast => cssAST = ast) - .then(maybeCreateMapping); - } - - function onSCSSLoaded(uiSourceCode) - { - uiSourceCode.requestContent() - .then(text => InspectorTest.parseSCSS(uiSourceCode.url(), text)) - .then(ast => sassModels.set(ast.document.url, ast)) - .then(maybeCreateMapping); - } - - function onSourceMapLoaded(sm) - { - sourceMap = sm; - maybeCreateMapping(); - } - - function maybeCreateMapping() - { - if (!cssAST || !sassModels.size || !sourceMap) - return; - var mapping = WebInspector.SASSLiveSourceMap.CSSToSASSMapping.fromSourceMap(sourceMap, cssAST, sassModels); if (mapping.isValid()) { InspectorTest.addResult("ERROR: a valid mapping created for misaligned sourcemap."); + } else { + InspectorTest.addResult("OK: the mapping successfully reported misalignment."); } InspectorTest.completeTest(); }
diff --git a/third_party/WebKit/LayoutTests/inspector/sass/test-mapping-good.html b/third_party/WebKit/LayoutTests/inspector/sass/test-mapping-good.html index 1b3079d..2a8390f 100644 --- a/third_party/WebKit/LayoutTests/inspector/sass/test-mapping-good.html +++ b/third_party/WebKit/LayoutTests/inspector/sass/test-mapping-good.html
@@ -10,71 +10,42 @@ function test() { - var header = InspectorTest.cssModel.styleSheetHeaders().find(header => !!header.sourceMapURL) - InspectorTest.loadSourceMap(header, onSourceMapLoaded); - InspectorTest.waitForScriptSource("test-mapping-good.css", onCSSLoaded); - InspectorTest.waitForScriptSource("test-mapping-good.scss", onSCSSLoaded); - - var cssAST; - var sassModels = new Map(); - var sourceMap; var mapping; - function onCSSLoaded(uiSourceCode) - { - uiSourceCode.requestContent() - .then(text => InspectorTest.parseCSS(uiSourceCode.url(), text)) - .then(ast => cssAST = ast) - .then(maybeCreateMapping); - } + var header = InspectorTest.cssModel.styleSheetHeaders().find(header => !!header.sourceMapURL); + InspectorTest.loadASTMapping(header, onMappingLoaded); - function onSCSSLoaded(uiSourceCode) + function onMappingLoaded(map) { - uiSourceCode.requestContent() - .then(text => InspectorTest.parseSCSS(uiSourceCode.url(), text)) - .then(ast => sassModels.set(ast.document.url, ast)) - .then(maybeCreateMapping); - } - - function onSourceMapLoaded(sm) - { - sourceMap = sm; - maybeCreateMapping(); - } - - function maybeCreateMapping() - { - if (!cssAST || !sassModels.size || !sourceMap) - return; - mapping = WebInspector.SASSLiveSourceMap.CSSToSASSMapping.fromSourceMap(sourceMap, cssAST, sassModels); + mapping = map; if (!mapping.isValid()) { InspectorTest.addResult("ERROR: mapping is not valid."); InspectorTest.completeTest(); return; } - InspectorTest.validateMapping(mapping, cssAST, sassModels); + InspectorTest.validateMapping(mapping); InspectorTest.runTestSuite(testSuite); } var testSuite = [ function testCSSRebase(next) { - var cssClone = cssAST.clone(); + var cssClone = mapping.cssAST().clone(); cssClone.rules[0].properties[1].remove(); - var cssDiff = WebInspector.SASSSupport.diffModels(cssAST, cssClone); + var cssDiff = WebInspector.SASSSupport.diffModels(mapping.cssAST(), cssClone); var newMapping = mapping.rebaseForCSSDiff(cssDiff); if (!newMapping.isValid()) { InspectorTest.addResult("ERROR: mapping is not valid."); InspectorTest.completeTest(); return; } - InspectorTest.validateMapping(newMapping, cssClone, sassModels); + InspectorTest.validateMapping(newMapping); next(); }, function testSCSSRebase(next) { - var sassAST = sassModels.valuesArray()[0]; + var sassAST = mapping.sassModels().valuesArray()[0]; var sassClone = sassAST.clone(); sassClone.rules[1].properties[2].remove(); sassClone.rules[1].properties[1].remove(); @@ -85,9 +56,7 @@ InspectorTest.completeTest(); return; } - var sassModelsClone = new Map(); - sassModelsClone.set(sassClone.document.url, sassClone); - InspectorTest.validateMapping(newMapping, cssAST, sassModelsClone); + InspectorTest.validateMapping(newMapping); next(); }, ];
diff --git a/third_party/WebKit/LayoutTests/inspector/sass/test-workspace-adapter-expected.txt b/third_party/WebKit/LayoutTests/inspector/sass/test-workspace-adapter-expected.txt new file mode 100644 index 0000000..b230107 --- /dev/null +++ b/third_party/WebKit/LayoutTests/inspector/sass/test-workspace-adapter-expected.txt
@@ -0,0 +1,73 @@ +Verify SourceMapTracker functionality. + + +Running: loadFileSystemResources + +Running: loadCSSResources + +Running: mutateCSS + -- TRACKER 1 -- SourceChanged event: all.css + -- TRACKER 1 -- SourceChanged event: all.css +== Outdated == +TRACKER 1: true +TRACKER 2: false + -- TRACKER 2 -- SourceChanged event: print.css +== Outdated == +TRACKER 1: true +TRACKER 2: true +== Contents == +content of print.css: <all.css update 1> +content of print.css: <print.css update 1> +== Outdated == +TRACKER 1: false +TRACKER 2: false + +Running: mutateSASS + -- TRACKER 1 -- SourceChanged event: file:///var/www/a.scss +== Outdated == +TRACKER 1: true +TRACKER 2: false + -- TRACKER 2 -- SourceChanged event: file:///var/www/b.scss +== Outdated == +TRACKER 1: true +TRACKER 2: true +== Contents == +content of file:///var/www/b.scss: <a.scss update 1> +content of file:///var/www/b.scss: <b.scss update 1> +== Outdated == +TRACKER 1: false +TRACKER 2: false + +Running: mutateSASSCommon + -- TRACKER 1 -- SourceChanged event: file:///var/www/common.scss + -- TRACKER 2 -- SourceChanged event: file:///var/www/common.scss +== Outdated == +TRACKER 1: true +TRACKER 2: true +== Contents == +content of file:///var/www/common.scss: <common.scss update 1> +content of file:///var/www/common.scss: <common.scss update 1> +== Outdated == +TRACKER 1: false +TRACKER 2: false + +Running: trackerSetCSS +tracker1.setCSSText result: true +tracker2.setCSSText result: true +== Contents == +content of print.css: <all.css TRACKER 1> +content of print.css: <print.css TRACKER 2> + +Running: trackerSetSASSCommon +tracker1.setSASSText result: true + -- TRACKER 2 -- SourceChanged event: file:///var/www/common.scss +== Outdated == +TRACKER 1: false +TRACKER 2: true + +Running: removeFirstTrackerStyleSheets + -- TRACKER 1 -- TrackingStopped + +Running: removeSecondTrackerStyleSheets + -- TRACKER 2 -- TrackingStopped +
diff --git a/third_party/WebKit/LayoutTests/inspector/sass/test-workspace-adapter.html b/third_party/WebKit/LayoutTests/inspector/sass/test-workspace-adapter.html new file mode 100644 index 0000000..9243eedc --- /dev/null +++ b/third_party/WebKit/LayoutTests/inspector/sass/test-workspace-adapter.html
@@ -0,0 +1,189 @@ +<html> +<head> + +<script src="../../http/tests/inspector/inspector-test.js"></script> +<script src="../../http/tests/inspector/debugger-test.js"></script> +<script src="../../http/tests/inspector/isolated-filesystem-test.js"></script> +<script src="./sass-test.js"></script> +<script> + +var styles = []; +function addStyleSheets() +{ + for (var i = 0; i < 2; ++i) { + var style = document.createElement("style"); + style.textContent = "<all.css content>\n/*# sourceURL=all.css */"; + document.head.appendChild(style); + styles.push(style); + } + + var style = document.createElement("style"); + style.textContent = "<print.css content>\n/*# sourceURL=print.css */"; + document.head.appendChild(style); + styles.push(style); +} + +function removeStyles(amount) +{ + for (var i = 0; i < amount; ++i) + styles.shift().remove(); +} + +function test() +{ + function createTracker(trackerName, cssURL, sassURLs) + { + var sources = sassURLs; + var fakeSourceMap = { + sources: () => sources, + compiledURL: () => cssURL + }; + var tracker = InspectorTest.sassWorkspaceAdapter().trackSources(fakeSourceMap); + tracker.__NAME = trackerName; + tracker.addEventListener(WebInspector.SourceMapTracker.Events.SourceChanged, onSourceChanged); + tracker.addEventListener(WebInspector.SourceMapTracker.Events.TrackingStopped, onTrackingStopped); + return tracker; + + function onSourceChanged(event) + { + InspectorTest.addResult(" -- " + event.target.__NAME + " -- SourceChanged event: " + event.data); + } + + function onTrackingStopped(event) + { + InspectorTest.addResult(" -- " + event.target.__NAME + " -- TrackingStopped"); + } + } + + var fileSystemPrefix = "file:///var/www"; + var css1 = "all.css"; + var css2 = "print.css"; + var sass1 = fileSystemPrefix + "/a.scss"; + var sass2 = fileSystemPrefix + "/b.scss"; + var sassCommon = fileSystemPrefix + "/common.scss"; + var tracker1 = createTracker("TRACKER 1", css1, [sass1, sassCommon]); + var tracker2 = createTracker("TRACKER 2", css2, [sass2, sassCommon]); + + InspectorTest.runTestSuite([ + function loadFileSystemResources(next) + { + var fs = new InspectorTest.TestFileSystem(fileSystemPrefix); + fs.addFileMapping(fileSystemPrefix, "/"); + fs.root.addFile("common.scss", "<common.scss content>"); + fs.root.addFile("a.scss", "<a.scss content>"); + fs.root.addFile("b.scss", "<b.scss content>"); + fs.reportCreated(next); + }, + + function loadCSSResources(next) + { + InspectorTest.evaluateInPage("addStyleSheets()", next); + }, + + function mutateCSS(next) + { + InspectorTest.updateCSSText(css1, "<all.css update 1>") + .then(checkOutdated) + .then(() => InspectorTest.updateCSSText(css2, "<print.css update 1>")) + .then(checkOutdated) + .then(() => requestContent([css1], [css2])) + .then(checkOutdated) + .then(next); + }, + + function mutateSASS(next) + { + InspectorTest.updateSASSText(sass1, "<a.scss update 1>"); + checkOutdated(); + InspectorTest.updateSASSText(sass2, "<b.scss update 1>"); + checkOutdated(); + requestContent([sass1], [sass2]) + .then(checkOutdated) + .then(next); + }, + + function mutateSASSCommon(next) + { + InspectorTest.updateSASSText(sassCommon, "<common.scss update 1>"); + checkOutdated(); + requestContent([sassCommon], [sassCommon]) + .then(checkOutdated) + .then(next); + }, + + function trackerSetCSS(next) + { + var result = tracker1.setCSSText("<all.css TRACKER 1>", []); + InspectorTest.addResult("tracker1.setCSSText result: " + result); + var result = tracker2.setCSSText("<print.css TRACKER 2>", []); + InspectorTest.addResult("tracker2.setCSSText result: " + result); + requestContent([css1], [css2]) + .then(next); + }, + + function trackerSetSASSCommon(next) + { + var result = tracker1.setSASSText(sassCommon, "<common.scss TRACKER 1>"); + InspectorTest.addResult("tracker1.setSASSText result: " + result); + awaitSourceChanges(tracker2, sassCommon) + .then(checkOutdated) + .then(next); + }, + + function removeFirstTrackerStyleSheets(next) + { + InspectorTest.evaluateInPage("removeStyles(2)", next); + }, + + function removeSecondTrackerStyleSheets(next) + { + InspectorTest.evaluateInPage("removeStyles(1)", next); + }, + ]); + + function awaitSourceChanges(tracker, url) + { + var callback; + var promise = new Promise(fulfill => callback = fulfill); + tracker.addEventListener(WebInspector.SourceMapTracker.Events.SourceChanged, onSourceChanged); + return promise; + + function onSourceChanged(event) + { + if (event.data !== url) + return; + tracker.removeEventListener(WebInspector.SourceMapTracker.Events.SourceChanged, onSourceChanged); + callback(); + } + } + + function checkOutdated() + { + InspectorTest.addResult("== Outdated =="); + InspectorTest.addResult(tracker1.__NAME + ": " + tracker1.isOutdated()); + InspectorTest.addResult(tracker2.__NAME + ": " + tracker2.isOutdated()); + } + + function requestContent(urls1, urls2) + { + InspectorTest.addResult("== Contents =="); + urls1 = urls1 || []; + urls2 = urls2 || []; + var onContent = (url, content) => InspectorTest.addResult("content of " + url + ": " + content); + var promises = []; + for (var url of urls1) + promises.push(tracker1.content(url).then(text => onContent(url, text))); + for (var url of urls2) + promises.push(tracker2.content(url).then(text => onContent(url, text))); + return Promise.all(promises); + } +} + +</script> + +</head> + +<body onload="runTest()"> +<p>Verify SourceMapTracker functionality.</p> +</body> +</html>
diff --git a/third_party/WebKit/LayoutTests/resources/mojo-helpers.js b/third_party/WebKit/LayoutTests/resources/mojo-helpers.js index 625d7fd..8752dd1 100644 --- a/third_party/WebKit/LayoutTests/resources/mojo-helpers.js +++ b/third_party/WebKit/LayoutTests/resources/mojo-helpers.js
@@ -35,25 +35,3 @@ }); }, name, properties); } - -// Polls aggressively for a message to become available on a pipe. -function mojo_wait_for_incoming_message(mojo, pipe) { - return new Promise((resolve, reject) => { - let wait = () => { - let result = mojo.core.readMessage(pipe, 0); - if (result.result === mojo.core.RESULT_SHOULD_WAIT) { - setTimeout(wait); - return; - } - - if (result.result !== mojo.core.RESULT_OK) { - reject(result.result); - return; - } - - resolve({ buffer: result.buffer, handles: result.handles }); - }; - - wait(); - }); -};
diff --git a/third_party/WebKit/LayoutTests/transforms/translate-expected.html b/third_party/WebKit/LayoutTests/transforms/translate-expected.html index 6ef8857..38867ca23 100644 --- a/third_party/WebKit/LayoutTests/transforms/translate-expected.html +++ b/third_party/WebKit/LayoutTests/transforms/translate-expected.html
@@ -7,7 +7,6 @@ } .container { transform: translate(100px, 100px); - background-color: red; transform-style: preserve-3d; perspective-origin: 150% 150%; perspective: 500px; @@ -19,12 +18,17 @@ transform: translate3d(100%, -200%, -500px); } #box3 { + transform: translate3d(0px, 0px, 10em); +} +#box4 { transform: translate(300px); } </style> <div class="container"> + container <div id="box1">1</div> <div id="box2">2</div> + <div id="box3">3</div> </div> -<div id="box3">3</div> +<div id="box4">4</div>
diff --git a/third_party/WebKit/LayoutTests/transforms/translate.html b/third_party/WebKit/LayoutTests/transforms/translate.html index 8ba9c745..09a7b398 100644 --- a/third_party/WebKit/LayoutTests/transforms/translate.html +++ b/third_party/WebKit/LayoutTests/transforms/translate.html
@@ -7,7 +7,7 @@ } .container { translate: 100px 100px; - background-color: red; + transform-style: preserve-3d; perspective-origin: 150% 150%; perspective: 500px; } @@ -18,12 +18,17 @@ translate: 100% -200% -500px; } #box3 { + translate: 0px 0px 10em; +} +#box4 { translate: 300px; } </style> <div class="container"> + container <div id="box1">1</div> <div id="box2">2</div> + <div id="box3">3</div> </div> -<div id="box3">3</div> +<div id="box4">4</div>
diff --git a/third_party/WebKit/LayoutTests/typedcssom/calcLength.html b/third_party/WebKit/LayoutTests/typedcssom/calcLength.html index e8ee3f48..7180dc1 100644 --- a/third_party/WebKit/LayoutTests/typedcssom/calcLength.html +++ b/third_party/WebKit/LayoutTests/typedcssom/calcLength.html
@@ -36,40 +36,23 @@ }, 'Test that subtracting two CalcLengths produces a new CalcLength with the correct values.'); test(function() { - var calcLength = new CalcLength({px: 1, percent: 5.2}); - var result = calcLength.multiply(3); + var calcLength = new CalcLength({px: 1, percent: 5.2}); + var result = calcLength.multiply(3); - assert_not_equals(calcLength, result); - assert_equals(result.px, 3); - assert_approx_equals(result.percent, 15.6, 0.000001); + assert_not_equals(calcLength, result); + assert_equals(result.px, 3); + assert_approx_equals(result.percent, 15.6, 0.000001); }, 'Test that multiplying a CalcLength produces a new CalcLength with the correct values.'); test(function() { - var calcLength = new CalcLength({px: 3, percent: 15.6}); - var result = calcLength.divide(3); + var calcLength = new CalcLength({px: 3, percent: 15.6}); + var result = calcLength.divide(3); - assert_not_equals(calcLength, result); - assert_equals(result.px, 1); - assert_equals(result.percent, 5.2); + assert_not_equals(calcLength, result); + assert_equals(result.px, 1); + assert_equals(result.percent, 5.2); }, 'Test that dividing a CalcLength produces a new CalcLength with the correct values.'); -test(function() { - var values = [ - {input: new CalcLength({px: 1}), cssString: 'calc(1px)'}, - {input: new CalcLength({px: -1}), cssString: 'calc(-1px)'}, - {input: new CalcLength({px: 1, percent: 15.6}), cssString: 'calc(1px + 15.6%)'}, - {input: new CalcLength({px: 1, percent: -15.6}), cssString: 'calc(1px - 15.6%)'}, - {input: new CalcLength({px: -1, percent: -15.6}), cssString: 'calc(-1px - 15.6%)'}, - {input: new CalcLength({px: -1, percent: -15.6, vw: 5}), cssString: 'calc((-1px - 15.6%) + 5vw)'}, - {input: new CalcLength({px: -1, percent: -15.6, vw: -5}), cssString: 'calc((-1px - 15.6%) - 5vw)'}, - ]; - - for (var i = 0; i < values.length; ++i) { - assert_equals(values[i].input.cssString, values[i].cssString); - } - -}, 'Test that the CSS string method for a CalcLength produces the correct result'); - </script> <body>
diff --git a/third_party/WebKit/LayoutTests/virtual/stable/webexposed/element-instance-property-listing-expected.txt b/third_party/WebKit/LayoutTests/virtual/stable/webexposed/element-instance-property-listing-expected.txt index 27b5c10..4c485d0e 100644 --- a/third_party/WebKit/LayoutTests/virtual/stable/webexposed/element-instance-property-listing-expected.txt +++ b/third_party/WebKit/LayoutTests/virtual/stable/webexposed/element-instance-property-listing-expected.txt
@@ -637,6 +637,7 @@ property type property value html element link + property as property charset property crossOrigin property disabled @@ -646,6 +647,7 @@ property integrity property media property rel + property relList property rev property sheet property sizes
diff --git a/third_party/WebKit/LayoutTests/virtual/stable/webexposed/global-interface-listing-expected.txt b/third_party/WebKit/LayoutTests/virtual/stable/webexposed/global-interface-listing-expected.txt index 7cb1098..ea15247 100644 --- a/third_party/WebKit/LayoutTests/virtual/stable/webexposed/global-interface-listing-expected.txt +++ b/third_party/WebKit/LayoutTests/virtual/stable/webexposed/global-interface-listing-expected.txt
@@ -1960,6 +1960,7 @@ method constructor setter align interface HTMLLinkElement : HTMLElement + getter as getter charset getter crossOrigin getter disabled @@ -1969,12 +1970,14 @@ getter integrity getter media getter rel + getter relList getter rev getter sheet getter sizes getter target getter type method constructor + setter as setter charset setter crossOrigin setter disabled
diff --git a/third_party/WebKit/Source/bindings/core/v8/custom/V8InjectedScriptManager.cpp b/third_party/WebKit/Source/bindings/core/v8/custom/V8InjectedScriptManager.cpp deleted file mode 100644 index 3e3d2bc..0000000 --- a/third_party/WebKit/Source/bindings/core/v8/custom/V8InjectedScriptManager.cpp +++ /dev/null
@@ -1,79 +0,0 @@ -/* - * Copyright (C) 2012 Google Inc. All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * * Neither the name of Google Inc. nor the names of its - * contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include "core/inspector/InjectedScriptManager.h" - -#include "bindings/core/v8/V8Binding.h" -#include "bindings/core/v8/V8ScriptRunner.h" -#include "core/inspector/InjectedScriptHost.h" -#include "core/inspector/InjectedScriptNative.h" -#include "core/inspector/v8/V8InjectedScriptHost.h" -#include "wtf/RefPtr.h" - -namespace blink { - -v8::Local<v8::Object> InjectedScriptManager::createInjectedScript(const String& scriptSource, v8::Local<v8::Context> context, int id, InjectedScriptNative* injectedScriptNative) -{ - v8::Isolate* isolate = context->GetIsolate(); - v8::Context::Scope scope(context); - - v8::Local<v8::FunctionTemplate> wrapperTemplate = m_injectedScriptHost->wrapperTemplate(isolate); - if (wrapperTemplate.IsEmpty()) { - wrapperTemplate = V8InjectedScriptHost::createWrapperTemplate(isolate); - m_injectedScriptHost->setWrapperTemplate(wrapperTemplate, isolate); - } - - v8::Local<v8::Object> scriptHostWrapper = V8InjectedScriptHost::wrap(wrapperTemplate, context, m_injectedScriptHost); - if (scriptHostWrapper.IsEmpty()) - return v8::Local<v8::Object>(); - - injectedScriptNative->setOnInjectedScriptHost(scriptHostWrapper); - - // Inject javascript into the context. The compiled script is supposed to evaluate into - // a single anonymous function(it's anonymous to avoid cluttering the global object with - // inspector's stuff) the function is called a few lines below with InjectedScriptHost wrapper, - // injected script id and explicit reference to the inspected global object. The function is expected - // to create and configure InjectedScript instance that is going to be used by the inspector. - v8::Local<v8::Value> value; - if (!V8ScriptRunner::compileAndRunInternalScript(v8String(isolate, scriptSource), isolate).ToLocal(&value)) - return v8::Local<v8::Object>(); - ASSERT(value->IsFunction()); - - v8::Local<v8::Object> windowGlobal = context->Global(); - v8::Local<v8::Value> info[] = { scriptHostWrapper, windowGlobal, v8::Number::New(context->GetIsolate(), id) }; - v8::Local<v8::Value> injectedScriptValue; - if (!V8ScriptRunner::callInternalFunction(v8::Local<v8::Function>::Cast(value), windowGlobal, WTF_ARRAY_LENGTH(info), info, context->GetIsolate()).ToLocal(&injectedScriptValue)) - return v8::Local<v8::Object>(); - if (!injectedScriptValue->IsObject()) - return v8::Local<v8::Object>(); - return injectedScriptValue.As<v8::Object>(); -} - -} // namespace blink
diff --git a/third_party/WebKit/Source/bindings/core/v8/custom/custom.gypi b/third_party/WebKit/Source/bindings/core/v8/custom/custom.gypi index 1bf567b..5615430 100644 --- a/third_party/WebKit/Source/bindings/core/v8/custom/custom.gypi +++ b/third_party/WebKit/Source/bindings/core/v8/custom/custom.gypi
@@ -15,7 +15,6 @@ 'V8EventTargetCustom.cpp', 'V8HTMLAllCollectionCustom.cpp', 'V8HTMLPlugInElementCustom.cpp', - 'V8InjectedScriptManager.cpp', 'V8IntersectionObserverCustom.cpp', 'V8MediaQueryListCustom.cpp', 'V8MessageChannelCustom.cpp',
diff --git a/third_party/WebKit/Source/bindings/core/v8/v8.gypi b/third_party/WebKit/Source/bindings/core/v8/v8.gypi index 76bf132..c555249e 100644 --- a/third_party/WebKit/Source/bindings/core/v8/v8.gypi +++ b/third_party/WebKit/Source/bindings/core/v8/v8.gypi
@@ -64,8 +64,6 @@ 'ScriptEventListener.h', 'ScriptFunction.cpp', 'ScriptFunction.h', - 'ScriptFunctionCall.cpp', - 'ScriptFunctionCall.h', 'ScriptPromise.cpp', 'ScriptPromise.h', 'ScriptPromiseProperties.h',
diff --git a/third_party/WebKit/Source/core/core.gypi b/third_party/WebKit/Source/core/core.gypi index 7fcec7ad..a61d7bc 100644 --- a/third_party/WebKit/Source/core/core.gypi +++ b/third_party/WebKit/Source/core/core.gypi
@@ -1721,14 +1721,6 @@ 'inspector/DevToolsHost.h', 'inspector/IdentifiersFactory.cpp', 'inspector/IdentifiersFactory.h', - 'inspector/InjectedScript.cpp', - 'inspector/InjectedScript.h', - 'inspector/InjectedScriptNative.cpp', - 'inspector/InjectedScriptNative.h', - 'inspector/InjectedScriptHost.cpp', - 'inspector/InjectedScriptHost.h', - 'inspector/InjectedScriptManager.cpp', - 'inspector/InjectedScriptManager.h', 'inspector/InspectedFrames.cpp', 'inspector/InspectedFrames.h', 'inspector/InspectorAnimationAgent.cpp', @@ -1824,6 +1816,14 @@ 'inspector/v8/InspectorWrapper.h', 'inspector/v8/IgnoreExceptionsScope.h', 'inspector/v8/IgnoreExceptionsScope.cpp', + 'inspector/v8/InjectedScript.cpp', + 'inspector/v8/InjectedScript.h', + 'inspector/v8/InjectedScriptNative.cpp', + 'inspector/v8/InjectedScriptNative.h', + 'inspector/v8/InjectedScriptHost.cpp', + 'inspector/v8/InjectedScriptHost.h', + 'inspector/v8/InjectedScriptManager.cpp', + 'inspector/v8/InjectedScriptManager.h', 'inspector/v8/JavaScriptCallFrame.cpp', 'inspector/v8/JavaScriptCallFrame.h', 'inspector/v8/ScriptBreakpoint.h', @@ -1840,6 +1840,8 @@ 'inspector/v8/V8DebuggerImpl.h', 'inspector/v8/V8DebuggerScript.cpp', 'inspector/v8/V8DebuggerScript.h', + 'inspector/v8/V8FunctionCall.cpp', + 'inspector/v8/V8FunctionCall.h', 'inspector/v8/V8InjectedScriptHost.cpp', 'inspector/v8/V8InjectedScriptHost.h', 'inspector/v8/V8JavaScriptCallFrame.cpp',
diff --git a/third_party/WebKit/Source/core/css/AffectedByFocusTest.cpp b/third_party/WebKit/Source/core/css/AffectedByFocusTest.cpp index 36ce9e1..682de1c 100644 --- a/third_party/WebKit/Source/core/css/AffectedByFocusTest.cpp +++ b/third_party/WebKit/Source/core/css/AffectedByFocusTest.cpp
@@ -206,14 +206,14 @@ document().view()->updateAllLifecyclePhases(); - unsigned startCount = document().styleEngine().resolverAccessCount(); + unsigned startCount = document().styleEngine().styleForElementCount(); document().getElementById("d")->focus(); document().view()->updateAllLifecyclePhases(); - unsigned accessCount = document().styleEngine().resolverAccessCount() - startCount; + unsigned elementCount = document().styleEngine().styleForElementCount() - startCount; - ASSERT_EQ(1U, accessCount); + ASSERT_EQ(1U, elementCount); } TEST_F(AffectedByFocusTest, ChildrenOrSiblingsAffectedByFocusUpdate) @@ -237,14 +237,14 @@ document().view()->updateAllLifecyclePhases(); - unsigned startCount = document().styleEngine().resolverAccessCount(); + unsigned startCount = document().styleEngine().styleForElementCount(); document().getElementById("d")->focus(); document().view()->updateAllLifecyclePhases(); - unsigned accessCount = document().styleEngine().resolverAccessCount() - startCount; + unsigned elementCount = document().styleEngine().styleForElementCount() - startCount; - ASSERT_EQ(11U, accessCount); + ASSERT_EQ(11U, elementCount); } TEST_F(AffectedByFocusTest, InvalidationSetFocusUpdate) @@ -268,14 +268,14 @@ document().view()->updateAllLifecyclePhases(); - unsigned startCount = document().styleEngine().resolverAccessCount(); + unsigned startCount = document().styleEngine().styleForElementCount(); document().getElementById("d")->focus(); document().view()->updateAllLifecyclePhases(); - unsigned accessCount = document().styleEngine().resolverAccessCount() - startCount; + unsigned elementCount = document().styleEngine().styleForElementCount() - startCount; - ASSERT_EQ(2U, accessCount); + ASSERT_EQ(2U, elementCount); } TEST_F(AffectedByFocusTest, NoInvalidationSetFocusUpdate) @@ -300,14 +300,14 @@ document().view()->updateAllLifecyclePhases(); - unsigned startCount = document().styleEngine().resolverAccessCount(); + unsigned startCount = document().styleEngine().styleForElementCount(); document().getElementById("d")->focus(); document().view()->updateAllLifecyclePhases(); - unsigned accessCount = document().styleEngine().resolverAccessCount() - startCount; + unsigned elementCount = document().styleEngine().styleForElementCount() - startCount; - ASSERT_EQ(1U, accessCount); + ASSERT_EQ(1U, elementCount); } } // namespace blink
diff --git a/third_party/WebKit/Source/core/css/CSSBasicShapeValues.cpp b/third_party/WebKit/Source/core/css/CSSBasicShapeValues.cpp index 4328051..265a08e 100644 --- a/third_party/WebKit/Source/core/css/CSSBasicShapeValues.cpp +++ b/third_party/WebKit/Source/core/css/CSSBasicShapeValues.cpp
@@ -80,6 +80,10 @@ } else if (offset->isValuePair()) { side = toCSSPrimitiveValue(toCSSValuePair(*offset).first()).getValueID(); amount = &toCSSPrimitiveValue(toCSSValuePair(*offset).second()); + if ((side == CSSValueRight || side == CSSValueBottom) && amount->isPercentage()) { + side = defaultSide; + amount = cssValuePool().createValue(100 - amount->getFloatValue(), CSSPrimitiveValue::UnitType::Percentage); + } } else { amount = toCSSPrimitiveValue(offset.get()); } @@ -87,11 +91,7 @@ if (side == CSSValueCenter) { side = defaultSide; amount = cssValuePool().createValue(50, CSSPrimitiveValue::UnitType::Percentage); - } else if ((side == CSSValueRight || side == CSSValueBottom) - && amount->isPercentage()) { - side = defaultSide; - amount = cssValuePool().createValue(100 - amount->getFloatValue(), CSSPrimitiveValue::UnitType::Percentage); - } else if (amount->isLength() && !amount->getFloatValue()) { + } else if (!amount || (amount->isLength() && !amount->getFloatValue())) { if (side == CSSValueRight || side == CSSValueBottom) amount = cssValuePool().createValue(100, CSSPrimitiveValue::UnitType::Percentage); else
diff --git a/third_party/WebKit/Source/core/css/CSSFontSelector.cpp b/third_party/WebKit/Source/core/css/CSSFontSelector.cpp index da4476d..1719ae9 100644 --- a/third_party/WebKit/Source/core/css/CSSFontSelector.cpp +++ b/third_party/WebKit/Source/core/css/CSSFontSelector.cpp
@@ -83,8 +83,12 @@ WillBeHeapVector<RawPtrWillBeMember<CSSFontSelectorClient>> clients; copyToVector(m_clients, clients); - for (size_t i = 0; i < clients.size(); ++i) - clients[i]->fontsNeedUpdate(this); + // TODO(sof): the null check is temporarily in place to speculatively address + // crbug.com/568173. + for (auto& client : clients) { + if (client) + client->fontsNeedUpdate(this); + } } void CSSFontSelector::fontFaceInvalidated()
diff --git a/third_party/WebKit/Source/core/css/DragUpdateTest.cpp b/third_party/WebKit/Source/core/css/DragUpdateTest.cpp index 411cb99c..df874f6 100644 --- a/third_party/WebKit/Source/core/css/DragUpdateTest.cpp +++ b/third_party/WebKit/Source/core/css/DragUpdateTest.cpp
@@ -29,14 +29,14 @@ "</div>", ASSERT_NO_EXCEPTION); document.view()->updateAllLifecyclePhases(); - unsigned startCount = document.styleEngine().resolverAccessCount(); + unsigned startCount = document.styleEngine().styleForElementCount(); document.documentElement()->layoutObject()->updateDragState(true); document.view()->updateAllLifecyclePhases(); - unsigned accessCount = document.styleEngine().resolverAccessCount() - startCount; + unsigned elementCount = document.styleEngine().styleForElementCount() - startCount; - ASSERT_EQ(1U, accessCount); + ASSERT_EQ(1U, elementCount); } TEST(DragUpdateTest, ChildAffectedByDragUpdate) @@ -55,14 +55,14 @@ "</div>", ASSERT_NO_EXCEPTION); document.updateLayout(); - unsigned startCount = document.styleEngine().resolverAccessCount(); + unsigned startCount = document.styleEngine().styleForElementCount(); document.documentElement()->layoutObject()->updateDragState(true); document.updateLayout(); - unsigned accessCount = document.styleEngine().resolverAccessCount() - startCount; + unsigned elementCount = document.styleEngine().styleForElementCount() - startCount; - ASSERT_EQ(1U, accessCount); + ASSERT_EQ(1U, elementCount); } TEST(DragUpdateTest, SiblingAffectedByDragUpdate) @@ -82,14 +82,14 @@ "<span class='drag'></span>", ASSERT_NO_EXCEPTION); document.updateLayout(); - unsigned startCount = document.styleEngine().resolverAccessCount(); + unsigned startCount = document.styleEngine().styleForElementCount(); document.documentElement()->layoutObject()->updateDragState(true); document.updateLayout(); - unsigned accessCount = document.styleEngine().resolverAccessCount() - startCount; + unsigned elementCount = document.styleEngine().styleForElementCount() - startCount; - ASSERT_EQ(1U, accessCount); + ASSERT_EQ(1U, elementCount); } } // namespace blink
diff --git a/third_party/WebKit/Source/core/css/ElementRuleCollector.cpp b/third_party/WebKit/Source/core/css/ElementRuleCollector.cpp index a98de1a..d9f08d56 100644 --- a/third_party/WebKit/Source/core/css/ElementRuleCollector.cpp +++ b/third_party/WebKit/Source/core/css/ElementRuleCollector.cpp
@@ -39,6 +39,7 @@ #include "core/css/StylePropertySet.h" #include "core/css/resolver/StyleResolver.h" #include "core/css/resolver/StyleResolverStats.h" +#include "core/dom/StyleEngine.h" #include "core/dom/shadow/ShadowRoot.h" #include "core/style/StyleInheritedData.h" #include <algorithm> @@ -170,11 +171,13 @@ didMatchRule(ruleData, result, cascadeOrder, matchRequest); } - if (StyleResolver* resolver = m_context.element()->document().styleResolver()) { - INCREMENT_STYLE_STATS_COUNTER(*resolver, rulesRejected, rejected); - INCREMENT_STYLE_STATS_COUNTER(*resolver, rulesFastRejected, fastRejected); - INCREMENT_STYLE_STATS_COUNTER(*resolver, rulesMatched, matched); - } + StyleEngine& styleEngine = m_context.element()->document().styleEngine(); + if (!styleEngine.stats()) + return; + + INCREMENT_STYLE_STATS_COUNTER(styleEngine, rulesRejected, rejected); + INCREMENT_STYLE_STATS_COUNTER(styleEngine, rulesFastRejected, fastRejected); + INCREMENT_STYLE_STATS_COUNTER(styleEngine, rulesMatched, matched); } void ElementRuleCollector::collectMatchingRules(const MatchRequest& matchRequest, CascadeOrder cascadeOrder, bool matchingTreeBoundaryRules)
diff --git a/third_party/WebKit/Source/core/css/FontFace.cpp b/third_party/WebKit/Source/core/css/FontFace.cpp index 6f90804..2f4661d 100644 --- a/third_party/WebKit/Source/core/css/FontFace.cpp +++ b/third_party/WebKit/Source/core/css/FontFace.cpp
@@ -59,6 +59,7 @@ #include "core/frame/UseCounter.h" #include "platform/FontFamilyNames.h" #include "platform/SharedBuffer.h" +#include "public/platform/Platform.h" namespace blink { @@ -600,6 +601,9 @@ if (source) m_cssFontFace->addSource(source.release()); } + + if (m_display) + Platform::current()->histogramEnumeration("WebFont.FontDisplayValue", CSSValueToFontDisplay(m_display.get()), FontDisplayEnumMax); } void FontFace::initCSSFontFace(const unsigned char* data, size_t size)
diff --git a/third_party/WebKit/Source/core/css/RemoteFontFaceSource.h b/third_party/WebKit/Source/core/css/RemoteFontFaceSource.h index 8b9ff7d90..9d58bcb6 100644 --- a/third_party/WebKit/Source/core/css/RemoteFontFaceSource.h +++ b/third_party/WebKit/Source/core/css/RemoteFontFaceSource.h
@@ -19,7 +19,8 @@ FontDisplayBlock, FontDisplaySwap, FontDisplayFallback, - FontDisplayOptional + FontDisplayOptional, + FontDisplayEnumMax }; class RemoteFontFaceSource final : public CSSFontFaceSource, public FontResourceClient {
diff --git a/third_party/WebKit/Source/core/css/RuleFeature.cpp b/third_party/WebKit/Source/core/css/RuleFeature.cpp index 59e3abd..d732d58 100644 --- a/third_party/WebKit/Source/core/css/RuleFeature.cpp +++ b/third_party/WebKit/Source/core/css/RuleFeature.cpp
@@ -280,21 +280,29 @@ bool RuleFeatureSet::extractInvalidationSetFeature(const CSSSelector& selector, InvalidationSetFeatures& features) { - if (selector.match() == CSSSelector::Tag && selector.tagQName().localName() != starAtom) + if (selector.match() == CSSSelector::Tag && selector.tagQName().localName() != starAtom) { features.tagName = selector.tagQName().localName(); - else if (selector.match() == CSSSelector::Id) + return true; + } + if (selector.match() == CSSSelector::Id) { features.id = selector.value(); - else if (selector.match() == CSSSelector::Class) + return true; + } + if (selector.match() == CSSSelector::Class) { features.classes.append(selector.value()); - else if (selector.isAttributeSelector()) + return true; + } + if (selector.isAttributeSelector()) { features.attributes.append(selector.attribute().localName()); - else if (selector.pseudoType() == CSSSelector::PseudoWebKitCustomElement) + return true; + } + if (selector.pseudoType() == CSSSelector::PseudoWebKitCustomElement) { features.customPseudoElement = true; - else if (selector.pseudoType() == CSSSelector::PseudoBefore || selector.pseudoType() == CSSSelector::PseudoAfter) + return true; + } + if (selector.pseudoType() == CSSSelector::PseudoBefore || selector.pseudoType() == CSSSelector::PseudoAfter) features.hasBeforeOrAfter = true; - else - return false; - return true; + return false; } InvalidationSet* RuleFeatureSet::invalidationSetForSelector(const CSSSelector& selector, InvalidationType type)
diff --git a/third_party/WebKit/Source/core/css/cssom/KeywordValue.cpp b/third_party/WebKit/Source/core/css/cssom/KeywordValue.cpp index abc8083..7ed9cdc 100644 --- a/third_party/WebKit/Source/core/css/cssom/KeywordValue.cpp +++ b/third_party/WebKit/Source/core/css/cssom/KeywordValue.cpp
@@ -30,6 +30,11 @@ } // namespace +String KeywordValue::cssString() const +{ + return m_keywordValue; +} + const String& KeywordValue::keywordValue() const { return m_keywordValue;
diff --git a/third_party/WebKit/Source/core/css/cssom/KeywordValue.h b/third_party/WebKit/Source/core/css/cssom/KeywordValue.h index 1e628e1e..0c18809 100644 --- a/third_party/WebKit/Source/core/css/cssom/KeywordValue.h +++ b/third_party/WebKit/Source/core/css/cssom/KeywordValue.h
@@ -27,6 +27,7 @@ const String& keywordValue() const; + String cssString() const override; PassRefPtrWillBeRawPtr<CSSValue> toCSSValue() const override; private:
diff --git a/third_party/WebKit/Source/core/css/cssom/LengthValue.cpp b/third_party/WebKit/Source/core/css/cssom/LengthValue.cpp index e184e2c..d437cf06a 100644 --- a/third_party/WebKit/Source/core/css/cssom/LengthValue.cpp +++ b/third_party/WebKit/Source/core/css/cssom/LengthValue.cpp
@@ -161,45 +161,6 @@ } } -CSSPrimitiveValue::UnitType LengthValue::lengthTypeToPrimitiveType(LengthValue::LengthUnit unit) -{ - switch (unit) { - case Px: - return CSSPrimitiveValue::UnitType::Pixels; - case Percent: - return CSSPrimitiveValue::UnitType::Percentage; - case Em: - return CSSPrimitiveValue::UnitType::Ems; - case Ex: - return CSSPrimitiveValue::UnitType::Exs; - case Ch: - return CSSPrimitiveValue::UnitType::Chs; - case Rem: - return CSSPrimitiveValue::UnitType::Rems; - case Vw: - return CSSPrimitiveValue::UnitType::ViewportWidth; - case Vh: - return CSSPrimitiveValue::UnitType::ViewportHeight; - case Vmin: - return CSSPrimitiveValue::UnitType::ViewportMin; - case Vmax: - return CSSPrimitiveValue::UnitType::ViewportMax; - case Cm: - return CSSPrimitiveValue::UnitType::Centimeters; - case Mm: - return CSSPrimitiveValue::UnitType::Millimeters; - case In: - return CSSPrimitiveValue::UnitType::Inches; - case Pc: - return CSSPrimitiveValue::UnitType::Picas; - case Pt: - return CSSPrimitiveValue::UnitType::Points; - default: - ASSERT_NOT_REACHED(); - return CSSPrimitiveValue::UnitType::Pixels; - } -} - LengthValue* LengthValue::addInternal(const LengthValue*, ExceptionState&) { ASSERT_NOT_REACHED();
diff --git a/third_party/WebKit/Source/core/css/cssom/LengthValue.h b/third_party/WebKit/Source/core/css/cssom/LengthValue.h index 20937ed..392adb0 100644 --- a/third_party/WebKit/Source/core/css/cssom/LengthValue.h +++ b/third_party/WebKit/Source/core/css/cssom/LengthValue.h
@@ -50,8 +50,7 @@ LengthValue() {} static LengthUnit lengthUnitFromName(const String&); - static const String& lengthTypeToString(LengthUnit); - static CSSPrimitiveValue::UnitType lengthTypeToPrimitiveType(LengthUnit); + static const String& lengthTypeToString(LengthUnit type); virtual LengthValue* addInternal(const LengthValue* other, ExceptionState&); virtual LengthValue* subtractInternal(const LengthValue* other, ExceptionState&);
diff --git a/third_party/WebKit/Source/core/css/cssom/NumberValue.h b/third_party/WebKit/Source/core/css/cssom/NumberValue.h index 142affb..b4c281d 100644 --- a/third_party/WebKit/Source/core/css/cssom/NumberValue.h +++ b/third_party/WebKit/Source/core/css/cssom/NumberValue.h
@@ -28,6 +28,8 @@ m_value = value; } + String cssString() const override { return String::number(m_value); } + PassRefPtrWillBeRawPtr<CSSValue> toCSSValue() const override { return cssValuePool().createValue(m_value, CSSPrimitiveValue::UnitType::
diff --git a/third_party/WebKit/Source/core/css/cssom/SimpleLength.cpp b/third_party/WebKit/Source/core/css/cssom/SimpleLength.cpp index 49fa4bc..422ff07 100644 --- a/third_party/WebKit/Source/core/css/cssom/SimpleLength.cpp +++ b/third_party/WebKit/Source/core/css/cssom/SimpleLength.cpp
@@ -10,9 +10,18 @@ namespace blink { +String SimpleLength::cssString() const +{ + StringBuilder s; + s.appendNumber(m_value); + s.append(unit()); + return s.toString(); +} + PassRefPtrWillBeRawPtr<CSSValue> SimpleLength::toCSSValue() const { - return cssValuePool().createValue(m_value, LengthValue::lengthTypeToPrimitiveType(m_unit)); + // TODO: Don't re-parse the unit. + return cssValuePool().createValue(m_value, CSSPrimitiveValue::fromName(unit())); } LengthValue* SimpleLength::addInternal(const LengthValue* other, ExceptionState& exceptionState)
diff --git a/third_party/WebKit/Source/core/css/cssom/SimpleLength.h b/third_party/WebKit/Source/core/css/cssom/SimpleLength.h index 295cbaeb..fa03539 100644 --- a/third_party/WebKit/Source/core/css/cssom/SimpleLength.h +++ b/third_party/WebKit/Source/core/css/cssom/SimpleLength.h
@@ -39,6 +39,7 @@ StyleValueType type() const override { return StyleValueType::SimpleLengthType; } + String cssString() const override; PassRefPtrWillBeRawPtr<CSSValue> toCSSValue() const override; protected:
diff --git a/third_party/WebKit/Source/core/css/cssom/StyleCalcLength.cpp b/third_party/WebKit/Source/core/css/cssom/StyleCalcLength.cpp index de71cd9..cbcf171 100644 --- a/third_party/WebKit/Source/core/css/cssom/StyleCalcLength.cpp +++ b/third_party/WebKit/Source/core/css/cssom/StyleCalcLength.cpp
@@ -124,6 +124,29 @@ return result; } +String StyleCalcLength::cssString() const +{ + StringBuilder builder; + builder.appendLiteral("calc("); + for (unsigned i = 0; i < LengthUnit::Count; ++i) { + LengthUnit lengthUnit = static_cast<LengthUnit>(i); + if (has(lengthUnit)) { + double value = get(lengthUnit); + if (value >= 0 && i > 0) { + builder.appendLiteral(" + "); + } else if (value < 0 && i > 0) { + builder.appendLiteral(" - "); + } else if (value < 0) { + builder.append('-'); + } + builder.appendNumber(std::abs(get(lengthUnit))); + builder.append(lengthTypeToString(lengthUnit)); + } + } + builder.append(')'); + return builder.toString(); +} + PassRefPtrWillBeRawPtr<CSSValue> StyleCalcLength::toCSSValue() const { // Create a CSS Calc Value, then put it into a CSSPrimitiveValue @@ -131,14 +154,20 @@ for (unsigned i = 0; i < LengthUnit::Count; ++i) { LengthUnit lengthUnit = static_cast<LengthUnit>(i); if (!has(lengthUnit)) - continue; + break; double value = get(lengthUnit); - CSSPrimitiveValue::UnitType primitiveUnit = lengthTypeToPrimitiveType(lengthUnit); + CSSPrimitiveValue::UnitType primitiveUnit; + if (lengthUnit == LengthUnit::Percent) { + primitiveUnit = CSSPrimitiveValue::UnitType::Percentage; + } else { + // TODO: Don't re-parse the unit here. + primitiveUnit = CSSPrimitiveValue::fromName(lengthTypeToString(lengthUnit)); + } if (node) { node = CSSCalcValue::createExpressionNode( node, - CSSCalcValue::createExpressionNode(CSSPrimitiveValue::create(std::abs(value), primitiveUnit)), - value >= 0 ? CalcAdd : CalcSubtract); + CSSCalcValue::createExpressionNode(CSSPrimitiveValue::create(value, primitiveUnit)), + CalcAdd); } else { node = CSSCalcValue::createExpressionNode(CSSPrimitiveValue::create(value, primitiveUnit)); }
diff --git a/third_party/WebKit/Source/core/css/cssom/StyleCalcLength.h b/third_party/WebKit/Source/core/css/cssom/StyleCalcLength.h index 64391c9..d086926 100644 --- a/third_party/WebKit/Source/core/css/cssom/StyleCalcLength.h +++ b/third_party/WebKit/Source/core/css/cssom/StyleCalcLength.h
@@ -44,6 +44,7 @@ #undef GETTER_MACRO + String cssString() const override; PassRefPtrWillBeRawPtr<CSSValue> toCSSValue() const override; StyleValueType type() const override { return CalcLengthType; }
diff --git a/third_party/WebKit/Source/core/css/cssom/StyleValue.h b/third_party/WebKit/Source/core/css/cssom/StyleValue.h index 06e120f..0d8ff3f 100644 --- a/third_party/WebKit/Source/core/css/cssom/StyleValue.h +++ b/third_party/WebKit/Source/core/css/cssom/StyleValue.h
@@ -30,11 +30,8 @@ static StyleValue* create(const CSSValue&); static ScriptValue parse(ScriptState*, const String& property, const String& cssText); + virtual String cssString() const = 0; virtual PassRefPtrWillBeRawPtr<CSSValue> toCSSValue() const = 0; - virtual String cssString() const - { - return toCSSValue()->cssText(); - } DEFINE_INLINE_VIRTUAL_TRACE() { }
diff --git a/third_party/WebKit/Source/core/css/cssom/TransformValue.h b/third_party/WebKit/Source/core/css/cssom/TransformValue.h index bc5c00a1..21a2061d 100644 --- a/third_party/WebKit/Source/core/css/cssom/TransformValue.h +++ b/third_party/WebKit/Source/core/css/cssom/TransformValue.h
@@ -39,6 +39,8 @@ size_t size() { return m_transformComponents.size(); } + String cssString() const override { return String(); } + DEFINE_INLINE_VIRTUAL_TRACE() { visitor->trace(m_transformComponents);
diff --git a/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp b/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp index d4d70ef..9a86f904 100644 --- a/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp +++ b/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.cpp
@@ -5,6 +5,7 @@ #include "core/css/parser/CSSPropertyParser.h" #include "core/StylePropertyShorthand.h" +#include "core/css/CSSBasicShapeValues.h" #include "core/css/CSSCalculationValue.h" #include "core/css/CSSCounterValue.h" #include "core/css/CSSCrossfadeValue.h" @@ -2742,6 +2743,8 @@ if (context.useCounter()) context.useCounter()->count(UseCounter::DeprecatedWebKitRepeatingLinearGradient); result = consumeLinearGradient(args, context.mode(), Repeating, CSSPrefixedLinearGradient); + } else if (id == CSSValueRepeatingLinearGradient) { + result = consumeLinearGradient(args, context.mode(), Repeating, CSSLinearGradient); } else if (id == CSSValueLinearGradient) { result = consumeLinearGradient(args, context.mode(), NonRepeating, CSSLinearGradient); } else if (id == CSSValueWebkitGradient) { @@ -2935,6 +2938,216 @@ return parsedValue.release(); } +static PassRefPtrWillBeRawPtr<CSSPrimitiveValue> consumeShapeRadius(CSSParserTokenRange& args, CSSParserMode cssParserMode) +{ + if (identMatches<CSSValueClosestSide, CSSValueFarthestSide>(args.peek().id())) + return consumeIdent(args); + return consumeLengthOrPercent(args, cssParserMode, ValueRangeNonNegative); +} + +static PassRefPtrWillBeRawPtr<CSSBasicShapeCircleValue> consumeBasicShapeCircle(CSSParserTokenRange& args, const CSSParserContext& context) +{ + // spec: https://drafts.csswg.org/css-shapes/#supported-basic-shapes + // circle( [<shape-radius>]? [at <position>]? ) + RefPtrWillBeRawPtr<CSSBasicShapeCircleValue> shape = CSSBasicShapeCircleValue::create(); + if (RefPtrWillBeRawPtr<CSSPrimitiveValue> radius = consumeShapeRadius(args, context.mode())) + shape->setRadius(radius.release()); + if (consumeIdent<CSSValueAt>(args)) { + RefPtrWillBeRawPtr<CSSValue> centerX = nullptr; + RefPtrWillBeRawPtr<CSSValue> centerY = nullptr; + if (!consumePosition(args, context.mode(), UnitlessQuirk::Forbid, centerX, centerY)) + return nullptr; + shape->setCenterX(centerX); + shape->setCenterY(centerY); + } + return shape.release(); +} + +static PassRefPtrWillBeRawPtr<CSSBasicShapeEllipseValue> consumeBasicShapeEllipse(CSSParserTokenRange& args, const CSSParserContext& context) +{ + // spec: https://drafts.csswg.org/css-shapes/#supported-basic-shapes + // ellipse( [<shape-radius>{2}]? [at <position>]? ) + RefPtrWillBeRawPtr<CSSBasicShapeEllipseValue> shape = CSSBasicShapeEllipseValue::create(); + if (RefPtrWillBeRawPtr<CSSPrimitiveValue> radiusX = consumeShapeRadius(args, context.mode())) { + shape->setRadiusX(radiusX); + if (RefPtrWillBeRawPtr<CSSPrimitiveValue> radiusY = consumeShapeRadius(args, context.mode())) + shape->setRadiusY(radiusY); + } + if (consumeIdent<CSSValueAt>(args)) { + RefPtrWillBeRawPtr<CSSValue> centerX = nullptr; + RefPtrWillBeRawPtr<CSSValue> centerY = nullptr; + if (!consumePosition(args, context.mode(), UnitlessQuirk::Forbid, centerX, centerY)) + return nullptr; + shape->setCenterX(centerX); + shape->setCenterY(centerY); + } + return shape.release(); +} + +static PassRefPtrWillBeRawPtr<CSSBasicShapePolygonValue> consumeBasicShapePolygon(CSSParserTokenRange& args, const CSSParserContext& context) +{ + RefPtrWillBeRawPtr<CSSBasicShapePolygonValue> shape = CSSBasicShapePolygonValue::create(); + if (identMatches<CSSValueEvenodd, CSSValueNonzero>(args.peek().id())) { + shape->setWindRule(args.consumeIncludingWhitespace().id() == CSSValueEvenodd ? RULE_EVENODD : RULE_NONZERO); + if (!consumeCommaIncludingWhitespace(args)) + return nullptr; + } + + do { + RefPtrWillBeRawPtr<CSSPrimitiveValue> xLength = consumeLengthOrPercent(args, context.mode(), ValueRangeAll); + if (!xLength) + return nullptr; + RefPtrWillBeRawPtr<CSSPrimitiveValue> yLength = consumeLengthOrPercent(args, context.mode(), ValueRangeAll); + if (!yLength) + return nullptr; + shape->appendPoint(xLength.release(), yLength.release()); + } while (consumeCommaIncludingWhitespace(args)); + return shape.release(); +} + +static void completeBorderRadii(RefPtrWillBeRawPtr<CSSPrimitiveValue> radii[4]) +{ + if (radii[3]) + return; + if (!radii[2]) { + if (!radii[1]) + radii[1] = radii[0]; + radii[2] = radii[0]; + } + radii[3] = radii[1]; +} + +static bool consumeRadii(RefPtrWillBeRawPtr<CSSPrimitiveValue> horizontalRadii[4], RefPtrWillBeRawPtr<CSSPrimitiveValue> verticalRadii[4], CSSParserTokenRange& range, CSSParserMode cssParserMode, bool useLegacyParsing) +{ +#if ENABLE(OILPAN) + // Unconditionally zero initialize the arrays of raw pointers. + memset(horizontalRadii, 0, 4 * sizeof(horizontalRadii[0])); + memset(verticalRadii, 0, 4 * sizeof(verticalRadii[0])); +#endif + unsigned i = 0; + for (; i < 4 && !range.atEnd() && range.peek().type() != DelimiterToken; ++i) { + horizontalRadii[i] = consumeLengthOrPercent(range, cssParserMode, ValueRangeNonNegative); + if (!horizontalRadii[i]) + return false; + } + if (!horizontalRadii[0]) + return false; + if (range.atEnd()) { + // Legacy syntax: -webkit-border-radius: l1 l2; is equivalent to border-radius: l1 / l2; + if (useLegacyParsing && i == 2) { + verticalRadii[0] = horizontalRadii[1]; + horizontalRadii[1] = nullptr; + } else { + completeBorderRadii(horizontalRadii); + for (unsigned i = 0; i < 4; ++i) + verticalRadii[i] = horizontalRadii[i]; + return true; + } + } else { + if (range.peek().type() != DelimiterToken || range.peek().delimiter() != '/') + return false; + range.consumeIncludingWhitespace(); + for (i = 0; i < 4 && !range.atEnd(); ++i) { + verticalRadii[i] = consumeLengthOrPercent(range, cssParserMode, ValueRangeNonNegative); + if (!verticalRadii[i]) + return false; + } + if (!verticalRadii[0] || !range.atEnd()) + return false; + } + completeBorderRadii(horizontalRadii); + completeBorderRadii(verticalRadii); + return true; +} + +static PassRefPtrWillBeRawPtr<CSSBasicShapeInsetValue> consumeBasicShapeInset(CSSParserTokenRange& args, const CSSParserContext& context) +{ + RefPtrWillBeRawPtr<CSSBasicShapeInsetValue> shape = CSSBasicShapeInsetValue::create(); + RefPtrWillBeRawPtr<CSSPrimitiveValue> top = consumeLengthOrPercent(args, context.mode(), ValueRangeAll); + if (!top) + return nullptr; + RefPtrWillBeRawPtr<CSSPrimitiveValue> right = nullptr; + RefPtrWillBeRawPtr<CSSPrimitiveValue> bottom = nullptr; + RefPtrWillBeRawPtr<CSSPrimitiveValue> left = nullptr; + if ((right = consumeLengthOrPercent(args, context.mode(), ValueRangeAll))) { + if ((bottom = consumeLengthOrPercent(args, context.mode(), ValueRangeAll))) + left = consumeLengthOrPercent(args, context.mode(), ValueRangeAll); + } + if (left) + shape->updateShapeSize4Values(top.get(), right.get(), bottom.get(), left.get()); + else if (bottom) + shape->updateShapeSize3Values(top.get(), right.get(), bottom.get()); + else if (right) + shape->updateShapeSize2Values(top.get(), right.get()); + else + shape->updateShapeSize1Value(top.get()); + + if (consumeIdent<CSSValueRound>(args)) { + RefPtrWillBeRawPtr<CSSPrimitiveValue> horizontalRadii[4]; + RefPtrWillBeRawPtr<CSSPrimitiveValue> verticalRadii[4]; + if (!consumeRadii(horizontalRadii, verticalRadii, args, context.mode(), false)) + return nullptr; + shape->setTopLeftRadius(CSSValuePair::create(horizontalRadii[0].release(), verticalRadii[0].release(), CSSValuePair::DropIdenticalValues)); + shape->setTopRightRadius(CSSValuePair::create(horizontalRadii[1].release(), verticalRadii[1].release(), CSSValuePair::DropIdenticalValues)); + shape->setBottomRightRadius(CSSValuePair::create(horizontalRadii[2].release(), verticalRadii[2].release(), CSSValuePair::DropIdenticalValues)); + shape->setBottomLeftRadius(CSSValuePair::create(horizontalRadii[3].release(), verticalRadii[3].release(), CSSValuePair::DropIdenticalValues)); + } + return shape.release(); +} + +static PassRefPtrWillBeRawPtr<CSSValue> consumeBasicShape(CSSParserTokenRange& range, const CSSParserContext& context) +{ + RefPtrWillBeRawPtr<CSSValue> shape = nullptr; + if (range.peek().type() != FunctionToken) + return nullptr; + CSSValueID id = range.peek().functionId(); + CSSParserTokenRange rangeCopy = range; + CSSParserTokenRange args = consumeFunction(rangeCopy); + if (id == CSSValueCircle) + shape = consumeBasicShapeCircle(args, context); + else if (id == CSSValueEllipse) + shape = consumeBasicShapeEllipse(args, context); + else if (id == CSSValuePolygon) + shape = consumeBasicShapePolygon(args, context); + else if (id == CSSValueInset) + shape = consumeBasicShapeInset(args, context); + if (!shape || !args.atEnd()) + return nullptr; + range = rangeCopy; + return shape.release(); +} + +static PassRefPtrWillBeRawPtr<CSSValue> consumeClipPath(CSSParserTokenRange& range, const CSSParserContext& context) +{ + if (range.peek().id() == CSSValueNone) + return consumeIdent(range); + String url = consumeUrl(range); + if (!url.isNull()) + return CSSURIValue::create(url); + return consumeBasicShape(range, context); +} + +static PassRefPtrWillBeRawPtr<CSSValue> consumeShapeOutside(CSSParserTokenRange& range, const CSSParserContext& context) +{ + if (range.peek().id() == CSSValueNone) + return consumeIdent(range); + if (RefPtrWillBeRawPtr<CSSValue> imageValue = consumeImage(range, context)) + return imageValue.release(); + RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createSpaceSeparated(); + if (RefPtrWillBeRawPtr<CSSValue> boxValue = consumeIdent<CSSValueContentBox, CSSValuePaddingBox, CSSValueBorderBox, CSSValueMarginBox>(range)) + list->append(boxValue.release()); + if (RefPtrWillBeRawPtr<CSSValue> shapeValue = consumeBasicShape(range, context)) { + list->append(shapeValue.release()); + if (list->length() < 2) { + if (RefPtrWillBeRawPtr<CSSValue> boxValue = consumeIdent<CSSValueContentBox, CSSValuePaddingBox, CSSValueBorderBox, CSSValueMarginBox>(range)) + list->append(boxValue.release()); + } + } + if (!list->length()) + return nullptr; + return list.release(); +} + PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::parseSingleValue(CSSPropertyID unresolvedProperty) { CSSPropertyID property = resolveCSSPropertyID(unresolvedProperty); @@ -3231,6 +3444,10 @@ return consumeIdent<CSSValueAuto, CSSValueUnder>(m_range); case CSSPropertyVerticalAlign: return consumeVerticalAlign(m_range, m_context.mode()); + case CSSPropertyShapeOutside: + return consumeShapeOutside(m_range, m_context); + case CSSPropertyWebkitClipPath: + return consumeClipPath(m_range, m_context); default: CSSParserValueList valueList(m_range); if (valueList.size()) { @@ -3749,49 +3966,6 @@ return m_range.atEnd(); } -static bool consumeRadii(RefPtrWillBeRawPtr<CSSPrimitiveValue> horizontalRadii[4], RefPtrWillBeRawPtr<CSSPrimitiveValue> verticalRadii[4], CSSParserTokenRange& range, CSSParserMode cssParserMode, bool useLegacyParsing) -{ -#if ENABLE(OILPAN) - // Unconditionally zero initialize the arrays of raw pointers. - memset(horizontalRadii, 0, 4 * sizeof(horizontalRadii[0])); - memset(verticalRadii, 0, 4 * sizeof(verticalRadii[0])); -#endif - unsigned i = 0; - for (; i < 4 && !range.atEnd() && range.peek().type() != DelimiterToken; ++i) { - horizontalRadii[i] = consumeLengthOrPercent(range, cssParserMode, ValueRangeNonNegative); - if (!horizontalRadii[i]) - return false; - } - if (!horizontalRadii[0]) - return false; - if (range.atEnd()) { - // Legacy syntax: -webkit-border-radius: l1 l2; is equivalent to border-radius: l1 / l2; - if (useLegacyParsing && i == 2) { - verticalRadii[0] = horizontalRadii[1]; - horizontalRadii[1] = nullptr; - } else { - completeBorderRadii(horizontalRadii); - for (unsigned i = 0; i < 4; ++i) - verticalRadii[i] = horizontalRadii[i]; - return true; - } - } else { - if (range.peek().type() != DelimiterToken || range.peek().delimiter() != '/') - return false; - range.consumeIncludingWhitespace(); - for (i = 0; i < 4 && !range.atEnd(); ++i) { - verticalRadii[i] = consumeLengthOrPercent(range, cssParserMode, ValueRangeNonNegative); - if (!verticalRadii[i]) - return false; - } - if (!verticalRadii[0] || !range.atEnd()) - return false; - } - completeBorderRadii(horizontalRadii); - completeBorderRadii(verticalRadii); - return true; -} - bool CSSPropertyParser::parseShorthand(CSSPropertyID unresolvedProperty, bool important) { CSSPropertyID property = resolveCSSPropertyID(unresolvedProperty);
diff --git a/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.h b/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.h index da98c2d7..8f8c6e9 100644 --- a/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.h +++ b/third_party/WebKit/Source/core/css/parser/CSSPropertyParser.h
@@ -35,11 +35,6 @@ class BorderImageParseContext; class CSSBorderImageSliceValue; -class CSSBasicShapeValue; -class CSSBasicShapeEllipseValue; -class CSSBasicShapeCircleValue; -class CSSBasicShapeInsetValue; -class CSSBasicShapePolygonValue; class CSSCustomIdentValue; class CSSFunctionValue; class CSSGradientValue; @@ -191,16 +186,6 @@ PassRefPtrWillBeRawPtr<CSSValue> parseItemPositionOverflowPosition(); PassRefPtrWillBeRawPtr<CSSValue> parseContentDistributionOverflowPosition(); - PassRefPtrWillBeRawPtr<CSSValue> parseShapeProperty(CSSPropertyID propId); - PassRefPtrWillBeRawPtr<CSSValue> parseBasicShapeAndOrBox(); - PassRefPtrWillBeRawPtr<CSSValue> parseBasicShape(); - PassRefPtrWillBeRawPtr<CSSPrimitiveValue> parseShapeRadius(CSSParserValue*); - - PassRefPtrWillBeRawPtr<CSSBasicShapeCircleValue> parseBasicShapeCircle(CSSParserValueList* args); - PassRefPtrWillBeRawPtr<CSSBasicShapeEllipseValue> parseBasicShapeEllipse(CSSParserValueList* args); - PassRefPtrWillBeRawPtr<CSSBasicShapePolygonValue> parseBasicShapePolygon(CSSParserValueList* args); - PassRefPtrWillBeRawPtr<CSSBasicShapeInsetValue> parseBasicShapeInset(CSSParserValueList* args); - bool consumeFont(bool important); bool consumeSystemFont(bool important); @@ -330,9 +315,6 @@ CSSPropertyID unresolvedCSSPropertyID(const CSSParserString&); CSSValueID cssValueKeywordID(const CSSParserString&); -// TODO(rwlbuis): move to CSSPropertyParser.cpp once CSSParserToken conversion is done. -void completeBorderRadii(RefPtrWillBeRawPtr<CSSPrimitiveValue> radii[4]); - } // namespace blink #endif // CSSPropertyParser_h
diff --git a/third_party/WebKit/Source/core/css/parser/LegacyCSSPropertyParser.cpp b/third_party/WebKit/Source/core/css/parser/LegacyCSSPropertyParser.cpp index d8847a98..bf18f11 100644 --- a/third_party/WebKit/Source/core/css/parser/LegacyCSSPropertyParser.cpp +++ b/third_party/WebKit/Source/core/css/parser/LegacyCSSPropertyParser.cpp
@@ -27,7 +27,6 @@ #include "core/css/parser/CSSPropertyParser.h" #include "core/StylePropertyShorthand.h" -#include "core/css/CSSBasicShapeValues.h" #include "core/css/CSSBorderImage.h" #include "core/css/CSSContentDistributionValue.h" #include "core/css/CSSCrossfadeValue.h" @@ -447,23 +446,6 @@ parsedValue = parseGridTemplateAreas(); break; - case CSSPropertyWebkitClipPath: - if (id == CSSValueNone) { - validPrimitive = true; - } else if (value->m_unit == CSSParserValue::Function) { - parsedValue = parseBasicShape(); - } else if (value->m_unit == CSSParserValue::URI) { - // TODO(timloh): This will allow trailing junk - return CSSURIValue::create(value->string); - } - break; - case CSSPropertyShapeOutside: - if (id == CSSValueNone) - validPrimitive = true; - else - parsedValue = parseShapeProperty(propId); - break; - case CSSPropertyAlignContent: ASSERT(RuntimeEnabledFeatures::cssGridLayoutEnabled()); parsedValue = parseContentDistributionOverflowPosition(); @@ -2185,80 +2167,6 @@ return parsedValues; } -void completeBorderRadii(RefPtrWillBeRawPtr<CSSPrimitiveValue> radii[4]) -{ - if (radii[3]) - return; - if (!radii[2]) { - if (!radii[1]) - radii[1] = radii[0]; - radii[2] = radii[0]; - } - radii[3] = radii[1]; -} - -PassRefPtrWillBeRawPtr<CSSBasicShapeInsetValue> CSSPropertyParser::parseBasicShapeInset(CSSParserValueList* args) -{ - ASSERT(args); - - RefPtrWillBeRawPtr<CSSBasicShapeInsetValue> shape = CSSBasicShapeInsetValue::create(); - - CSSParserValue* argument = args->current(); - WillBeHeapVector<RefPtrWillBeMember<CSSPrimitiveValue>> widthArguments; - bool hasRoundedInset = false; - - while (argument) { - if (argument->m_unit == CSSParserValue::Identifier && argument->id == CSSValueRound) { - if (!args->next()) - return nullptr; - hasRoundedInset = true; - break; - } - - Units unitFlags = FLength | FPercent; - if (!validUnit(argument, unitFlags) || widthArguments.size() > 4) - return nullptr; - - widthArguments.append(createPrimitiveNumericValue(argument)); - argument = args->next(); - } - - switch (widthArguments.size()) { - case 1: { - shape->updateShapeSize1Value(widthArguments[0].get()); - break; - } - case 2: { - shape->updateShapeSize2Values(widthArguments[0].get(), widthArguments[1].get()); - break; - } - case 3: { - shape->updateShapeSize3Values(widthArguments[0].get(), widthArguments[1].get(), widthArguments[2].get()); - break; - } - case 4: { - shape->updateShapeSize4Values(widthArguments[0].get(), widthArguments[1].get(), widthArguments[2].get(), widthArguments[3].get()); - break; - } - default: - return nullptr; - } - - if (hasRoundedInset) { - // FIXME: Refactor completeBorderRadii and the array - RefPtrWillBeRawPtr<CSSPrimitiveValue> radii[4]; - RefPtrWillBeRawPtr<CSSPrimitiveValue> radii2[4]; - if (!parseRadii(radii, radii2, args)) - return nullptr; - shape->setTopLeftRadius(CSSValuePair::create(radii[0].release(), radii2[0].release(), CSSValuePair::DropIdenticalValues)); - shape->setTopRightRadius(CSSValuePair::create(radii[1].release(), radii2[1].release(), CSSValuePair::DropIdenticalValues)); - shape->setBottomRightRadius(CSSValuePair::create(radii[2].release(), radii2[2].release(), CSSValuePair::DropIdenticalValues)); - shape->setBottomLeftRadius(CSSValuePair::create(radii[3].release(), radii2[3].release(), CSSValuePair::DropIdenticalValues)); - } - - return shape.release(); -} - static bool isContentDistributionKeyword(CSSValueID id) { return id == CSSValueSpaceBetween || id == CSSValueSpaceAround @@ -2407,243 +2315,6 @@ return position.release(); } -PassRefPtrWillBeRawPtr<CSSPrimitiveValue> CSSPropertyParser::parseShapeRadius(CSSParserValue* value) -{ - if (value->id == CSSValueClosestSide || value->id == CSSValueFarthestSide) - return cssValuePool().createIdentifierValue(value->id); - - if (!validUnit(value, FLength | FPercent | FNonNeg)) - return nullptr; - - return createPrimitiveNumericValue(value); -} - -PassRefPtrWillBeRawPtr<CSSBasicShapeCircleValue> CSSPropertyParser::parseBasicShapeCircle(CSSParserValueList* args) -{ - ASSERT(args); - - // circle(radius) - // circle(radius at <position>) - // circle(at <position>) - // where position defines centerX and centerY using a CSS <position> data type. - RefPtrWillBeRawPtr<CSSBasicShapeCircleValue> shape = CSSBasicShapeCircleValue::create(); - - for (CSSParserValue* argument = args->current(); argument; argument = args->next()) { - // The call to parseFillPosition below should consume all of the - // arguments except the first two. Thus, and index greater than one - // indicates an invalid production. - if (args->currentIndex() > 1) - return nullptr; - - if (!args->currentIndex() && argument->id != CSSValueAt) { - if (RefPtrWillBeRawPtr<CSSPrimitiveValue> radius = parseShapeRadius(argument)) { - shape->setRadius(radius); - continue; - } - - return nullptr; - } - - if (argument->id == CSSValueAt && args->next()) { - RefPtrWillBeRawPtr<CSSValue> centerX = nullptr; - RefPtrWillBeRawPtr<CSSValue> centerY = nullptr; - parseFillPosition(args, centerX, centerY); - if (centerX && centerY && !args->current()) { - shape->setCenterX(centerX); - shape->setCenterY(centerY); - } else { - return nullptr; - } - } else { - return nullptr; - } - } - - return shape.release(); -} - -PassRefPtrWillBeRawPtr<CSSBasicShapeEllipseValue> CSSPropertyParser::parseBasicShapeEllipse(CSSParserValueList* args) -{ - ASSERT(args); - - // ellipse(radiusX) - // ellipse(radiusX at <position>) - // ellipse(radiusX radiusY) - // ellipse(radiusX radiusY at <position>) - // ellipse(at <position>) - // where position defines centerX and centerY using a CSS <position> data type. - RefPtrWillBeRawPtr<CSSBasicShapeEllipseValue> shape = CSSBasicShapeEllipseValue::create(); - - for (CSSParserValue* argument = args->current(); argument; argument = args->next()) { - // The call to parseFillPosition below should consume all of the - // arguments except the first three. Thus, an index greater than two - // indicates an invalid production. - if (args->currentIndex() > 2) - return nullptr; - - if (args->currentIndex() < 2 && argument->id != CSSValueAt) { - if (RefPtrWillBeRawPtr<CSSPrimitiveValue> radius = parseShapeRadius(argument)) { - if (!shape->radiusX()) - shape->setRadiusX(radius); - else - shape->setRadiusY(radius); - continue; - } - - return nullptr; - } - - if (argument->id != CSSValueAt || !args->next()) // expecting ellipse(.. at <position>) - return nullptr; - RefPtrWillBeRawPtr<CSSValue> centerX = nullptr; - RefPtrWillBeRawPtr<CSSValue> centerY = nullptr; - parseFillPosition(args, centerX, centerY); - if (!centerX || !centerY || args->current()) - return nullptr; - - shape->setCenterX(centerX); - shape->setCenterY(centerY); - } - - return shape.release(); -} - -PassRefPtrWillBeRawPtr<CSSBasicShapePolygonValue> CSSPropertyParser::parseBasicShapePolygon(CSSParserValueList* args) -{ - ASSERT(args); - - unsigned size = args->size(); - if (!size) - return nullptr; - - RefPtrWillBeRawPtr<CSSBasicShapePolygonValue> shape = CSSBasicShapePolygonValue::create(); - - CSSParserValue* argument = args->current(); - if (argument->id == CSSValueEvenodd || argument->id == CSSValueNonzero) { - shape->setWindRule(argument->id == CSSValueEvenodd ? RULE_EVENODD : RULE_NONZERO); - args->next(); - - if (!consumeComma(args)) - return nullptr; - - size -= 2; - } - - // <length> <length>, ... <length> <length> -> each pair has 3 elements except the last one - if (!size || (size % 3) - 2) - return nullptr; - - while (true) { - CSSParserValue* argumentX = args->current(); - if (!argumentX || !validUnit(argumentX, FLength | FPercent)) - return nullptr; - RefPtrWillBeRawPtr<CSSPrimitiveValue> xLength = createPrimitiveNumericValue(argumentX); - - CSSParserValue* argumentY = args->next(); - if (!argumentY || !validUnit(argumentY, FLength | FPercent)) - return nullptr; - RefPtrWillBeRawPtr<CSSPrimitiveValue> yLength = createPrimitiveNumericValue(argumentY); - - shape->appendPoint(xLength.release(), yLength.release()); - - if (!args->next()) - break; - if (!consumeComma(args)) - return nullptr; - } - - return shape.release(); -} - -static bool isBoxValue(CSSValueID valueId) -{ - switch (valueId) { - case CSSValueContentBox: - case CSSValuePaddingBox: - case CSSValueBorderBox: - case CSSValueMarginBox: - return true; - default: - break; - } - - return false; -} - -PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::parseShapeProperty(CSSPropertyID propId) -{ - RefPtrWillBeRawPtr<CSSValue> imageValue = nullptr; - if (parseFillImage(m_valueList, imageValue)) { - m_valueList->next(); - return imageValue.release(); - } - - return parseBasicShapeAndOrBox(); -} - -PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::parseBasicShapeAndOrBox() -{ - CSSParserValue* value = m_valueList->current(); - - bool shapeFound = false; - bool boxFound = false; - CSSValueID valueId; - - RefPtrWillBeRawPtr<CSSValueList> list = CSSValueList::createSpaceSeparated(); - for (unsigned i = 0; i < 2; ++i) { - if (!value) - break; - valueId = value->id; - if (value->m_unit == CSSParserValue::Function && !shapeFound) { - // parseBasicShape already asks for the next value list item. - RefPtrWillBeRawPtr<CSSValue> shapeValue = parseBasicShape(); - if (!shapeValue) - return nullptr; - list->append(shapeValue.release()); - shapeFound = true; - } else if (isBoxValue(valueId) && !boxFound) { - list->append(parseValidPrimitive(valueId, value)); - boxFound = true; - m_valueList->next(); - } else { - return nullptr; - } - - value = m_valueList->current(); - } - - if (m_valueList->current()) - return nullptr; - return list.release(); -} - -PassRefPtrWillBeRawPtr<CSSValue> CSSPropertyParser::parseBasicShape() -{ - CSSParserValue* value = m_valueList->current(); - ASSERT(value->m_unit == CSSParserValue::Function); - CSSParserValueList* args = value->function->args.get(); - - if (!args) - return nullptr; - - RefPtrWillBeRawPtr<CSSValue> shape = nullptr; - if (value->function->id == CSSValueCircle) - shape = parseBasicShapeCircle(args); - else if (value->function->id == CSSValueEllipse) - shape = parseBasicShapeEllipse(args); - else if (value->function->id == CSSValuePolygon) - shape = parseBasicShapePolygon(args); - else if (value->function->id == CSSValueInset) - shape = parseBasicShapeInset(args); - - if (!shape) - return nullptr; - - m_valueList->next(); - - return shape.release(); -} - inline int CSSPropertyParser::colorIntFromValue(CSSParserValue* v) { bool isPercent; @@ -3332,48 +3003,6 @@ return parseBorderImageQuad(FLength | FNumber | FNonNeg, result); } -bool CSSPropertyParser::parseRadii(RefPtrWillBeRawPtr<CSSPrimitiveValue> radii[4], RefPtrWillBeRawPtr<CSSPrimitiveValue> radii2[4], CSSParserValueList* args, CSSPropertyID unresolvedProperty) -{ -#if ENABLE(OILPAN) - // Unconditionally zero initialize the arrays of raw pointers. - memset(radii, 0, 4 * sizeof(radii[0])); - memset(radii2, 0, 4 * sizeof(radii2[0])); -#endif - CSSParserValue* value = args->current(); - int i; - for (i = 0; i < 4 && value && value->m_unit != CSSParserValue::Operator;++i, value = args->next()) { - if (!validUnit(value, FLength | FPercent | FNonNeg)) - return false; - - radii[i] = createPrimitiveNumericValue(value); - } - - if (!i || (value && value->m_unit == CSSParserValue::Operator && value->iValue != '/')) - return false; - // Legacy syntax: -webkit-border-radius: l1 l2; is equivalent to border-radius: l1 / l2; - if (!value && i == 2 && unresolvedProperty == CSSPropertyAliasWebkitBorderRadius) { - radii2[0] = radii[1]; - radii[1] = nullptr; - completeBorderRadii(radii); - completeBorderRadii(radii2); - return true; - } - completeBorderRadii(radii); - if (value) { - value = args->next(); - for (i = 0; i < 4 && value && validUnit(value, FLength | FPercent | FNonNeg); ++i, value = args->next()) - radii2[i] = createPrimitiveNumericValue(value); - if (!i || value) - return false; - completeBorderRadii(radii2); - } else { - for (unsigned i = 0; i < 4; ++i) - radii2[i] = radii[i]; - } - - return true; -} - // This should go away once we drop support for -webkit-gradient static PassRefPtrWillBeRawPtr<CSSPrimitiveValue> parseDeprecatedGradientPoint(CSSParserValue* a, bool horizontal) {
diff --git a/third_party/WebKit/Source/core/css/resolver/SharedStyleFinder.cpp b/third_party/WebKit/Source/core/css/resolver/SharedStyleFinder.cpp index 14d22366..b1183559 100644 --- a/third_party/WebKit/Source/core/css/resolver/SharedStyleFinder.cpp +++ b/third_party/WebKit/Source/core/css/resolver/SharedStyleFinder.cpp
@@ -39,6 +39,7 @@ #include "core/dom/NodeComputedStyle.h" #include "core/dom/QualifiedName.h" #include "core/dom/SpaceSplitString.h" +#include "core/dom/StyleEngine.h" #include "core/dom/shadow/ElementShadow.h" #include "core/dom/shadow/InsertionPoint.h" #include "core/html/HTMLElement.h" @@ -323,7 +324,7 @@ ComputedStyle* SharedStyleFinder::findSharedStyle() { - INCREMENT_STYLE_STATS_COUNTER(*m_styleResolver, sharedStyleLookups, 1); + INCREMENT_STYLE_STATS_COUNTER(document().styleEngine(), sharedStyleLookups, 1); if (!element().supportsStyleSharing()) return nullptr; @@ -334,26 +335,26 @@ Element* shareElement = findElementForStyleSharing(); if (!shareElement) { - if (m_styleResolver->stats() && m_styleResolver->stats()->allCountersEnabled() && documentContainsValidCandidate()) - INCREMENT_STYLE_STATS_COUNTER(*m_styleResolver, sharedStyleMissed, 1); + if (document().styleEngine().stats() && document().styleEngine().stats()->allCountersEnabled() && documentContainsValidCandidate()) + INCREMENT_STYLE_STATS_COUNTER(document().styleEngine(), sharedStyleMissed, 1); return nullptr; } - INCREMENT_STYLE_STATS_COUNTER(*m_styleResolver, sharedStyleFound, 1); + INCREMENT_STYLE_STATS_COUNTER(document().styleEngine(), sharedStyleFound, 1); if (matchesRuleSet(m_siblingRuleSet)) { - INCREMENT_STYLE_STATS_COUNTER(*m_styleResolver, sharedStyleRejectedBySiblingRules, 1); + INCREMENT_STYLE_STATS_COUNTER(document().styleEngine(), sharedStyleRejectedBySiblingRules, 1); return nullptr; } if (matchesRuleSet(m_uncommonAttributeRuleSet)) { - INCREMENT_STYLE_STATS_COUNTER(*m_styleResolver, sharedStyleRejectedByUncommonAttributeRules, 1); + INCREMENT_STYLE_STATS_COUNTER(document().styleEngine(), sharedStyleRejectedByUncommonAttributeRules, 1); return nullptr; } // Tracking child index requires unique style for each node. This may get set by the sibling rule match above. if (!element().parentElementOrShadowRoot()->childrenSupportStyleSharing()) { - INCREMENT_STYLE_STATS_COUNTER(*m_styleResolver, sharedStyleRejectedByParent, 1); + INCREMENT_STYLE_STATS_COUNTER(document().styleEngine(), sharedStyleRejectedByParent, 1); return nullptr; }
diff --git a/third_party/WebKit/Source/core/css/resolver/StyleBuilderConverter.cpp b/third_party/WebKit/Source/core/css/resolver/StyleBuilderConverter.cpp index a6f2fbf..721b3e5 100644 --- a/third_party/WebKit/Source/core/css/resolver/StyleBuilderConverter.cpp +++ b/third_party/WebKit/Source/core/css/resolver/StyleBuilderConverter.cpp
@@ -911,7 +911,7 @@ if (list.length() >= 2) ty = convertLength(state, *list.item(1)); if (list.length() == 3) - tz = toCSSPrimitiveValue(list.item(2))->getDoubleValue(); + tz = toCSSPrimitiveValue(list.item(2))->computeLength<double>(state.cssToLengthConversionData()); return TranslateTransformOperation::create(tx, ty, tz, TransformOperation::Translate3D); }
diff --git a/third_party/WebKit/Source/core/css/resolver/StyleResolver.cpp b/third_party/WebKit/Source/core/css/resolver/StyleResolver.cpp index 4be7bd2..6b6cd1db 100644 --- a/third_party/WebKit/Source/core/css/resolver/StyleResolver.cpp +++ b/third_party/WebKit/Source/core/css/resolver/StyleResolver.cpp
@@ -146,7 +146,6 @@ , m_needCollectFeatures(false) , m_printMediaType(false) , m_styleSharingDepth(0) - , m_accessCount(0) { FrameView* view = document.view(); if (view) { @@ -329,7 +328,7 @@ // otherwise we could leave stale pointers in there. if (!document().inStyleRecalc()) return; - INCREMENT_STYLE_STATS_COUNTER(*this, sharedStyleCandidates, 1); + INCREMENT_STYLE_STATS_COUNTER(document().styleEngine(), sharedStyleCandidates, 1); StyleSharingList& list = styleSharingList(); if (list.size() >= styleSharingListSize) list.removeLast(); @@ -576,8 +575,8 @@ return s_styleNotYetAvailable; } - didAccess(); - INCREMENT_STYLE_STATS_COUNTER(*this, elementsStyled, 1); + document().styleEngine().incStyleForElementCount(); + INCREMENT_STYLE_STATS_COUNTER(document().styleEngine(), elementsStyled, 1); StyleResolverParentScope::ensureParentStackIsPushed(); @@ -661,14 +660,14 @@ if (elementAnimations) elementAnimations->updateBaseComputedStyle(state.style()); } else { - INCREMENT_STYLE_STATS_COUNTER(*this, baseStylesUsed, 1); + INCREMENT_STYLE_STATS_COUNTER(document().styleEngine(), baseStylesUsed, 1); } // FIXME: The CSSWG wants to specify that the effects of animations are applied before // important rules, but this currently happens here as we require adjustment to have happened // before deciding which properties to transition. if (applyAnimatedProperties(state, element)) { - INCREMENT_STYLE_STATS_COUNTER(*this, stylesAnimated, 1); + INCREMENT_STYLE_STATS_COUNTER(document().styleEngine(), stylesAnimated, 1); adjustComputedStyle(state, element); } @@ -819,8 +818,8 @@ if (applyAnimatedProperties(state, pseudoElement)) adjustComputedStyle(state, 0); - didAccess(); - INCREMENT_STYLE_STATS_COUNTER(*this, pseudoElementsStyled, 1); + document().styleEngine().incStyleForElementCount(); + INCREMENT_STYLE_STATS_COUNTER(document().styleEngine(), pseudoElementsStyled, 1); if (state.style()->hasViewportUnits()) document().setHasViewportUnits(); @@ -878,8 +877,6 @@ loadPendingResources(state); - didAccess(); - // Now return the style. return state.takeStyle(); } @@ -1348,21 +1345,21 @@ const Element* element = state.element(); ASSERT(element); - INCREMENT_STYLE_STATS_COUNTER(*this, matchedPropertyApply, 1); + INCREMENT_STYLE_STATS_COUNTER(document().styleEngine(), matchedPropertyApply, 1); unsigned cacheHash = RuntimeEnabledFeatures::styleMatchedPropertiesCacheEnabled() && matchResult.isCacheable() ? computeMatchedPropertiesHash(matchResult.matchedProperties().data(), matchResult.matchedProperties().size()) : 0; bool applyInheritedOnly = false; const CachedMatchedProperties* cachedMatchedProperties = cacheHash ? m_matchedPropertiesCache.find(cacheHash, state, matchResult.matchedProperties()) : nullptr; if (cachedMatchedProperties && MatchedPropertiesCache::isCacheable(*state.style(), *state.parentStyle())) { - INCREMENT_STYLE_STATS_COUNTER(*this, matchedPropertyCacheHit, 1); + INCREMENT_STYLE_STATS_COUNTER(document().styleEngine(), matchedPropertyCacheHit, 1); // We can build up the style by copying non-inherited properties from an earlier style object built using the same exact // style declarations. We then only need to apply the inherited properties, if any, as their values can depend on the // element context. This is fast and saves memory by reusing the style data structures. state.style()->copyNonInheritedFromCached(*cachedMatchedProperties->computedStyle); if (state.parentStyle()->inheritedDataShared(*cachedMatchedProperties->parentComputedStyle) && !isAtShadowBoundary(element) && (!state.distributedToInsertionPoint() || state.style()->userModify() == READ_ONLY)) { - INCREMENT_STYLE_STATS_COUNTER(*this, matchedPropertyCacheInheritedHit, 1); + INCREMENT_STYLE_STATS_COUNTER(document().styleEngine(), matchedPropertyCacheInheritedHit, 1); EInsideLink linkStatus = state.style()->insideLink(); // If the cache item parent style has identical inherited properties to the current parent style then the @@ -1444,7 +1441,7 @@ if (!cachedMatchedProperties && cacheHash && MatchedPropertiesCache::isCacheable(*state.style(), *state.parentStyle())) { ASSERT(RuntimeEnabledFeatures::styleMatchedPropertiesCacheEnabled()); - INCREMENT_STYLE_STATS_COUNTER(*this, matchedPropertyCacheAdded, 1); + INCREMENT_STYLE_STATS_COUNTER(document().styleEngine(), matchedPropertyCacheAdded, 1); m_matchedPropertiesCache.add(*state.style(), *state.parentStyle(), cacheHash, matchResult.matchedProperties()); } @@ -1494,19 +1491,6 @@ state.style()->addCallbackSelector(rules->at(i)->selectorList().selectorsText()); } -void StyleResolver::setStatsEnabled(bool enabled) -{ - if (enabled) { - if (!m_styleResolverStats) { - m_styleResolverStats = StyleResolverStats::create(); - } else { - m_styleResolverStats->reset(); - } - } else { - m_styleResolverStats = nullptr; - } -} - void StyleResolver::computeFont(ComputedStyle* style, const StylePropertySet& propertySet) { CSSPropertyID properties[] = {
diff --git a/third_party/WebKit/Source/core/css/resolver/StyleResolver.h b/third_party/WebKit/Source/core/css/resolver/StyleResolver.h index 2d3c239..3c6c0657 100644 --- a/third_party/WebKit/Source/core/css/resolver/StyleResolver.h +++ b/third_party/WebKit/Source/core/css/resolver/StyleResolver.h
@@ -33,7 +33,6 @@ #include "core/css/resolver/CSSPropertyPriority.h" #include "core/css/resolver/MatchedPropertiesCache.h" #include "core/css/resolver/StyleBuilder.h" -#include "core/css/resolver/StyleResolverStats.h" #include "core/dom/DocumentOrderedList.h" #include "core/style/CachedUAStyle.h" #include "platform/heap/Handle.h" @@ -167,12 +166,6 @@ void addToStyleSharingList(Element&); void clearStyleSharingList(); - StyleResolverStats* stats() { return m_styleResolverStats.get(); } - void setStatsEnabled(bool); - - unsigned accessCount() const { return m_accessCount; } - void didAccess() { ++m_accessCount; } - void increaseStyleSharingDepth() { ++m_styleSharingDepth; } void decreaseStyleSharingDepth() { --m_styleSharingDepth; } @@ -256,11 +249,6 @@ unsigned m_styleSharingDepth; WillBeHeapVector<OwnPtrWillBeMember<StyleSharingList>, styleSharingMaxDepth> m_styleSharingLists; - - OwnPtr<StyleResolverStats> m_styleResolverStats; - - // Use only for Internals::updateStyleAndReturnAffectedElementCount. - unsigned m_accessCount; }; } // namespace blink
diff --git a/third_party/WebKit/Source/core/css/resolver/StyleResolverStats.h b/third_party/WebKit/Source/core/css/resolver/StyleResolverStats.h index d3da283b..1ab28fc 100644 --- a/third_party/WebKit/Source/core/css/resolver/StyleResolverStats.h +++ b/third_party/WebKit/Source/core/css/resolver/StyleResolverStats.h
@@ -77,7 +77,7 @@ } }; -#define INCREMENT_STYLE_STATS_COUNTER(resolver, counter, n) ((resolver).stats() && ((resolver).stats()-> counter += n)); +#define INCREMENT_STYLE_STATS_COUNTER(styleEngine, counter, n) ((styleEngine).stats() && ((styleEngine).stats()-> counter += n)); } // namespace blink
diff --git a/third_party/WebKit/Source/core/dom/Document.cpp b/third_party/WebKit/Source/core/dom/Document.cpp index 76d4a79..2e5102e 100644 --- a/third_party/WebKit/Source/core/dom/Document.cpp +++ b/third_party/WebKit/Source/core/dom/Document.cpp
@@ -452,7 +452,6 @@ , m_didAssociateFormControlsTimer(this, &Document::didAssociateFormControlsTimerFired) , m_timers(timerTaskRunner()->adoptClone()) , m_hasViewportUnits(false) - , m_styleRecalcElementCounter(0) , m_parserSyncPolicy(AllowAsynchronousParsing) , m_nodeCount(0) { @@ -1775,8 +1774,8 @@ TRACE_EVENT_BEGIN1("blink,devtools.timeline", "UpdateLayoutTree", "beginData", InspectorRecalculateStylesEvent::data(frame())); TRACE_EVENT_SCOPED_SAMPLING_STATE("blink", "UpdateLayoutTree"); - // FIXME: Remove m_styleRecalcElementCounter, we should just use the accessCount() on the resolver. - m_styleRecalcElementCounter = 0; + unsigned startElementCount = styleEngine().styleForElementCount(); + InspectorInstrumentationCookie cookie = InspectorInstrumentation::willRecalculateStyle(this); DocumentAnimations::updateAnimationTimingIfNeeded(*this); @@ -1808,8 +1807,10 @@ ASSERT(!DocumentAnimations::needsAnimationTimingUpdate(*this)); - TRACE_EVENT_END1("blink,devtools.timeline", "UpdateLayoutTree", "elementCount", m_styleRecalcElementCounter); - InspectorInstrumentation::didRecalculateStyle(cookie, m_styleRecalcElementCounter); + unsigned elementCount = styleEngine().styleForElementCount() - startElementCount; + + TRACE_EVENT_END1("blink,devtools.timeline", "UpdateLayoutTree", "elementCount", elementCount); + InspectorInstrumentation::didRecalculateStyle(cookie, elementCount); #if ENABLE(ASSERT) assertLayoutTreeUpdated(*this); @@ -1822,7 +1823,7 @@ return; TRACE_EVENT_BEGIN0("blink,blink_style", "Document::updateStyle"); - unsigned initialResolverAccessCount = styleEngine().resolverAccessCount(); + unsigned initialElementCount = styleEngine().styleForElementCount(); HTMLFrameOwnerElement::UpdateSuspendScope suspendWidgetHierarchyUpdates; m_lifecycle.advanceTo(DocumentLifecycle::InStyleRecalc); @@ -1851,7 +1852,7 @@ bool shouldRecordStats; TRACE_EVENT_CATEGORY_GROUP_ENABLED("blink,blink_style", &shouldRecordStats); - resolver.setStatsEnabled(shouldRecordStats); + styleEngine().setStatsEnabled(shouldRecordStats); if (Element* documentElement = this->documentElement()) { inheritHtmlAndBodyElementStyles(change); @@ -1880,11 +1881,11 @@ m_lifecycle.advanceTo(DocumentLifecycle::StyleClean); if (shouldRecordStats) { TRACE_EVENT_END2("blink,blink_style", "Document::updateStyle", - "resolverAccessCount", styleEngine().resolverAccessCount() - initialResolverAccessCount, - "counters", resolver.stats()->toTracedValue()); + "resolverAccessCount", styleEngine().styleForElementCount() - initialElementCount, + "counters", styleEngine().stats()->toTracedValue()); } else { TRACE_EVENT_END1("blink,blink_style", "Document::updateStyle", - "resolverAccessCount", styleEngine().resolverAccessCount() - initialResolverAccessCount); + "resolverAccessCount", styleEngine().styleForElementCount() - initialElementCount); } }
diff --git a/third_party/WebKit/Source/core/dom/Document.h b/third_party/WebKit/Source/core/dom/Document.h index 060ec05..1cd76ec 100644 --- a/third_party/WebKit/Source/core/dom/Document.h +++ b/third_party/WebKit/Source/core/dom/Document.h
@@ -1025,7 +1025,6 @@ DECLARE_VIRTUAL_TRACE(); bool hasSVGFilterElementsRequiringLayerUpdate() const { return m_layerUpdateSVGFilterElements.size(); } - void didRecalculateStyleForElement() { ++m_styleRecalcElementCounter; } AtomicString convertLocalName(const AtomicString&); @@ -1396,8 +1395,6 @@ using DocumentVisibilityObserverSet = WillBeHeapHashSet<RawPtrWillBeWeakMember<DocumentVisibilityObserver>>; DocumentVisibilityObserverSet m_visibilityObservers; - int m_styleRecalcElementCounter; - ParserSynchronizationPolicy m_parserSyncPolicy; OriginsUsingFeatures::Value m_originsUsingFeaturesValue;
diff --git a/third_party/WebKit/Source/core/dom/Element.cpp b/third_party/WebKit/Source/core/dom/Element.cpp index b130342..b6f4ecb 100644 --- a/third_party/WebKit/Source/core/dom/Element.cpp +++ b/third_party/WebKit/Source/core/dom/Element.cpp
@@ -1709,7 +1709,6 @@ style->setHasInlineTransform(inlineStyle->hasProperty(CSSPropertyTransform)); } - document().didRecalculateStyleForElement(); return style.release(); } @@ -1790,9 +1789,9 @@ StyleRecalcChange localChange = ComputedStyle::stylePropagationDiff(oldStyle.get(), newStyle.get()); if (localChange == NoChange) { - INCREMENT_STYLE_STATS_COUNTER(*document().styleResolver(), stylesUnchanged, 1); + INCREMENT_STYLE_STATS_COUNTER(document().styleEngine(), stylesUnchanged, 1); } else { - INCREMENT_STYLE_STATS_COUNTER(*document().styleResolver(), stylesChanged, 1); + INCREMENT_STYLE_STATS_COUNTER(document().styleEngine(), stylesChanged, 1); } if (localChange == Reattach) {
diff --git a/third_party/WebKit/Source/core/dom/ScriptLoader.h b/third_party/WebKit/Source/core/dom/ScriptLoader.h index edda4f4..7b71d0c 100644 --- a/third_party/WebKit/Source/core/dom/ScriptLoader.h +++ b/third_party/WebKit/Source/core/dom/ScriptLoader.h
@@ -86,9 +86,6 @@ // Clears the connection to the PendingScript (and Element and Resource). void detach(); -#if !ENABLE(OILPAN) - bool isDetached() const { return !m_pendingScript; } -#endif protected: ScriptLoader(Element*, bool createdByParser, bool isEvaluated);
diff --git a/third_party/WebKit/Source/core/dom/ScriptRunner.cpp b/third_party/WebKit/Source/core/dom/ScriptRunner.cpp index 7eaf99e..c10c779a 100644 --- a/third_party/WebKit/Source/core/dom/ScriptRunner.cpp +++ b/third_party/WebKit/Source/core/dom/ScriptRunner.cpp
@@ -42,6 +42,7 @@ , m_numberOfInOrderScriptsWithPendingNotification(0) , m_isSuspended(false) #if !ENABLE(OILPAN) + , m_isDisposed(false) , m_weakPointerFactoryForTasks(this) #endif { @@ -97,6 +98,7 @@ m_pendingAsyncScripts.clear(); m_inOrderScriptsToExecuteSoon.clear(); m_asyncScriptsToExecuteSoon.clear(); + m_isDisposed = true; m_numberOfInOrderScriptsWithPendingNotification = 0; } #endif @@ -207,8 +209,7 @@ bool foundLoader = m_pendingAsyncScripts.contains(scriptLoader); #if !ENABLE(OILPAN) // If the ScriptRunner has been disposed of, no pending scripts remain. - // Verify that the ScriptLoader is in a detached state, if so. - foundLoader = foundLoader || (scriptLoader->isDetached() && m_pendingAsyncScripts.isEmpty()); + foundLoader = foundLoader || m_isDisposed; #endif RELEASE_ASSERT_WITH_SECURITY_IMPLICATION(foundLoader); m_pendingAsyncScripts.remove(scriptLoader); @@ -217,7 +218,7 @@ case IN_ORDER_EXECUTION: bool foundLoader = removePendingInOrderScript(scriptLoader); #if !ENABLE(OILPAN) - foundLoader = foundLoader || (scriptLoader->isDetached() && m_pendingInOrderScripts.isEmpty()); + foundLoader = foundLoader || m_isDisposed; #endif RELEASE_ASSERT_WITH_SECURITY_IMPLICATION(foundLoader); break;
diff --git a/third_party/WebKit/Source/core/dom/ScriptRunner.h b/third_party/WebKit/Source/core/dom/ScriptRunner.h index cc916b3..a553e51 100644 --- a/third_party/WebKit/Source/core/dom/ScriptRunner.h +++ b/third_party/WebKit/Source/core/dom/ScriptRunner.h
@@ -98,6 +98,7 @@ #endif #if !ENABLE(OILPAN) + bool m_isDisposed; WeakPtrFactory<ScriptRunner> m_weakPointerFactoryForTasks; #endif };
diff --git a/third_party/WebKit/Source/core/dom/StyleEngine.cpp b/third_party/WebKit/Source/core/dom/StyleEngine.cpp index 6c2876a1..65d35a4 100644 --- a/third_party/WebKit/Source/core/dom/StyleEngine.cpp +++ b/third_party/WebKit/Source/core/dom/StyleEngine.cpp
@@ -56,16 +56,7 @@ StyleEngine::StyleEngine(Document& document) : m_document(&document) , m_isMaster(!document.importsController() || document.importsController()->master() == &document) - , m_pendingStylesheets(0) , m_documentStyleSheetCollection(DocumentStyleSheetCollection::create(document)) - , m_documentScopeDirty(true) - , m_usesSiblingRules(false) - , m_usesFirstLineRules(false) - , m_usesWindowInactiveSelector(false) - , m_usesRemUnits(false) - , m_maxDirectAdjacentSelectors(0) - , m_ignorePendingStylesheets(false) - , m_didCalculateResolver(false) // We don't need to create CSSFontSelector for imported document or // HTMLTemplateElement's document, because those documents have no frame. , m_fontSelector(document.frame() ? CSSFontSelector::create(&document) : nullptr) @@ -434,11 +425,6 @@ master->styleEngine().clearResolver(); } -unsigned StyleEngine::resolverAccessCount() const -{ - return m_resolver ? m_resolver->accessCount() : 0; -} - void StyleEngine::didDetach() { clearResolver(); @@ -726,6 +712,18 @@ m_styleInvalidator.scheduleInvalidationSetsForElement(invalidationLists, element); } +void StyleEngine::setStatsEnabled(bool enabled) +{ + if (!enabled) { + m_styleResolverStats = nullptr; + return; + } + if (!m_styleResolverStats) + m_styleResolverStats = StyleResolverStats::create(); + else + m_styleResolverStats->reset(); +} + DEFINE_TRACE(StyleEngine) { #if ENABLE(OILPAN)
diff --git a/third_party/WebKit/Source/core/dom/StyleEngine.h b/third_party/WebKit/Source/core/dom/StyleEngine.h index 8a1cabeb..8b1f7cc 100644 --- a/third_party/WebKit/Source/core/dom/StyleEngine.h +++ b/third_party/WebKit/Source/core/dom/StyleEngine.h
@@ -32,6 +32,7 @@ #include "core/css/CSSFontSelectorClient.h" #include "core/css/invalidation/StyleInvalidator.h" #include "core/css/resolver/StyleResolver.h" +#include "core/css/resolver/StyleResolverStats.h" #include "core/dom/Document.h" #include "core/dom/DocumentOrderedList.h" #include "core/dom/DocumentStyleSheetCollection.h" @@ -161,7 +162,6 @@ void didDetach(); bool shouldClearResolver() const; void resolverChanged(StyleResolverUpdateMode); - unsigned resolverAccessCount() const; void markDocumentDirty(); @@ -178,6 +178,12 @@ void idChangedForElement(const AtomicString& oldId, const AtomicString& newId, Element&); void pseudoStateChangedForElement(CSSSelector::PseudoType, Element&); + unsigned styleForElementCount() const { return m_styleForElementCount; } + void incStyleForElementCount() { m_styleForElementCount++; } + + StyleResolverStats* stats() { return m_styleResolverStats.get(); } + void setStatsEnabled(bool); + DECLARE_VIRTUAL_TRACE(); private: @@ -227,7 +233,7 @@ // Sheets loaded using the @import directive are not included in this count. // We use this count of pending sheets to detect when we can begin attaching // elements and when it is safe to execute scripts. - int m_pendingStylesheets; + int m_pendingStylesheets = 0; WillBeHeapVector<RefPtrWillBeMember<CSSStyleSheet>> m_injectedAuthorStyleSheets; @@ -236,21 +242,21 @@ typedef WillBeHeapHashMap<RawPtrWillBeWeakMember<TreeScope>, OwnPtrWillBeMember<ShadowTreeStyleSheetCollection>> StyleSheetCollectionMap; StyleSheetCollectionMap m_styleSheetCollectionMap; - bool m_documentScopeDirty; + bool m_documentScopeDirty = true; UnorderedTreeScopeSet m_dirtyTreeScopes; UnorderedTreeScopeSet m_activeTreeScopes; String m_preferredStylesheetSetName; String m_selectedStylesheetSetName; - bool m_usesSiblingRules; - bool m_usesFirstLineRules; - bool m_usesWindowInactiveSelector; - bool m_usesRemUnits; - unsigned m_maxDirectAdjacentSelectors; + bool m_usesSiblingRules = false; + bool m_usesFirstLineRules = false; + bool m_usesWindowInactiveSelector = false; + bool m_usesRemUnits = false; + unsigned m_maxDirectAdjacentSelectors = 0; - bool m_ignorePendingStylesheets; - bool m_didCalculateResolver; + bool m_ignorePendingStylesheets = false; + bool m_didCalculateResolver = false; OwnPtrWillBeMember<StyleResolver> m_resolver; StyleInvalidator m_styleInvalidator; @@ -258,6 +264,9 @@ WillBeHeapHashMap<AtomicString, RawPtrWillBeMember<StyleSheetContents>> m_textToSheetCache; WillBeHeapHashMap<RawPtrWillBeMember<StyleSheetContents>, AtomicString> m_sheetToTextCache; + + OwnPtr<StyleResolverStats> m_styleResolverStats; + unsigned m_styleForElementCount = 0; }; } // namespace blink
diff --git a/third_party/WebKit/Source/core/editing/FrameSelection.cpp b/third_party/WebKit/Source/core/editing/FrameSelection.cpp index 33f6b80..a6488425 100644 --- a/third_party/WebKit/Source/core/editing/FrameSelection.cpp +++ b/third_party/WebKit/Source/core/editing/FrameSelection.cpp
@@ -842,7 +842,7 @@ selectStartTarget = document->body(); } } - if (!root) + if (!root || editingIgnoresContent(root.get())) return; if (selectStartTarget && !selectStartTarget->dispatchEvent(Event::createCancelableBubble(EventTypeNames::selectstart)))
diff --git a/third_party/WebKit/Source/core/editing/FrameSelectionTest.cpp b/third_party/WebKit/Source/core/editing/FrameSelectionTest.cpp index 46c4fd2..dccd9db 100644 --- a/third_party/WebKit/Source/core/editing/FrameSelectionTest.cpp +++ b/third_party/WebKit/Source/core/editing/FrameSelectionTest.cpp
@@ -214,4 +214,12 @@ EXPECT_EQ(PositionInComposedTree(bottom, 3), visibleSelectionInComposedTree().end()); } +TEST_F(FrameSelectionTest, SelectAllWithUnselectableRoot) +{ + RefPtrWillBeRawPtr<Element> select = document().createElement("select", ASSERT_NO_EXCEPTION); + document().replaceChild(select.get(), document().documentElement()); + selection().selectAll(); + EXPECT_TRUE(selection().isNone()) << "Nothing should be selected if the content of the documentElement is not selctable."; +} + } // namespace blink
diff --git a/third_party/WebKit/Source/core/editing/commands/ReplaceSelectionCommand.cpp b/third_party/WebKit/Source/core/editing/commands/ReplaceSelectionCommand.cpp index 77f0f49de..a53d03d4 100644 --- a/third_party/WebKit/Source/core/editing/commands/ReplaceSelectionCommand.cpp +++ b/third_party/WebKit/Source/core/editing/commands/ReplaceSelectionCommand.cpp
@@ -642,6 +642,10 @@ if (!node->isHTMLElement()) continue; + // moveElementOutOfAncestor() in a previous iteration might have failed, + // and |node| might have been detached from the document tree. + if (!node->inDocument()) + continue; HTMLElement& element = toHTMLElement(*node); if (isProhibitedParagraphChild(element.localName())) { @@ -656,10 +660,10 @@ } } -void ReplaceSelectionCommand::moveElementOutOfAncestor(PassRefPtrWillBeRawPtr<Element> prpElement, PassRefPtrWillBeRawPtr<ContainerNode> prpAncestor) +void ReplaceSelectionCommand::moveElementOutOfAncestor(PassRefPtrWillBeRawPtr<Element> prpElement, PassRefPtrWillBeRawPtr<Element> prpAncestor) { RefPtrWillBeRawPtr<Element> element = prpElement; - RefPtrWillBeRawPtr<ContainerNode> ancestor = prpAncestor; + RefPtrWillBeRawPtr<Element> ancestor = prpAncestor; if (!ancestor->parentNode()->hasEditableStyle()) return;
diff --git a/third_party/WebKit/Source/core/editing/commands/ReplaceSelectionCommand.h b/third_party/WebKit/Source/core/editing/commands/ReplaceSelectionCommand.h index c91293c6..2966c4b 100644 --- a/third_party/WebKit/Source/core/editing/commands/ReplaceSelectionCommand.h +++ b/third_party/WebKit/Source/core/editing/commands/ReplaceSelectionCommand.h
@@ -95,7 +95,7 @@ void removeRedundantStylesAndKeepStyleSpanInline(InsertedNodes&); void makeInsertedContentRoundTrippableWithHTMLTreeBuilder(const InsertedNodes&); - void moveElementOutOfAncestor(PassRefPtrWillBeRawPtr<Element>, PassRefPtrWillBeRawPtr<ContainerNode> ancestor); + void moveElementOutOfAncestor(PassRefPtrWillBeRawPtr<Element>, PassRefPtrWillBeRawPtr<Element> ancestor); void handleStyleSpans(InsertedNodes&); VisiblePosition positionAtStartOfInsertedContent() const;
diff --git a/third_party/WebKit/Source/core/fetch/ResourceFetcher.cpp b/third_party/WebKit/Source/core/fetch/ResourceFetcher.cpp index 08cf67e..ec40106cc 100644 --- a/third_party/WebKit/Source/core/fetch/ResourceFetcher.cpp +++ b/third_party/WebKit/Source/core/fetch/ResourceFetcher.cpp
@@ -391,6 +391,8 @@ const RevalidationPolicy policy = determineRevalidationPolicy(factory.type(), request, resource.get(), isStaticData); String histogramName = "Blink.MemoryCache.RevalidationPolicy."; + if (request.forPreload()) + histogramName.append("Preload."); histogramName.append(Resource::resourceTypeName(factory.type())); Platform::current()->histogramEnumeration(histogramName.utf8().data(), policy, Load + 1);
diff --git a/third_party/WebKit/Source/core/frame/FrameView.cpp b/third_party/WebKit/Source/core/frame/FrameView.cpp index a6304a7..8fd9984 100644 --- a/third_party/WebKit/Source/core/frame/FrameView.cpp +++ b/third_party/WebKit/Source/core/frame/FrameView.cpp
@@ -3801,6 +3801,10 @@ if (isParentVisible() == visible) return; + // As parent visibility changes, we may need to recomposite this frame view and potentially child frame views. + if (PaintLayerCompositor* compositor = layoutView() ? layoutView()->compositor() : nullptr) + compositor->setNeedsCompositingUpdate(CompositingUpdateRebuildTree); + Widget::setParentVisible(visible); if (!isSelfVisible())
diff --git a/third_party/WebKit/Source/core/frame/FrameViewTest.cpp b/third_party/WebKit/Source/core/frame/FrameViewTest.cpp index 0b51874..ab9fd994 100644 --- a/third_party/WebKit/Source/core/frame/FrameViewTest.cpp +++ b/third_party/WebKit/Source/core/frame/FrameViewTest.cpp
@@ -90,6 +90,8 @@ { RuntimeEnabledFeatures::setSlimmingPaintV2Enabled(true); FrameViewTestBase::SetUp(); + document().view()->setParentVisible(true); + document().view()->setSelfVisible(true); } void TearDown() override
diff --git a/third_party/WebKit/Source/core/frame/UseCounter.h b/third_party/WebKit/Source/core/frame/UseCounter.h index 6f167e2..8dc6f75 100644 --- a/third_party/WebKit/Source/core/frame/UseCounter.h +++ b/third_party/WebKit/Source/core/frame/UseCounter.h
@@ -1003,6 +1003,9 @@ NotificationAPIInsecureOriginIframe = 1147, NotificationAPISecureOriginIframe = 1148, WebSocket = 1149, + MediaStreamConstraintsNameValue = 1150, + MediaStreamConstraintsFromDictionary = 1151, + MediaStreamConstraintsConformant = 1152, // Add new features immediately above this line. Don't change assigned // numbers of any item, and don't reuse removed slots.
diff --git a/third_party/WebKit/Source/core/html/canvas/CanvasAsyncBlobCreator.h b/third_party/WebKit/Source/core/html/canvas/CanvasAsyncBlobCreator.h index d06a843..df7f1d7 100644 --- a/third_party/WebKit/Source/core/html/canvas/CanvasAsyncBlobCreator.h +++ b/third_party/WebKit/Source/core/html/canvas/CanvasAsyncBlobCreator.h
@@ -42,7 +42,7 @@ const IntSize m_size; size_t m_pixelRowStride; const String m_mimeType; - Persistent<BlobCallback> m_callback; + CrossThreadPersistent<BlobCallback> m_callback; RefPtr<CanvasAsyncBlobCreator> m_selfRef; void clearSelfReference();
diff --git a/third_party/WebKit/Source/core/html/imports/HTMLImportLoader.cpp b/third_party/WebKit/Source/core/html/imports/HTMLImportLoader.cpp index add38534..3b3665d 100644 --- a/third_party/WebKit/Source/core/html/imports/HTMLImportLoader.cpp +++ b/third_party/WebKit/Source/core/html/imports/HTMLImportLoader.cpp
@@ -66,6 +66,7 @@ m_document->setImportsController(nullptr); m_document.clear(); } + clearResource(); } void HTMLImportLoader::startLoading(const ResourcePtr<RawResource>& resource) @@ -105,6 +106,7 @@ HTMLImportLoader::State HTMLImportLoader::startWritingAndParsing(const ResourceResponse& response) { + ASSERT(m_controller); ASSERT(!m_imports.isEmpty()); DocumentInit init = DocumentInit(response.url(), 0, m_controller->master()->contextDocument(), m_controller) .withRegistrationContext(m_controller->master()->registrationContext());
diff --git a/third_party/WebKit/Source/core/html/shadow/MediaControlsTest.cpp b/third_party/WebKit/Source/core/html/shadow/MediaControlsTest.cpp index f8fb262..7259d2e 100644 --- a/third_party/WebKit/Source/core/html/shadow/MediaControlsTest.cpp +++ b/third_party/WebKit/Source/core/html/shadow/MediaControlsTest.cpp
@@ -123,12 +123,12 @@ TEST_F(MediaControlsTest, ResetDoesNotTriggerInitialLayout) { Document& document = this->document(); - int oldResolverCount = document.styleEngine().resolverAccessCount(); + int oldElementCount = document.styleEngine().styleForElementCount(); // Also assert that there are no layouts yet. - ASSERT_EQ(0, oldResolverCount); + ASSERT_EQ(0, oldElementCount); mediaControls().reset(); - int newResolverCount = document.styleEngine().resolverAccessCount(); - ASSERT_EQ(oldResolverCount, newResolverCount); + int newElementCount = document.styleEngine().styleForElementCount(); + ASSERT_EQ(oldElementCount, newElementCount); } TEST_F(MediaControlsTest, CastButtonRequiresRoute)
diff --git a/third_party/WebKit/Source/core/inspector/DevToolsHost.cpp b/third_party/WebKit/Source/core/inspector/DevToolsHost.cpp index 437b3c82..9854ebc 100644 --- a/third_party/WebKit/Source/core/inspector/DevToolsHost.cpp +++ b/third_party/WebKit/Source/core/inspector/DevToolsHost.cpp
@@ -50,6 +50,7 @@ #include "platform/ContextMenu.h" #include "platform/ContextMenuItem.h" #include "platform/HostWindow.h" +#include "platform/ScriptForbiddenScope.h" #include "platform/SharedBuffer.h" #include "platform/UserGestureIndicator.h" #include "platform/network/ResourceError.h" @@ -137,6 +138,8 @@ void DevToolsHost::evaluateScript(const String& expression) { + if (ScriptForbiddenScope::isScriptForbidden()) + return; if (!m_frontendFrame) return; ScriptState* scriptState = ScriptState::forMainWorld(m_frontendFrame);
diff --git a/third_party/WebKit/Source/core/inspector/InspectorAnimationAgent.cpp b/third_party/WebKit/Source/core/inspector/InspectorAnimationAgent.cpp index fa9d46a8..4d83ce1 100644 --- a/third_party/WebKit/Source/core/inspector/InspectorAnimationAgent.cpp +++ b/third_party/WebKit/Source/core/inspector/InspectorAnimationAgent.cpp
@@ -20,11 +20,11 @@ #include "core/css/resolver/StyleResolver.h" #include "core/dom/DOMNodeIds.h" #include "core/dom/NodeComputedStyle.h" -#include "core/inspector/InjectedScriptManager.h" #include "core/inspector/InspectedFrames.h" #include "core/inspector/InspectorCSSAgent.h" #include "core/inspector/InspectorDOMAgent.h" #include "core/inspector/InspectorStyleSheet.h" +#include "core/inspector/v8/InjectedScriptManager.h" #include "platform/Decimal.h" #include "platform/animation/TimingFunction.h" #include "wtf/text/Base64.h"
diff --git a/third_party/WebKit/Source/core/inspector/InspectorConsoleAgent.cpp b/third_party/WebKit/Source/core/inspector/InspectorConsoleAgent.cpp index 9c0216c3..8f5cf96 100644 --- a/third_party/WebKit/Source/core/inspector/InspectorConsoleAgent.cpp +++ b/third_party/WebKit/Source/core/inspector/InspectorConsoleAgent.cpp
@@ -29,11 +29,11 @@ #include "core/inspector/ConsoleMessage.h" #include "core/inspector/ConsoleMessageStorage.h" #include "core/inspector/IdentifiersFactory.h" -#include "core/inspector/InjectedScript.h" -#include "core/inspector/InjectedScriptManager.h" #include "core/inspector/InstrumentingAgents.h" #include "core/inspector/ScriptArguments.h" #include "core/inspector/ScriptAsyncCallStack.h" +#include "core/inspector/v8/InjectedScript.h" +#include "core/inspector/v8/InjectedScriptManager.h" #include "core/inspector/v8/V8Debugger.h" #include "core/inspector/v8/V8DebuggerAgent.h" #include "wtf/text/WTFString.h"
diff --git a/third_party/WebKit/Source/core/inspector/InspectorDOMAgent.cpp b/third_party/WebKit/Source/core/inspector/InspectorDOMAgent.cpp index 2503d49..29c56344 100644 --- a/third_party/WebKit/Source/core/inspector/InspectorDOMAgent.cpp +++ b/third_party/WebKit/Source/core/inspector/InspectorDOMAgent.cpp
@@ -65,13 +65,13 @@ #include "core/inspector/DOMEditor.h" #include "core/inspector/DOMPatchSupport.h" #include "core/inspector/IdentifiersFactory.h" -#include "core/inspector/InjectedScriptHost.h" -#include "core/inspector/InjectedScriptManager.h" #include "core/inspector/InspectedFrames.h" #include "core/inspector/InspectorHighlight.h" #include "core/inspector/InspectorHistory.h" #include "core/inspector/InstrumentingAgents.h" #include "core/inspector/RemoteObjectId.h" +#include "core/inspector/v8/InjectedScriptHost.h" +#include "core/inspector/v8/InjectedScriptManager.h" #include "core/layout/HitTestResult.h" #include "core/layout/LayoutView.h" #include "core/loader/DocumentLoader.h"
diff --git a/third_party/WebKit/Source/core/inspector/InspectorDOMAgent.h b/third_party/WebKit/Source/core/inspector/InspectorDOMAgent.h index 99c8426..a63a2b1a 100644 --- a/third_party/WebKit/Source/core/inspector/InspectorDOMAgent.h +++ b/third_party/WebKit/Source/core/inspector/InspectorDOMAgent.h
@@ -33,10 +33,10 @@ #include "core/CoreExport.h" #include "core/InspectorFrontend.h" #include "core/events/EventListenerMap.h" -#include "core/inspector/InjectedScript.h" -#include "core/inspector/InjectedScriptManager.h" #include "core/inspector/InspectorBaseAgent.h" #include "core/inspector/InspectorHighlight.h" +#include "core/inspector/v8/InjectedScript.h" +#include "core/inspector/v8/InjectedScriptManager.h" #include "core/style/ComputedStyleConstants.h" #include "platform/JSONValues.h" #include "platform/geometry/FloatQuad.h"
diff --git a/third_party/WebKit/Source/core/inspector/InspectorDOMDebuggerAgent.cpp b/third_party/WebKit/Source/core/inspector/InspectorDOMDebuggerAgent.cpp index 7826bcb..32552e9 100644 --- a/third_party/WebKit/Source/core/inspector/InspectorDOMDebuggerAgent.cpp +++ b/third_party/WebKit/Source/core/inspector/InspectorDOMDebuggerAgent.cpp
@@ -38,13 +38,13 @@ #include "core/events/Event.h" #include "core/events/EventTarget.h" #include "core/frame/LocalDOMWindow.h" -#include "core/inspector/InjectedScript.h" -#include "core/inspector/InjectedScriptHost.h" -#include "core/inspector/InjectedScriptManager.h" #include "core/inspector/InspectorDOMAgent.h" #include "core/inspector/InstrumentingAgents.h" #include "core/inspector/RemoteObjectId.h" #include "core/inspector/v8/EventListenerInfo.h" +#include "core/inspector/v8/InjectedScript.h" +#include "core/inspector/v8/InjectedScriptHost.h" +#include "core/inspector/v8/InjectedScriptManager.h" #include "core/inspector/v8/V8DebuggerAgent.h" #include "platform/JSONValues.h"
diff --git a/third_party/WebKit/Source/core/inspector/InspectorHeapProfilerAgent.cpp b/third_party/WebKit/Source/core/inspector/InspectorHeapProfilerAgent.cpp index 3cd1834b..1a42f302 100644 --- a/third_party/WebKit/Source/core/inspector/InspectorHeapProfilerAgent.cpp +++ b/third_party/WebKit/Source/core/inspector/InspectorHeapProfilerAgent.cpp
@@ -33,9 +33,9 @@ #include "bindings/core/v8/V8Binding.h" #include "core/dom/Document.h" #include "core/frame/LocalDOMWindow.h" -#include "core/inspector/InjectedScript.h" -#include "core/inspector/InjectedScriptHost.h" #include "core/inspector/RemoteObjectId.h" +#include "core/inspector/v8/InjectedScript.h" +#include "core/inspector/v8/InjectedScriptHost.h" #include "platform/Timer.h" #include "wtf/CurrentTime.h" #include <v8-profiler.h>
diff --git a/third_party/WebKit/Source/core/inspector/InspectorInspectorAgent.cpp b/third_party/WebKit/Source/core/inspector/InspectorInspectorAgent.cpp index f63dbc5..7df7a5b 100644 --- a/third_party/WebKit/Source/core/inspector/InspectorInspectorAgent.cpp +++ b/third_party/WebKit/Source/core/inspector/InspectorInspectorAgent.cpp
@@ -35,8 +35,8 @@ #include "core/InspectorFrontend.h" #include "core/dom/Document.h" #include "core/frame/LocalFrame.h" -#include "core/inspector/InjectedScriptHost.h" -#include "core/inspector/InjectedScriptManager.h" +#include "core/inspector/v8/InjectedScriptHost.h" +#include "core/inspector/v8/InjectedScriptManager.h" #include "core/loader/DocumentLoader.h" #include "core/page/Page.h" #include "platform/weborigin/SecurityOrigin.h"
diff --git a/third_party/WebKit/Source/core/inspector/InspectorRuntimeAgent.cpp b/third_party/WebKit/Source/core/inspector/InspectorRuntimeAgent.cpp index bf799a0..f873b4a 100644 --- a/third_party/WebKit/Source/core/inspector/InspectorRuntimeAgent.cpp +++ b/third_party/WebKit/Source/core/inspector/InspectorRuntimeAgent.cpp
@@ -31,10 +31,10 @@ #include "core/inspector/InspectorRuntimeAgent.h" #include "bindings/core/v8/ScriptState.h" -#include "core/inspector/InjectedScript.h" -#include "core/inspector/InjectedScriptManager.h" #include "core/inspector/MuteConsoleScope.h" #include "core/inspector/RemoteObjectId.h" +#include "core/inspector/v8/InjectedScript.h" +#include "core/inspector/v8/InjectedScriptManager.h" #include "core/inspector/v8/V8Debugger.h" #include "core/inspector/v8/V8RuntimeAgent.h" #include "platform/JSONValues.h"
diff --git a/third_party/WebKit/Source/core/inspector/PageDebuggerAgent.cpp b/third_party/WebKit/Source/core/inspector/PageDebuggerAgent.cpp index d2b52e9..5341370 100644 --- a/third_party/WebKit/Source/core/inspector/PageDebuggerAgent.cpp +++ b/third_party/WebKit/Source/core/inspector/PageDebuggerAgent.cpp
@@ -36,12 +36,12 @@ #include "core/frame/FrameConsole.h" #include "core/frame/LocalFrame.h" #include "core/inspector/AsyncCallTracker.h" -#include "core/inspector/InjectedScript.h" #include "core/inspector/InspectedFrames.h" #include "core/inspector/InspectorInstrumentation.h" #include "core/inspector/InspectorTraceEvents.h" #include "core/inspector/InstrumentingAgents.h" #include "core/inspector/MainThreadDebugger.h" +#include "core/inspector/v8/InjectedScript.h" #include "core/loader/DocumentLoader.h" #include "core/page/Page.h"
diff --git a/third_party/WebKit/Source/core/inspector/PageRuntimeAgent.cpp b/third_party/WebKit/Source/core/inspector/PageRuntimeAgent.cpp index a224985..c904f33 100644 --- a/third_party/WebKit/Source/core/inspector/PageRuntimeAgent.cpp +++ b/third_party/WebKit/Source/core/inspector/PageRuntimeAgent.cpp
@@ -36,10 +36,10 @@ #include "core/frame/FrameConsole.h" #include "core/frame/LocalFrame.h" #include "core/inspector/IdentifiersFactory.h" -#include "core/inspector/InjectedScript.h" -#include "core/inspector/InjectedScriptManager.h" #include "core/inspector/InspectedFrames.h" #include "core/inspector/InstrumentingAgents.h" +#include "core/inspector/v8/InjectedScript.h" +#include "core/inspector/v8/InjectedScriptManager.h" #include "core/page/Page.h" #include "platform/weborigin/SecurityOrigin.h"
diff --git a/third_party/WebKit/Source/core/inspector/ThreadDebugger.cpp b/third_party/WebKit/Source/core/inspector/ThreadDebugger.cpp index f47c068..cb0d5f91 100644 --- a/third_party/WebKit/Source/core/inspector/ThreadDebugger.cpp +++ b/third_party/WebKit/Source/core/inspector/ThreadDebugger.cpp
@@ -7,9 +7,6 @@ #include "bindings/core/v8/V8Binding.h" #include "bindings/core/v8/V8ScriptRunner.h" #include "core/inspector/InspectorDOMDebuggerAgent.h" -#include "public/platform/Platform.h" -#include "public/platform/WebData.h" - namespace blink { @@ -23,26 +20,24 @@ { } -v8::Local<v8::Object> ThreadDebugger::compileDebuggerScript() -{ - const WebData& debuggerScriptSourceResource = Platform::current()->loadResource("DebuggerScriptSource.js"); - v8::Local<v8::String> source = v8String(m_isolate, String(debuggerScriptSourceResource.data(), debuggerScriptSourceResource.size())); - v8::Local<v8::Value> value; - if (!V8ScriptRunner::compileAndRunInternalScript(source, m_isolate).ToLocal(&value)) - return v8::Local<v8::Object>(); - ASSERT(value->IsObject()); - return value.As<v8::Object>(); -} - void ThreadDebugger::eventListeners(v8::Local<v8::Value> value, EventListenerInfoMap& result) { InspectorDOMDebuggerAgent::eventListenersInfoForTarget(m_isolate, value, result); } +v8::MaybeLocal<v8::Value> ThreadDebugger::compileAndRunInternalScript(const String& script) +{ + return V8ScriptRunner::compileAndRunInternalScript(v8String(m_isolate, script), m_isolate); +} + v8::MaybeLocal<v8::Value> ThreadDebugger::callFunction(v8::Local<v8::Function> function, v8::Local<v8::Context> context, v8::Local<v8::Value> receiver, int argc, v8::Local<v8::Value> info[]) { - ScriptState* scriptState = ScriptState::from(context); - return V8ScriptRunner::callFunction(function, scriptState->executionContext(), receiver, argc, info, m_isolate); + return V8ScriptRunner::callFunction(function, toExecutionContext(context), receiver, argc, info, m_isolate); +} + +v8::MaybeLocal<v8::Value> ThreadDebugger::callInternalFunction(v8::Local<v8::Function> function, v8::Local<v8::Value> receiver, int argc, v8::Local<v8::Value> info[]) +{ + return V8ScriptRunner::callInternalFunction(function, receiver, argc, info, m_isolate); } } // namespace blink
diff --git a/third_party/WebKit/Source/core/inspector/ThreadDebugger.h b/third_party/WebKit/Source/core/inspector/ThreadDebugger.h index e6b79ab..7338a77 100644 --- a/third_party/WebKit/Source/core/inspector/ThreadDebugger.h +++ b/third_party/WebKit/Source/core/inspector/ThreadDebugger.h
@@ -23,9 +23,10 @@ ~ThreadDebugger() override; // V8DebuggerClient implementation. - v8::Local<v8::Object> compileDebuggerScript() override; void eventListeners(v8::Local<v8::Value>, EventListenerInfoMap&) override; + v8::MaybeLocal<v8::Value> compileAndRunInternalScript(const String& script) override; v8::MaybeLocal<v8::Value> callFunction(v8::Local<v8::Function>, v8::Local<v8::Context>, v8::Local<v8::Value> receiver, int argc, v8::Local<v8::Value> info[]) override; + v8::MaybeLocal<v8::Value> callInternalFunction(v8::Local<v8::Function>, v8::Local<v8::Value> receiver, int argc, v8::Local<v8::Value> info[]) override; V8Debugger* debugger() const { return m_debugger.get(); }
diff --git a/third_party/WebKit/Source/core/inspector/WorkerDebuggerAgent.cpp b/third_party/WebKit/Source/core/inspector/WorkerDebuggerAgent.cpp index 7af3311..bad187e1 100644 --- a/third_party/WebKit/Source/core/inspector/WorkerDebuggerAgent.cpp +++ b/third_party/WebKit/Source/core/inspector/WorkerDebuggerAgent.cpp
@@ -30,8 +30,8 @@ #include "core/inspector/WorkerDebuggerAgent.h" -#include "core/inspector/InjectedScript.h" #include "core/inspector/WorkerThreadDebugger.h" +#include "core/inspector/v8/InjectedScript.h" #include "core/inspector/v8/V8Debugger.h" #include "core/workers/WorkerGlobalScope.h"
diff --git a/third_party/WebKit/Source/core/inspector/WorkerInspectorController.cpp b/third_party/WebKit/Source/core/inspector/WorkerInspectorController.cpp index 86d6ce31..e6aef81 100644 --- a/third_party/WebKit/Source/core/inspector/WorkerInspectorController.cpp +++ b/third_party/WebKit/Source/core/inspector/WorkerInspectorController.cpp
@@ -32,8 +32,6 @@ #include "core/InspectorBackendDispatcher.h" #include "core/InspectorFrontend.h" -#include "core/inspector/InjectedScriptHost.h" -#include "core/inspector/InjectedScriptManager.h" #include "core/inspector/InspectorConsoleAgent.h" #include "core/inspector/InspectorFrontendChannel.h" #include "core/inspector/InspectorHeapProfilerAgent.h" @@ -46,6 +44,8 @@ #include "core/inspector/WorkerDebuggerAgent.h" #include "core/inspector/WorkerRuntimeAgent.h" #include "core/inspector/WorkerThreadDebugger.h" +#include "core/inspector/v8/InjectedScriptHost.h" +#include "core/inspector/v8/InjectedScriptManager.h" #include "core/workers/WorkerGlobalScope.h" #include "core/workers/WorkerReportingProxy.h" #include "core/workers/WorkerThread.h"
diff --git a/third_party/WebKit/Source/core/inspector/WorkerRuntimeAgent.cpp b/third_party/WebKit/Source/core/inspector/WorkerRuntimeAgent.cpp index dd6505f6..7a5d1d35 100644 --- a/third_party/WebKit/Source/core/inspector/WorkerRuntimeAgent.cpp +++ b/third_party/WebKit/Source/core/inspector/WorkerRuntimeAgent.cpp
@@ -31,7 +31,7 @@ #include "core/inspector/WorkerRuntimeAgent.h" #include "bindings/core/v8/ScriptState.h" -#include "core/inspector/InjectedScript.h" +#include "core/inspector/v8/InjectedScript.h" #include "core/workers/WorkerGlobalScope.h" namespace blink {
diff --git a/third_party/WebKit/Source/core/inspector/v8/DEPS b/third_party/WebKit/Source/core/inspector/v8/DEPS index 2f7250d..250c0e4 100644 --- a/third_party/WebKit/Source/core/inspector/v8/DEPS +++ b/third_party/WebKit/Source/core/inspector/v8/DEPS
@@ -9,6 +9,7 @@ "+bindings/core/v8/V8Binding.h", "+bindings/core/v8/V8DOMException.h", "+bindings/core/v8/V8DOMTokenList.h", + "+bindings/core/v8/V8GlobalValueMap.h", "+bindings/core/v8/V8HiddenValue.h", "+bindings/core/v8/V8HTMLAllCollection.h", "+bindings/core/v8/V8HTMLCollection.h",
diff --git a/third_party/WebKit/Source/core/inspector/DebuggerScript.js b/third_party/WebKit/Source/core/inspector/v8/DebuggerScript.js similarity index 100% rename from third_party/WebKit/Source/core/inspector/DebuggerScript.js rename to third_party/WebKit/Source/core/inspector/v8/DebuggerScript.js
diff --git a/third_party/WebKit/Source/core/inspector/InjectedScript.cpp b/third_party/WebKit/Source/core/inspector/v8/InjectedScript.cpp similarity index 89% rename from third_party/WebKit/Source/core/inspector/InjectedScript.cpp rename to third_party/WebKit/Source/core/inspector/v8/InjectedScript.cpp index 44960558..a8a45621 100644 --- a/third_party/WebKit/Source/core/inspector/InjectedScript.cpp +++ b/third_party/WebKit/Source/core/inspector/v8/InjectedScript.cpp
@@ -28,17 +28,17 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include "core/inspector/InjectedScript.h" +#include "core/inspector/v8/InjectedScript.h" -#include "bindings/core/v8/ScriptFunctionCall.h" #include "bindings/core/v8/V8Binding.h" -#include "core/inspector/InjectedScriptHost.h" -#include "core/inspector/InjectedScriptManager.h" #include "core/inspector/InspectorTraceEvents.h" #include "core/inspector/JSONParser.h" #include "core/inspector/RemoteObjectId.h" +#include "core/inspector/v8/InjectedScriptHost.h" +#include "core/inspector/v8/InjectedScriptManager.h" #include "core/inspector/v8/V8Debugger.h" #include "core/inspector/v8/V8DebuggerClient.h" +#include "core/inspector/v8/V8FunctionCall.h" #include "platform/JSONValues.h" #include "platform/JSONValuesForV8.h" #include "wtf/text/WTFString.h" @@ -132,7 +132,7 @@ void InjectedScript::evaluate(ErrorString* errorString, const String& expression, const String& objectGroup, bool includeCommandLineAPI, bool returnByValue, bool generatePreview, RefPtr<TypeBuilder::Runtime::RemoteObject>* result, TypeBuilder::OptOutput<bool>* wasThrown, RefPtr<TypeBuilder::Debugger::ExceptionDetails>* exceptionDetails) { v8::HandleScope handles(m_isolate); - ScriptFunctionCall function(m_client, context(), v8Value(), "evaluate"); + V8FunctionCall function(m_client, context(), v8Value(), "evaluate"); function.appendArgument(expression); function.appendArgument(objectGroup); function.appendArgument(includeCommandLineAPI); @@ -144,7 +144,7 @@ void InjectedScript::callFunctionOn(ErrorString* errorString, const String& objectId, const String& expression, const String& arguments, bool returnByValue, bool generatePreview, RefPtr<TypeBuilder::Runtime::RemoteObject>* result, TypeBuilder::OptOutput<bool>* wasThrown) { v8::HandleScope handles(m_isolate); - ScriptFunctionCall function(m_client, context(), v8Value(), "callFunctionOn"); + V8FunctionCall function(m_client, context(), v8Value(), "callFunctionOn"); function.appendArgument(objectId); function.appendArgument(expression); function.appendArgument(arguments); @@ -156,7 +156,7 @@ void InjectedScript::evaluateOnCallFrame(ErrorString* errorString, v8::Local<v8::Object> callFrames, bool isAsyncCallStack, const String& callFrameId, const String& expression, const String& objectGroup, bool includeCommandLineAPI, bool returnByValue, bool generatePreview, RefPtr<RemoteObject>* result, TypeBuilder::OptOutput<bool>* wasThrown, RefPtr<TypeBuilder::Debugger::ExceptionDetails>* exceptionDetails) { v8::HandleScope handles(m_isolate); - ScriptFunctionCall function(m_client, context(), v8Value(), "evaluateOnCallFrame"); + V8FunctionCall function(m_client, context(), v8Value(), "evaluateOnCallFrame"); function.appendArgument(callFrames); function.appendArgument(isAsyncCallStack); function.appendArgument(callFrameId); @@ -171,7 +171,7 @@ void InjectedScript::restartFrame(ErrorString* errorString, v8::Local<v8::Object> callFrames, const String& callFrameId) { v8::HandleScope handles(m_isolate); - ScriptFunctionCall function(m_client, context(), v8Value(), "restartFrame"); + V8FunctionCall function(m_client, context(), v8Value(), "restartFrame"); function.appendArgument(callFrames); function.appendArgument(callFrameId); RefPtr<JSONValue> resultValue; @@ -191,7 +191,7 @@ void InjectedScript::getStepInPositions(ErrorString* errorString, v8::Local<v8::Object> callFrames, const String& callFrameId, RefPtr<Array<TypeBuilder::Debugger::Location>>& positions) { v8::HandleScope handles(m_isolate); - ScriptFunctionCall function(m_client, context(), v8Value(), "getStepInPositions"); + V8FunctionCall function(m_client, context(), v8Value(), "getStepInPositions"); function.appendArgument(callFrames); function.appendArgument(callFrameId); RefPtr<JSONValue> resultValue; @@ -212,7 +212,7 @@ void InjectedScript::setVariableValue(ErrorString* errorString, v8::Local<v8::Object> callFrames, const String* callFrameIdOpt, const String* functionObjectIdOpt, int scopeNumber, const String& variableName, const String& newValueStr) { v8::HandleScope handles(m_isolate); - ScriptFunctionCall function(m_client, context(), v8Value(), "setVariableValue"); + V8FunctionCall function(m_client, context(), v8Value(), "setVariableValue"); if (callFrameIdOpt) { function.appendArgument(callFrames); function.appendArgument(*callFrameIdOpt); @@ -243,7 +243,7 @@ void InjectedScript::getFunctionDetails(ErrorString* errorString, const String& functionId, RefPtr<FunctionDetails>* result) { v8::HandleScope handles(m_isolate); - ScriptFunctionCall function(m_client, context(), v8Value(), "getFunctionDetails"); + V8FunctionCall function(m_client, context(), v8Value(), "getFunctionDetails"); function.appendArgument(functionId); RefPtr<JSONValue> resultValue; makeCall(function, &resultValue); @@ -258,7 +258,7 @@ void InjectedScript::getGeneratorObjectDetails(ErrorString* errorString, const String& objectId, RefPtr<GeneratorObjectDetails>* result) { v8::HandleScope handles(m_isolate); - ScriptFunctionCall function(m_client, context(), v8Value(), "getGeneratorObjectDetails"); + V8FunctionCall function(m_client, context(), v8Value(), "getGeneratorObjectDetails"); function.appendArgument(objectId); RefPtr<JSONValue> resultValue; makeCall(function, &resultValue); @@ -270,10 +270,10 @@ *result = GeneratorObjectDetails::runtimeCast(resultValue); } -void InjectedScript::getCollectionEntries(ErrorString* errorString, const String& objectId, RefPtr<Array<CollectionEntry> >* result) +void InjectedScript::getCollectionEntries(ErrorString* errorString, const String& objectId, RefPtr<Array<CollectionEntry>>* result) { v8::HandleScope handles(m_isolate); - ScriptFunctionCall function(m_client, context(), v8Value(), "getCollectionEntries"); + V8FunctionCall function(m_client, context(), v8Value(), "getCollectionEntries"); function.appendArgument(objectId); RefPtr<JSONValue> resultValue; makeCall(function, &resultValue); @@ -288,7 +288,7 @@ void InjectedScript::getProperties(ErrorString* errorString, const String& objectId, bool ownProperties, bool accessorPropertiesOnly, bool generatePreview, RefPtr<Array<PropertyDescriptor>>* properties, RefPtr<TypeBuilder::Debugger::ExceptionDetails>* exceptionDetails) { v8::HandleScope handles(m_isolate); - ScriptFunctionCall function(m_client, context(), v8Value(), "getProperties"); + V8FunctionCall function(m_client, context(), v8Value(), "getProperties"); function.appendArgument(objectId); function.appendArgument(ownProperties); function.appendArgument(accessorPropertiesOnly); @@ -311,7 +311,7 @@ void InjectedScript::getInternalProperties(ErrorString* errorString, const String& objectId, RefPtr<Array<InternalPropertyDescriptor>>* properties, RefPtr<TypeBuilder::Debugger::ExceptionDetails>* exceptionDetails) { v8::HandleScope handles(m_isolate); - ScriptFunctionCall function(m_client, context(), v8Value(), "getInternalProperties"); + V8FunctionCall function(m_client, context(), v8Value(), "getInternalProperties"); function.appendArgument(objectId); RefPtr<JSONValue> result; @@ -322,7 +322,7 @@ *errorString = "Internal error"; return; } - RefPtr<Array<InternalPropertyDescriptor> > array = Array<InternalPropertyDescriptor>::runtimeCast(result); + RefPtr<Array<InternalPropertyDescriptor>> array = Array<InternalPropertyDescriptor>::runtimeCast(result); if (array->length() > 0) *properties = array; } @@ -344,7 +344,7 @@ PassRefPtr<Array<CallFrame>> InjectedScript::wrapCallFrames(v8::Local<v8::Object> callFrames, int asyncOrdinal) { v8::HandleScope handles(m_isolate); - ScriptFunctionCall function(m_client, context(), v8Value(), "wrapCallFrames"); + V8FunctionCall function(m_client, context(), v8Value(), "wrapCallFrames"); function.appendArgument(callFrames); function.appendArgument(asyncOrdinal); bool hadException = false; @@ -359,7 +359,7 @@ PassRefPtr<TypeBuilder::Runtime::RemoteObject> InjectedScript::wrapObject(v8::Local<v8::Value> value, const String& groupName, bool generatePreview) const { v8::HandleScope handles(m_isolate); - ScriptFunctionCall function(m_client, context(), v8Value(), "wrapObject"); + V8FunctionCall function(m_client, context(), v8Value(), "wrapObject"); function.appendArgument(value); function.appendArgument(groupName); function.appendArgument(canAccessInspectedWindow()); @@ -375,7 +375,7 @@ PassRefPtr<TypeBuilder::Runtime::RemoteObject> InjectedScript::wrapTable(v8::Local<v8::Value> table, v8::Local<v8::Value> columns) const { v8::HandleScope handles(m_isolate); - ScriptFunctionCall function(m_client, context(), v8Value(), "wrapTable"); + V8FunctionCall function(m_client, context(), v8Value(), "wrapTable"); function.appendArgument(canAccessInspectedWindow()); function.appendArgument(table); if (columns.IsEmpty()) @@ -414,7 +414,7 @@ v8::HandleScope handles(m_isolate); m_native->releaseObjectGroup(objectGroup); if (objectGroup == "console") { - ScriptFunctionCall function(m_client, context(), v8Value(), "clearLastEvaluationResult"); + V8FunctionCall function(m_client, context(), v8Value(), "clearLastEvaluationResult"); bool hadException = false; callFunctionWithEvalEnabled(function, hadException); ASSERT(!hadException); @@ -424,7 +424,7 @@ void InjectedScript::setCustomObjectFormatterEnabled(bool enabled) { v8::HandleScope handles(m_isolate); - ScriptFunctionCall function(m_client, context(), v8Value(), "setCustomObjectFormatterEnabled"); + V8FunctionCall function(m_client, context(), v8Value(), "setCustomObjectFormatterEnabled"); function.appendArgument(enabled); RefPtr<JSONValue> result; makeCall(function, &result); @@ -448,7 +448,7 @@ return m_value.Get(m_isolate); } -v8::Local<v8::Value> InjectedScript::callFunctionWithEvalEnabled(ScriptFunctionCall& function, bool& hadException) const +v8::Local<v8::Value> InjectedScript::callFunctionWithEvalEnabled(V8FunctionCall& function, bool& hadException) const { v8::Local<v8::Context> localContext = context(); v8::Context::Scope scope(localContext); @@ -463,7 +463,7 @@ return resultValue; } -void InjectedScript::makeCall(ScriptFunctionCall& function, RefPtr<JSONValue>* result) +void InjectedScript::makeCall(V8FunctionCall& function, RefPtr<JSONValue>* result) { if (!canAccessInspectedWindow()) { *result = JSONString::create("Can not access given context."); @@ -483,7 +483,7 @@ } } -void InjectedScript::makeEvalCall(ErrorString* errorString, ScriptFunctionCall& function, RefPtr<TypeBuilder::Runtime::RemoteObject>* objectResult, TypeBuilder::OptOutput<bool>* wasThrown, RefPtr<TypeBuilder::Debugger::ExceptionDetails>* exceptionDetails) +void InjectedScript::makeEvalCall(ErrorString* errorString, V8FunctionCall& function, RefPtr<TypeBuilder::Runtime::RemoteObject>* objectResult, TypeBuilder::OptOutput<bool>* wasThrown, RefPtr<TypeBuilder::Debugger::ExceptionDetails>* exceptionDetails) { RefPtr<JSONValue> result; makeCall(function, &result); @@ -516,7 +516,7 @@ *wasThrown = wasThrownVal; } -void InjectedScript::makeCallWithExceptionDetails(ScriptFunctionCall& function, RefPtr<JSONValue>* result, RefPtr<TypeBuilder::Debugger::ExceptionDetails>* exceptionDetails) +void InjectedScript::makeCallWithExceptionDetails(V8FunctionCall& function, RefPtr<JSONValue>* result, RefPtr<TypeBuilder::Debugger::ExceptionDetails>* exceptionDetails) { v8::TryCatch tryCatch(m_isolate); v8::Local<v8::Value> resultValue = function.callWithoutExceptionHandling();
diff --git a/third_party/WebKit/Source/core/inspector/InjectedScript.h b/third_party/WebKit/Source/core/inspector/v8/InjectedScript.h similarity index 89% rename from third_party/WebKit/Source/core/inspector/InjectedScript.h rename to third_party/WebKit/Source/core/inspector/v8/InjectedScript.h index 9ecdd61..b3d49af 100644 --- a/third_party/WebKit/Source/core/inspector/InjectedScript.h +++ b/third_party/WebKit/Source/core/inspector/v8/InjectedScript.h
@@ -32,8 +32,8 @@ #define InjectedScript_h #include "core/InspectorTypeBuilder.h" -#include "core/inspector/InjectedScriptManager.h" -#include "core/inspector/InjectedScriptNative.h" +#include "core/inspector/v8/InjectedScriptManager.h" +#include "core/inspector/v8/InjectedScriptNative.h" #include "wtf/Allocator.h" #include "wtf/Forward.h" #include <v8.h> @@ -43,7 +43,7 @@ class InjectedScriptManager; class JSONValue; class RemoteObjectId; -class ScriptFunctionCall; +class V8FunctionCall; class V8DebuggerClient; typedef String ErrorString; @@ -90,7 +90,7 @@ void setVariableValue(ErrorString*, v8::Local<v8::Object> callFrames, const String* callFrameIdOpt, const String* functionObjectIdOpt, int scopeNumber, const String& variableName, const String& newValueStr); void getFunctionDetails(ErrorString*, const String& functionId, RefPtr<TypeBuilder::Debugger::FunctionDetails>* result); void getGeneratorObjectDetails(ErrorString*, const String& functionId, RefPtr<TypeBuilder::Debugger::GeneratorObjectDetails>* result); - void getCollectionEntries(ErrorString*, const String& objectId, RefPtr<TypeBuilder::Array<TypeBuilder::Debugger::CollectionEntry> >* result); + void getCollectionEntries(ErrorString*, const String& objectId, RefPtr<TypeBuilder::Array<TypeBuilder::Debugger::CollectionEntry>>* result); void getProperties(ErrorString*, const String& objectId, bool ownProperties, bool accessorPropertiesOnly, bool generatePreview, RefPtr<TypeBuilder::Array<TypeBuilder::Runtime::PropertyDescriptor>>* result, RefPtr<TypeBuilder::Debugger::ExceptionDetails>*); void getInternalProperties(ErrorString*, const String& objectId, RefPtr<TypeBuilder::Array<TypeBuilder::Runtime::InternalPropertyDescriptor>>* result, RefPtr<TypeBuilder::Debugger::ExceptionDetails>*); void releaseObject(const String& objectId); @@ -117,10 +117,10 @@ bool canAccessInspectedWindow() const; v8::Local<v8::Value> v8Value() const; - v8::Local<v8::Value> callFunctionWithEvalEnabled(ScriptFunctionCall&, bool& hadException) const; - void makeCall(ScriptFunctionCall&, RefPtr<JSONValue>* result); - void makeEvalCall(ErrorString*, ScriptFunctionCall&, RefPtr<TypeBuilder::Runtime::RemoteObject>* result, TypeBuilder::OptOutput<bool>* wasThrown, RefPtr<TypeBuilder::Debugger::ExceptionDetails>* = 0); - void makeCallWithExceptionDetails(ScriptFunctionCall&, RefPtr<JSONValue>* result, RefPtr<TypeBuilder::Debugger::ExceptionDetails>*); + v8::Local<v8::Value> callFunctionWithEvalEnabled(V8FunctionCall&, bool& hadException) const; + void makeCall(V8FunctionCall&, RefPtr<JSONValue>* result); + void makeEvalCall(ErrorString*, V8FunctionCall&, RefPtr<TypeBuilder::Runtime::RemoteObject>* result, TypeBuilder::OptOutput<bool>* wasThrown, RefPtr<TypeBuilder::Debugger::ExceptionDetails>* = 0); + void makeCallWithExceptionDetails(V8FunctionCall&, RefPtr<JSONValue>* result, RefPtr<TypeBuilder::Debugger::ExceptionDetails>*); InjectedScriptManager* m_manager; v8::Isolate* m_isolate;
diff --git a/third_party/WebKit/Source/core/inspector/InjectedScriptHost.cpp b/third_party/WebKit/Source/core/inspector/v8/InjectedScriptHost.cpp similarity index 98% rename from third_party/WebKit/Source/core/inspector/InjectedScriptHost.cpp rename to third_party/WebKit/Source/core/inspector/v8/InjectedScriptHost.cpp index 59ee15f..b6ec98d 100644 --- a/third_party/WebKit/Source/core/inspector/InjectedScriptHost.cpp +++ b/third_party/WebKit/Source/core/inspector/v8/InjectedScriptHost.cpp
@@ -28,7 +28,7 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include "core/inspector/InjectedScriptHost.h" +#include "core/inspector/v8/InjectedScriptHost.h" #include "core/inspector/InspectorConsoleAgent.h" #include "core/inspector/v8/V8Debugger.h"
diff --git a/third_party/WebKit/Source/core/inspector/InjectedScriptHost.h b/third_party/WebKit/Source/core/inspector/v8/InjectedScriptHost.h similarity index 98% rename from third_party/WebKit/Source/core/inspector/InjectedScriptHost.h rename to third_party/WebKit/Source/core/inspector/v8/InjectedScriptHost.h index e3cd71a..2fb2ecf 100644 --- a/third_party/WebKit/Source/core/inspector/InjectedScriptHost.h +++ b/third_party/WebKit/Source/core/inspector/v8/InjectedScriptHost.h
@@ -32,7 +32,7 @@ #include "bindings/core/v8/ScriptState.h" #include "core/InspectorTypeBuilder.h" -#include "core/inspector/InjectedScriptHostClient.h" +#include "core/inspector/v8/InjectedScriptHostClient.h" #include "wtf/Functional.h" #include "wtf/PassOwnPtr.h" #include "wtf/RefCounted.h"
diff --git a/third_party/WebKit/Source/core/inspector/InjectedScriptHostClient.h b/third_party/WebKit/Source/core/inspector/v8/InjectedScriptHostClient.h similarity index 100% rename from third_party/WebKit/Source/core/inspector/InjectedScriptHostClient.h rename to third_party/WebKit/Source/core/inspector/v8/InjectedScriptHostClient.h
diff --git a/third_party/WebKit/Source/core/inspector/InjectedScriptManager.cpp b/third_party/WebKit/Source/core/inspector/v8/InjectedScriptManager.cpp similarity index 68% rename from third_party/WebKit/Source/core/inspector/InjectedScriptManager.cpp rename to third_party/WebKit/Source/core/inspector/v8/InjectedScriptManager.cpp index edd4f85..cb8f174 100644 --- a/third_party/WebKit/Source/core/inspector/InjectedScriptManager.cpp +++ b/third_party/WebKit/Source/core/inspector/v8/InjectedScriptManager.cpp
@@ -28,14 +28,16 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include "core/inspector/InjectedScriptManager.h" +#include "core/inspector/v8/InjectedScriptManager.h" -#include "core/inspector/InjectedScript.h" -#include "core/inspector/InjectedScriptHost.h" -#include "core/inspector/InjectedScriptNative.h" +#include "bindings/core/v8/V8Binding.h" #include "core/inspector/RemoteObjectId.h" +#include "core/inspector/v8/InjectedScript.h" +#include "core/inspector/v8/InjectedScriptHost.h" +#include "core/inspector/v8/InjectedScriptNative.h" #include "core/inspector/v8/V8Debugger.h" #include "core/inspector/v8/V8DebuggerClient.h" +#include "core/inspector/v8/V8InjectedScriptHost.h" #include "public/platform/Platform.h" #include "public/platform/WebData.h" #include "wtf/PassOwnPtr.h" @@ -119,12 +121,6 @@ } } -String InjectedScriptManager::injectedScriptSource() -{ - const WebData& injectedScriptSourceResource = Platform::current()->loadResource("InjectedScriptSource.js"); - return String(injectedScriptSourceResource.data(), injectedScriptSourceResource.size()); -} - InjectedScript* InjectedScriptManager::injectedScriptFor(v8::Local<v8::Context> context) { v8::Context::Scope scope(context); @@ -139,7 +135,11 @@ return nullptr; RefPtr<InjectedScriptNative> injectedScriptNative = adoptRef(new InjectedScriptNative(context->GetIsolate())); - v8::Local<v8::Object> object = createInjectedScript(injectedScriptSource(), context, contextId, injectedScriptNative.get()); + + const WebData& injectedScriptSourceResource = Platform::current()->loadResource("InjectedScriptSource.js"); + String injectedScriptSource(injectedScriptSourceResource.data(), injectedScriptSourceResource.size()); + + v8::Local<v8::Object> object = createInjectedScript(injectedScriptSource, context, contextId, injectedScriptNative.get()); OwnPtr<InjectedScript> result = adoptPtr(new InjectedScript(this, context, object, m_client, injectedScriptNative.release(), contextId)); InjectedScript* resultPtr = result.get(); if (m_customObjectFormatterEnabled) @@ -148,4 +148,41 @@ return resultPtr; } +v8::Local<v8::Object> InjectedScriptManager::createInjectedScript(const String& scriptSource, v8::Local<v8::Context> context, int id, InjectedScriptNative* injectedScriptNative) +{ + v8::Isolate* isolate = context->GetIsolate(); + v8::Context::Scope scope(context); + + v8::Local<v8::FunctionTemplate> wrapperTemplate = m_injectedScriptHost->wrapperTemplate(isolate); + if (wrapperTemplate.IsEmpty()) { + wrapperTemplate = V8InjectedScriptHost::createWrapperTemplate(isolate); + m_injectedScriptHost->setWrapperTemplate(wrapperTemplate, isolate); + } + + v8::Local<v8::Object> scriptHostWrapper = V8InjectedScriptHost::wrap(wrapperTemplate, context, m_injectedScriptHost); + if (scriptHostWrapper.IsEmpty()) + return v8::Local<v8::Object>(); + + injectedScriptNative->setOnInjectedScriptHost(scriptHostWrapper); + + // Inject javascript into the context. The compiled script is supposed to evaluate into + // a single anonymous function(it's anonymous to avoid cluttering the global object with + // inspector's stuff) the function is called a few lines below with InjectedScriptHost wrapper, + // injected script id and explicit reference to the inspected global object. The function is expected + // to create and configure InjectedScript instance that is going to be used by the inspector. + v8::Local<v8::Value> value; + if (!m_client->compileAndRunInternalScript(scriptSource).ToLocal(&value)) + return v8::Local<v8::Object>(); + ASSERT(value->IsFunction()); + + v8::Local<v8::Object> windowGlobal = context->Global(); + v8::Local<v8::Value> info[] = { scriptHostWrapper, windowGlobal, v8::Number::New(context->GetIsolate(), id) }; + v8::Local<v8::Value> injectedScriptValue; + if (!m_client->callInternalFunction(v8::Local<v8::Function>::Cast(value), windowGlobal, WTF_ARRAY_LENGTH(info), info).ToLocal(&injectedScriptValue)) + return v8::Local<v8::Object>(); + if (!injectedScriptValue->IsObject()) + return v8::Local<v8::Object>(); + return injectedScriptValue.As<v8::Object>(); +} + } // namespace blink
diff --git a/third_party/WebKit/Source/core/inspector/InjectedScriptManager.h b/third_party/WebKit/Source/core/inspector/v8/InjectedScriptManager.h similarity index 98% rename from third_party/WebKit/Source/core/inspector/InjectedScriptManager.h rename to third_party/WebKit/Source/core/inspector/v8/InjectedScriptManager.h index f605f4a..55d62dd 100644 --- a/third_party/WebKit/Source/core/inspector/InjectedScriptManager.h +++ b/third_party/WebKit/Source/core/inspector/v8/InjectedScriptManager.h
@@ -67,7 +67,6 @@ private: explicit InjectedScriptManager(V8DebuggerClient*); - String injectedScriptSource(); v8::Local<v8::Object> createInjectedScript(const String& source, v8::Local<v8::Context>, int id, InjectedScriptNative*); typedef HashMap<int, OwnPtr<InjectedScript>> IdToInjectedScriptMap;
diff --git a/third_party/WebKit/Source/core/inspector/InjectedScriptNative.cpp b/third_party/WebKit/Source/core/inspector/v8/InjectedScriptNative.cpp similarity index 80% rename from third_party/WebKit/Source/core/inspector/InjectedScriptNative.cpp rename to third_party/WebKit/Source/core/inspector/v8/InjectedScriptNative.cpp index a4f6c6c..f994a4b 100644 --- a/third_party/WebKit/Source/core/inspector/InjectedScriptNative.cpp +++ b/third_party/WebKit/Source/core/inspector/v8/InjectedScriptNative.cpp
@@ -2,10 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "core/inspector/InjectedScriptNative.h" +#include "core/inspector/v8/InjectedScriptNative.h" -#include "bindings/core/v8/ScriptState.h" -#include "bindings/core/v8/V8HiddenValue.h" #include "platform/JSONValues.h" #include "wtf/Vector.h" #include "wtf/text/WTFString.h" @@ -19,21 +17,26 @@ { } +static const char privateKeyName[] = "v8-inspector#injectedScript"; + InjectedScriptNative::~InjectedScriptNative() { } void InjectedScriptNative::setOnInjectedScriptHost(v8::Local<v8::Object> injectedScriptHost) { v8::HandleScope handleScope(m_isolate); v8::Local<v8::External> external = v8::External::New(m_isolate, this); - V8HiddenValue::setHiddenValue(ScriptState::current(m_isolate), injectedScriptHost, V8HiddenValue::injectedScriptNative(m_isolate), external); + v8::Local<v8::Private> privateKey = v8::Private::ForApi(m_isolate, v8::String::NewFromUtf8(m_isolate, privateKeyName)); + injectedScriptHost->SetPrivate(m_isolate->GetCurrentContext(), privateKey, external); } InjectedScriptNative* InjectedScriptNative::fromInjectedScriptHost(v8::Local<v8::Object> injectedScriptObject) { v8::Isolate* isolate = injectedScriptObject->GetIsolate(); v8::HandleScope handleScope(isolate); - v8::Local<v8::Value> value = V8HiddenValue::getHiddenValue(ScriptState::current(isolate), injectedScriptObject, V8HiddenValue::injectedScriptNative(isolate)); - ASSERT(!value.IsEmpty()); + v8::Local<v8::Context> context = isolate->GetCurrentContext(); + v8::Local<v8::Private> privateKey = v8::Private::ForApi(isolate, v8::String::NewFromUtf8(isolate, privateKeyName)); + v8::Local<v8::Value> value; + RELEASE_ASSERT(injectedScriptObject->GetPrivate(context, privateKey).ToLocal(&value)); v8::Local<v8::External> external = value.As<v8::External>(); void* ptr = external->Value(); ASSERT(ptr);
diff --git a/third_party/WebKit/Source/core/inspector/InjectedScriptNative.h b/third_party/WebKit/Source/core/inspector/v8/InjectedScriptNative.h similarity index 100% rename from third_party/WebKit/Source/core/inspector/InjectedScriptNative.h rename to third_party/WebKit/Source/core/inspector/v8/InjectedScriptNative.h
diff --git a/third_party/WebKit/Source/core/inspector/InjectedScriptSource.js b/third_party/WebKit/Source/core/inspector/v8/InjectedScriptSource.js similarity index 100% rename from third_party/WebKit/Source/core/inspector/InjectedScriptSource.js rename to third_party/WebKit/Source/core/inspector/v8/InjectedScriptSource.js
diff --git a/third_party/WebKit/Source/core/inspector/v8/SourceMap.cpp b/third_party/WebKit/Source/core/inspector/v8/SourceMap.cpp index 31845ed..46011a4 100644 --- a/third_party/WebKit/Source/core/inspector/v8/SourceMap.cpp +++ b/third_party/WebKit/Source/core/inspector/v8/SourceMap.cpp
@@ -6,6 +6,7 @@ #include "core/inspector/JSONParser.h" #include "platform/JSONValues.h" +#include "platform/weborigin/KURL.h" namespace { @@ -107,6 +108,12 @@ return a->column < b.second; } +String completeURL(const blink::KURL& base, const String& url) +{ + blink::KURL completedURL(base, url); + return completedURL.isValid() ? completedURL.string() : url; +} + } // anonymous namespace namespace blink { @@ -121,7 +128,7 @@ { } -PassOwnPtr<SourceMap> SourceMap::parse(const String& json, int offsetLine, int offsetColumn) +PassOwnPtr<SourceMap> SourceMap::parse(const String& json, const String& sourceMapUrl, int offsetLine, int offsetColumn) { RefPtr<JSONValue> sourceMapValue = parseJSON(json); RefPtr<JSONObject> sourceMapObject; @@ -138,10 +145,10 @@ return nullptr; RefPtr<JSONObject> sectionObject = sectionValue->asObject(); - if (!sectionObject || !map->parseSection(sectionObject, offsetLine, offsetColumn)) + if (!sectionObject || !map->parseSection(sectionObject, sourceMapUrl, offsetLine, offsetColumn)) return nullptr; } - } else if (!map->parseMap(sourceMapObject, offsetLine, offsetColumn)) { + } else if (!map->parseMap(sourceMapObject, sourceMapUrl, offsetLine, offsetColumn)) { return nullptr; } std::sort(map->m_mappings.begin(), map->m_mappings.end(), entryCompare); @@ -160,7 +167,7 @@ return (--it)->get(); } -bool SourceMap::parseSection(PassRefPtr<JSONObject> prpSectionObject, int offsetLine, int offsetColumn) +bool SourceMap::parseSection(PassRefPtr<JSONObject> prpSectionObject, const String& sourceMapUrl, int offsetLine, int offsetColumn) { RefPtr<JSONObject> sectionObject = prpSectionObject; RefPtr<JSONObject> offsetObject = sectionObject->getObject(kOffsetString); @@ -178,10 +185,10 @@ String url; if (!mapObject && !sectionObject->getString(kURLString, &url)) return false; - return mapObject ? parseMap(mapObject, line + offsetLine, column + offsetColumn) : true; + return mapObject ? parseMap(mapObject, sourceMapUrl, line + offsetLine, column + offsetColumn) : true; } -bool SourceMap::parseMap(PassRefPtr<JSONObject> prpMapObject, int line, int column) +bool SourceMap::parseMap(PassRefPtr<JSONObject> prpMapObject, const String& sourceMapUrl, int line, int column) { RefPtr<JSONObject> mapObject = prpMapObject; if (!mapObject) @@ -197,6 +204,9 @@ String sourceRoot; mapObject->getString(kSourceRootString, &sourceRoot); + if (!sourceRoot.isNull() && sourceRoot.length() > 0 && sourceRoot[sourceRoot.length() - 1] != '/') + sourceRoot.append('/'); + Vector<String> sources; if (!jsonStringArrayAsVector(mapObject->getArray(kSourcesString), &sources, true)) return false; @@ -204,6 +214,15 @@ if (sources.size() == 0) return false; + KURL baseURL(KURL(), sourceMapUrl); + if (!baseURL.isValid()) + baseURL = KURL(); + + // For information about resolving sources, please see: + // https://docs.google.com/document/d/1U1RGAehQwRypUTovF1KRlpiOFze0b-_2gc6fAH0KY0k/edit#heading=h.75yo6yoyk7x5 + for (size_t i = 0; i < sources.size(); ++i) + sources[i] = completeURL(baseURL, sourceRoot + sources[i]); + Vector<String> sourcesContent; if (jsonStringArrayAsVector(mapObject->getArray(kSourcesContentString), &sourcesContent, false)) { if (sourcesContent.size() != sources.size())
diff --git a/third_party/WebKit/Source/core/inspector/v8/SourceMap.h b/third_party/WebKit/Source/core/inspector/v8/SourceMap.h index e7e5ca1..007ebfa 100644 --- a/third_party/WebKit/Source/core/inspector/v8/SourceMap.h +++ b/third_party/WebKit/Source/core/inspector/v8/SourceMap.h
@@ -37,15 +37,15 @@ } }; - static PassOwnPtr<SourceMap> parse(const String& json, int offsetLine = 0, int offsetColumn = 0); + static PassOwnPtr<SourceMap> parse(const String& json, const String& sourceMapUrl, int offsetLine = 0, int offsetColumn = 0); const Entry* findEntry(int line, int column); private: SourceMap() { } - bool parseSection(PassRefPtr<JSONObject> sectionObject, int offsetLine, int offsetColumn); - bool parseMap(PassRefPtr<JSONObject> mapObject, int offsetLine, int offsetColumn); + bool parseSection(PassRefPtr<JSONObject> sectionObject, const String& sourceMapUrl, int offsetLine, int offsetColumn); + bool parseMap(PassRefPtr<JSONObject> mapObject, const String& sourceMapUrl, int offsetLine, int offsetColumn); Vector<OwnPtr<Entry>> m_mappings; };
diff --git a/third_party/WebKit/Source/core/inspector/v8/SourceMapTest.cpp b/third_party/WebKit/Source/core/inspector/v8/SourceMapTest.cpp index 41e7c7c..732c954 100644 --- a/third_party/WebKit/Source/core/inspector/v8/SourceMapTest.cpp +++ b/third_party/WebKit/Source/core/inspector/v8/SourceMapTest.cpp
@@ -21,7 +21,7 @@ "{\"version\": 3, \"sources\": [\"1.js\"], \"sourcesContent\": [null], \"names\": [], \"mappings\":\";\"}" }; for (size_t i = 0; i < sizeof(sources) / sizeof(const char*); ++i) { - OwnPtr<SourceMap> sourceMap = SourceMap::parse(sources[i]); + OwnPtr<SourceMap> sourceMap = SourceMap::parse(sources[i], String()); EXPECT_FALSE(!sourceMap) << sources[i]; } OwnPtr<SourceMap> sourceMap = SourceMap::parse( @@ -32,7 +32,7 @@ "CAAC;SACX;;;;;;;;;CAEJ;;AAED,IAAI,QAAQ,GAAG,SAAS,EAAE,CAAC;AAC3B,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI," "CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;AAC/C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,EAAE," "CAAC;AAC5B,SAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC;CAAA\",\"file\":\"fib-compiled.js\"," - "\"sourcesContent\":[null]}"); + "\"sourcesContent\":[null]}", String()); EXPECT_FALSE(!sourceMap); } @@ -47,7 +47,7 @@ "{\"version\": 3, \"sources\": [], \"sourcesContent\": [null], \"names\": [], \"mappings\":\";\"}" }; for (size_t i = 0; i < sizeof(sources) / sizeof(const char*); ++i) { - OwnPtr<SourceMap> sourceMap = SourceMap::parse(String::fromUTF8(sources[i])); + OwnPtr<SourceMap> sourceMap = SourceMap::parse(String::fromUTF8(sources[i]), String()); EXPECT_TRUE(!sourceMap) << sources[i]; } } @@ -62,69 +62,69 @@ "SACX;;;;;;;;;CAEJ;;AAED,IAAI,QAAQ,GAAG,SAAS,EAAE,CAAC;AAC3B,IAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC," "MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;AAC/C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,EAAE,CAAC;" "AAC5B,SAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC;CAAA\",\"file\":\"fib-compiled.js\"," - "\"sourcesContent\":[null]}"); + "\"sourcesContent\":[null],\"sourceRoot\":\"/boo\"}", String("http://localhost/source.map")); ASSERT_TRUE(!!sourceMap); OwnPtr<SourceMap::Entry> expectedEntries[] = { - adoptPtr(new SourceMap::Entry(2, 15, "fib.js", 2, 10)), adoptPtr(new SourceMap::Entry(2, 24, "fib.js", 2, 19)), - adoptPtr(new SourceMap::Entry(4, 0, "fib.js", 0, 0)), adoptPtr(new SourceMap::Entry(4, 7, "fib.js", 0, 7)), - adoptPtr(new SourceMap::Entry(4, 8, "fib.js", 0, 8)), adoptPtr(new SourceMap::Entry(4, 11, "fib.js", 0, 11)), - adoptPtr(new SourceMap::Entry(4, 12, "fib.js", 0, 12)), adoptPtr(new SourceMap::Entry(4, 21, "fib.js", 0, 21)), - adoptPtr(new SourceMap::Entry(4, 22, "fib.js", 0, 22)), adoptPtr(new SourceMap::Entry(4, 23, "fib.js", 0, 23)), - adoptPtr(new SourceMap::Entry(6, 0, "fib.js", 2, 0)), adoptPtr(new SourceMap::Entry(6, 9, "fib.js", 2, 10)), - adoptPtr(new SourceMap::Entry(6, 18, "fib.js", 2, 19)), adoptPtr(new SourceMap::Entry(7, 6, "fib.js", 3, 6)), - adoptPtr(new SourceMap::Entry(7, 9, "fib.js", 3, 9)), adoptPtr(new SourceMap::Entry(7, 11, "fib.js", 4, 6)), - adoptPtr(new SourceMap::Entry(7, 14, "fib.js", 4, 9)), adoptPtr(new SourceMap::Entry(7, 16, "fib.js", 6, 8)), - adoptPtr(new SourceMap::Entry(7, 23, "fib.js", 6, 15)), adoptPtr(new SourceMap::Entry(7, 25, "fib.js", 9, 8)), - adoptPtr(new SourceMap::Entry(7, 30, "fib.js", 9, 13)), adoptPtr(new SourceMap::Entry(11, 0, "fib.js", 3, 6)), - adoptPtr(new SourceMap::Entry(11, 11, "fib.js", 3, 9)), adoptPtr(new SourceMap::Entry(11, 14, "fib.js", 3, 12)), - adoptPtr(new SourceMap::Entry(11, 15, "fib.js", 3, 13)), adoptPtr(new SourceMap::Entry(12, 0, "fib.js", 4, 6)), - adoptPtr(new SourceMap::Entry(12, 11, "fib.js", 4, 9)), adoptPtr(new SourceMap::Entry(12, 14, "fib.js", 4, 12)), - adoptPtr(new SourceMap::Entry(12, 15, "fib.js", 4, 13)), adoptPtr(new SourceMap::Entry(15, 13, "fib.js", 5, 9)), - adoptPtr(new SourceMap::Entry(15, 17, "fib.js", 5, 13)), adoptPtr(new SourceMap::Entry(20, 0, "fib.js", 6, 8)), - adoptPtr(new SourceMap::Entry(20, 15, "fib.js", 6, 15)), adoptPtr(new SourceMap::Entry(20, 18, "fib.js", 6, 18)), - adoptPtr(new SourceMap::Entry(20, 21, "fib.js", 6, 21)), adoptPtr(new SourceMap::Entry(22, 0, "fib.js", 7, 4)), - adoptPtr(new SourceMap::Entry(22, 11, "fib.js", 7, 7)), adoptPtr(new SourceMap::Entry(22, 14, "fib.js", 7, 10)), - adoptPtr(new SourceMap::Entry(22, 17, "fib.js", 7, 13)), adoptPtr(new SourceMap::Entry(23, 0, "fib.js", 8, 4)), - adoptPtr(new SourceMap::Entry(23, 11, "fib.js", 8, 7)), adoptPtr(new SourceMap::Entry(23, 14, "fib.js", 8, 10)), - adoptPtr(new SourceMap::Entry(23, 17, "fib.js", 8, 13)), adoptPtr(new SourceMap::Entry(23, 20, "fib.js", 8, 16)), - adoptPtr(new SourceMap::Entry(23, 27, "fib.js", 8, 23)), adoptPtr(new SourceMap::Entry(23, 28, "fib.js", 8, 24)), - adoptPtr(new SourceMap::Entry(25, 15, "fib.js", 9, 22)), adoptPtr(new SourceMap::Entry(25, 22, "fib.js", 9, 29)), - adoptPtr(new SourceMap::Entry(28, 0, "fib.js", 9, 8)), adoptPtr(new SourceMap::Entry(28, 13, "fib.js", 9, 13)), - adoptPtr(new SourceMap::Entry(30, 0, "fib.js", 10, 4)), adoptPtr(new SourceMap::Entry(30, 12, "fib.js", 10, 8)), - adoptPtr(new SourceMap::Entry(30, 17, "fib.js", 10, 13)), adoptPtr(new SourceMap::Entry(30, 19, "fib.js", 10, 14)), - adoptPtr(new SourceMap::Entry(31, 0, "fib.js", 11, 8)), adoptPtr(new SourceMap::Entry(31, 13, "fib.js", 11, 11)), - adoptPtr(new SourceMap::Entry(31, 16, "fib.js", 11, 14)), adoptPtr(new SourceMap::Entry(31, 17, "fib.js", 11, 15)), - adoptPtr(new SourceMap::Entry(32, 0, "fib.js", 12, 8)), adoptPtr(new SourceMap::Entry(32, 13, "fib.js", 12, 11)), - adoptPtr(new SourceMap::Entry(32, 16, "fib.js", 12, 14)), adoptPtr(new SourceMap::Entry(32, 17, "fib.js", 12, 15)), - adoptPtr(new SourceMap::Entry(32, 18, "fib.js", 12, 16)), adoptPtr(new SourceMap::Entry(33, 9, "fib.js", 13, 5)), - adoptPtr(new SourceMap::Entry(42, 1, "fib.js", 15, 1)), adoptPtr(new SourceMap::Entry(44, 0, "fib.js", 17, 0)), - adoptPtr(new SourceMap::Entry(44, 4, "fib.js", 17, 4)), adoptPtr(new SourceMap::Entry(44, 12, "fib.js", 17, 12)), - adoptPtr(new SourceMap::Entry(44, 15, "fib.js", 17, 15)), adoptPtr(new SourceMap::Entry(44, 24, "fib.js", 17, 24)), - adoptPtr(new SourceMap::Entry(44, 26, "fib.js", 17, 26)), adoptPtr(new SourceMap::Entry(45, 0, "fib.js", 18, 0)), - adoptPtr(new SourceMap::Entry(45, 4, "fib.js", 18, 4)), adoptPtr(new SourceMap::Entry(45, 9, "fib.js", 18, 9)), - adoptPtr(new SourceMap::Entry(45, 12, "fib.js", 18, 12)), adoptPtr(new SourceMap::Entry(45, 16, "fib.js", 18, 16)), - adoptPtr(new SourceMap::Entry(45, 17, "fib.js", 18, 17)), adoptPtr(new SourceMap::Entry(45, 22, "fib.js", 18, 22)), - adoptPtr(new SourceMap::Entry(45, 23, "fib.js", 18, 23)), adoptPtr(new SourceMap::Entry(45, 27, "fib.js", 18, 27)), - adoptPtr(new SourceMap::Entry(45, 28, "fib.js", 18, 28)), adoptPtr(new SourceMap::Entry(45, 34, "fib.js", 18, 34)), - adoptPtr(new SourceMap::Entry(45, 36, "fib.js", 18, 36)), adoptPtr(new SourceMap::Entry(45, 39, "fib.js", 18, 39)), - adoptPtr(new SourceMap::Entry(45, 41, "fib.js", 18, 41)), adoptPtr(new SourceMap::Entry(45, 42, "fib.js", 18, 42)), - adoptPtr(new SourceMap::Entry(45, 45, "fib.js", 18, 45)), adoptPtr(new SourceMap::Entry(45, 46, "fib.js", 18, 46)), - adoptPtr(new SourceMap::Entry(46, 0, "fib.js", 19, 0)), adoptPtr(new SourceMap::Entry(46, 5, "fib.js", 19, 5)), - adoptPtr(new SourceMap::Entry(46, 9, "fib.js", 19, 9)), adoptPtr(new SourceMap::Entry(46, 10, "fib.js", 19, 10)), - adoptPtr(new SourceMap::Entry(46, 13, "fib.js", 19, 13)), adoptPtr(new SourceMap::Entry(46, 14, "fib.js", 19, 14)), - adoptPtr(new SourceMap::Entry(46, 16, "fib.js", 19, 16)), adoptPtr(new SourceMap::Entry(46, 17, "fib.js", 19, 17)), - adoptPtr(new SourceMap::Entry(46, 20, "fib.js", 19, 20)), adoptPtr(new SourceMap::Entry(46, 25, "fib.js", 19, 25)), - adoptPtr(new SourceMap::Entry(46, 27, "fib.js", 19, 27)), adoptPtr(new SourceMap::Entry(46, 29, "fib.js", 19, 29)), - adoptPtr(new SourceMap::Entry(46, 30, "fib.js", 19, 30)), adoptPtr(new SourceMap::Entry(47, 0, "fib.js", 20, 2)), - adoptPtr(new SourceMap::Entry(47, 9, "fib.js", 20, 9)), adoptPtr(new SourceMap::Entry(47, 10, "fib.js", 20, 10)), - adoptPtr(new SourceMap::Entry(47, 13, "fib.js", 20, 13)), adoptPtr(new SourceMap::Entry(47, 14, "fib.js", 20, 14)), - adoptPtr(new SourceMap::Entry(47, 22, "fib.js", 20, 22)), adoptPtr(new SourceMap::Entry(47, 23, "fib.js", 20, 23)), - adoptPtr(new SourceMap::Entry(47, 27, "fib.js", 20, 27)), adoptPtr(new SourceMap::Entry(47, 29, "fib.js", 20, 29)), - adoptPtr(new SourceMap::Entry(47, 30, "fib.js", 20, 30)), adoptPtr(new SourceMap::Entry(47, 35, "fib.js", 20, 35)), - adoptPtr(new SourceMap::Entry(47, 36, "fib.js", 20, 36)), adoptPtr(new SourceMap::Entry(47, 37, "fib.js", 20, 37)), - adoptPtr(new SourceMap::Entry(48, 1, "fib.js", 20, 37)) + adoptPtr(new SourceMap::Entry(2, 15, "http://localhost/boo/fib.js", 2, 10)), adoptPtr(new SourceMap::Entry(2, 24, "http://localhost/boo/fib.js", 2, 19)), + adoptPtr(new SourceMap::Entry(4, 0, "http://localhost/boo/fib.js", 0, 0)), adoptPtr(new SourceMap::Entry(4, 7, "http://localhost/boo/fib.js", 0, 7)), + adoptPtr(new SourceMap::Entry(4, 8, "http://localhost/boo/fib.js", 0, 8)), adoptPtr(new SourceMap::Entry(4, 11, "http://localhost/boo/fib.js", 0, 11)), + adoptPtr(new SourceMap::Entry(4, 12, "http://localhost/boo/fib.js", 0, 12)), adoptPtr(new SourceMap::Entry(4, 21, "http://localhost/boo/fib.js", 0, 21)), + adoptPtr(new SourceMap::Entry(4, 22, "http://localhost/boo/fib.js", 0, 22)), adoptPtr(new SourceMap::Entry(4, 23, "http://localhost/boo/fib.js", 0, 23)), + adoptPtr(new SourceMap::Entry(6, 0, "http://localhost/boo/fib.js", 2, 0)), adoptPtr(new SourceMap::Entry(6, 9, "http://localhost/boo/fib.js", 2, 10)), + adoptPtr(new SourceMap::Entry(6, 18, "http://localhost/boo/fib.js", 2, 19)), adoptPtr(new SourceMap::Entry(7, 6, "http://localhost/boo/fib.js", 3, 6)), + adoptPtr(new SourceMap::Entry(7, 9, "http://localhost/boo/fib.js", 3, 9)), adoptPtr(new SourceMap::Entry(7, 11, "http://localhost/boo/fib.js", 4, 6)), + adoptPtr(new SourceMap::Entry(7, 14, "http://localhost/boo/fib.js", 4, 9)), adoptPtr(new SourceMap::Entry(7, 16, "http://localhost/boo/fib.js", 6, 8)), + adoptPtr(new SourceMap::Entry(7, 23, "http://localhost/boo/fib.js", 6, 15)), adoptPtr(new SourceMap::Entry(7, 25, "http://localhost/boo/fib.js", 9, 8)), + adoptPtr(new SourceMap::Entry(7, 30, "http://localhost/boo/fib.js", 9, 13)), adoptPtr(new SourceMap::Entry(11, 0, "http://localhost/boo/fib.js", 3, 6)), + adoptPtr(new SourceMap::Entry(11, 11, "http://localhost/boo/fib.js", 3, 9)), adoptPtr(new SourceMap::Entry(11, 14, "http://localhost/boo/fib.js", 3, 12)), + adoptPtr(new SourceMap::Entry(11, 15, "http://localhost/boo/fib.js", 3, 13)), adoptPtr(new SourceMap::Entry(12, 0, "http://localhost/boo/fib.js", 4, 6)), + adoptPtr(new SourceMap::Entry(12, 11, "http://localhost/boo/fib.js", 4, 9)), adoptPtr(new SourceMap::Entry(12, 14, "http://localhost/boo/fib.js", 4, 12)), + adoptPtr(new SourceMap::Entry(12, 15, "http://localhost/boo/fib.js", 4, 13)), adoptPtr(new SourceMap::Entry(15, 13, "http://localhost/boo/fib.js", 5, 9)), + adoptPtr(new SourceMap::Entry(15, 17, "http://localhost/boo/fib.js", 5, 13)), adoptPtr(new SourceMap::Entry(20, 0, "http://localhost/boo/fib.js", 6, 8)), + adoptPtr(new SourceMap::Entry(20, 15, "http://localhost/boo/fib.js", 6, 15)), adoptPtr(new SourceMap::Entry(20, 18, "http://localhost/boo/fib.js", 6, 18)), + adoptPtr(new SourceMap::Entry(20, 21, "http://localhost/boo/fib.js", 6, 21)), adoptPtr(new SourceMap::Entry(22, 0, "http://localhost/boo/fib.js", 7, 4)), + adoptPtr(new SourceMap::Entry(22, 11, "http://localhost/boo/fib.js", 7, 7)), adoptPtr(new SourceMap::Entry(22, 14, "http://localhost/boo/fib.js", 7, 10)), + adoptPtr(new SourceMap::Entry(22, 17, "http://localhost/boo/fib.js", 7, 13)), adoptPtr(new SourceMap::Entry(23, 0, "http://localhost/boo/fib.js", 8, 4)), + adoptPtr(new SourceMap::Entry(23, 11, "http://localhost/boo/fib.js", 8, 7)), adoptPtr(new SourceMap::Entry(23, 14, "http://localhost/boo/fib.js", 8, 10)), + adoptPtr(new SourceMap::Entry(23, 17, "http://localhost/boo/fib.js", 8, 13)), adoptPtr(new SourceMap::Entry(23, 20, "http://localhost/boo/fib.js", 8, 16)), + adoptPtr(new SourceMap::Entry(23, 27, "http://localhost/boo/fib.js", 8, 23)), adoptPtr(new SourceMap::Entry(23, 28, "http://localhost/boo/fib.js", 8, 24)), + adoptPtr(new SourceMap::Entry(25, 15, "http://localhost/boo/fib.js", 9, 22)), adoptPtr(new SourceMap::Entry(25, 22, "http://localhost/boo/fib.js", 9, 29)), + adoptPtr(new SourceMap::Entry(28, 0, "http://localhost/boo/fib.js", 9, 8)), adoptPtr(new SourceMap::Entry(28, 13, "http://localhost/boo/fib.js", 9, 13)), + adoptPtr(new SourceMap::Entry(30, 0, "http://localhost/boo/fib.js", 10, 4)), adoptPtr(new SourceMap::Entry(30, 12, "http://localhost/boo/fib.js", 10, 8)), + adoptPtr(new SourceMap::Entry(30, 17, "http://localhost/boo/fib.js", 10, 13)), adoptPtr(new SourceMap::Entry(30, 19, "http://localhost/boo/fib.js", 10, 14)), + adoptPtr(new SourceMap::Entry(31, 0, "http://localhost/boo/fib.js", 11, 8)), adoptPtr(new SourceMap::Entry(31, 13, "http://localhost/boo/fib.js", 11, 11)), + adoptPtr(new SourceMap::Entry(31, 16, "http://localhost/boo/fib.js", 11, 14)), adoptPtr(new SourceMap::Entry(31, 17, "http://localhost/boo/fib.js", 11, 15)), + adoptPtr(new SourceMap::Entry(32, 0, "http://localhost/boo/fib.js", 12, 8)), adoptPtr(new SourceMap::Entry(32, 13, "http://localhost/boo/fib.js", 12, 11)), + adoptPtr(new SourceMap::Entry(32, 16, "http://localhost/boo/fib.js", 12, 14)), adoptPtr(new SourceMap::Entry(32, 17, "http://localhost/boo/fib.js", 12, 15)), + adoptPtr(new SourceMap::Entry(32, 18, "http://localhost/boo/fib.js", 12, 16)), adoptPtr(new SourceMap::Entry(33, 9, "http://localhost/boo/fib.js", 13, 5)), + adoptPtr(new SourceMap::Entry(42, 1, "http://localhost/boo/fib.js", 15, 1)), adoptPtr(new SourceMap::Entry(44, 0, "http://localhost/boo/fib.js", 17, 0)), + adoptPtr(new SourceMap::Entry(44, 4, "http://localhost/boo/fib.js", 17, 4)), adoptPtr(new SourceMap::Entry(44, 12, "http://localhost/boo/fib.js", 17, 12)), + adoptPtr(new SourceMap::Entry(44, 15, "http://localhost/boo/fib.js", 17, 15)), adoptPtr(new SourceMap::Entry(44, 24, "http://localhost/boo/fib.js", 17, 24)), + adoptPtr(new SourceMap::Entry(44, 26, "http://localhost/boo/fib.js", 17, 26)), adoptPtr(new SourceMap::Entry(45, 0, "http://localhost/boo/fib.js", 18, 0)), + adoptPtr(new SourceMap::Entry(45, 4, "http://localhost/boo/fib.js", 18, 4)), adoptPtr(new SourceMap::Entry(45, 9, "http://localhost/boo/fib.js", 18, 9)), + adoptPtr(new SourceMap::Entry(45, 12, "http://localhost/boo/fib.js", 18, 12)), adoptPtr(new SourceMap::Entry(45, 16, "http://localhost/boo/fib.js", 18, 16)), + adoptPtr(new SourceMap::Entry(45, 17, "http://localhost/boo/fib.js", 18, 17)), adoptPtr(new SourceMap::Entry(45, 22, "http://localhost/boo/fib.js", 18, 22)), + adoptPtr(new SourceMap::Entry(45, 23, "http://localhost/boo/fib.js", 18, 23)), adoptPtr(new SourceMap::Entry(45, 27, "http://localhost/boo/fib.js", 18, 27)), + adoptPtr(new SourceMap::Entry(45, 28, "http://localhost/boo/fib.js", 18, 28)), adoptPtr(new SourceMap::Entry(45, 34, "http://localhost/boo/fib.js", 18, 34)), + adoptPtr(new SourceMap::Entry(45, 36, "http://localhost/boo/fib.js", 18, 36)), adoptPtr(new SourceMap::Entry(45, 39, "http://localhost/boo/fib.js", 18, 39)), + adoptPtr(new SourceMap::Entry(45, 41, "http://localhost/boo/fib.js", 18, 41)), adoptPtr(new SourceMap::Entry(45, 42, "http://localhost/boo/fib.js", 18, 42)), + adoptPtr(new SourceMap::Entry(45, 45, "http://localhost/boo/fib.js", 18, 45)), adoptPtr(new SourceMap::Entry(45, 46, "http://localhost/boo/fib.js", 18, 46)), + adoptPtr(new SourceMap::Entry(46, 0, "http://localhost/boo/fib.js", 19, 0)), adoptPtr(new SourceMap::Entry(46, 5, "http://localhost/boo/fib.js", 19, 5)), + adoptPtr(new SourceMap::Entry(46, 9, "http://localhost/boo/fib.js", 19, 9)), adoptPtr(new SourceMap::Entry(46, 10, "http://localhost/boo/fib.js", 19, 10)), + adoptPtr(new SourceMap::Entry(46, 13, "http://localhost/boo/fib.js", 19, 13)), adoptPtr(new SourceMap::Entry(46, 14, "http://localhost/boo/fib.js", 19, 14)), + adoptPtr(new SourceMap::Entry(46, 16, "http://localhost/boo/fib.js", 19, 16)), adoptPtr(new SourceMap::Entry(46, 17, "http://localhost/boo/fib.js", 19, 17)), + adoptPtr(new SourceMap::Entry(46, 20, "http://localhost/boo/fib.js", 19, 20)), adoptPtr(new SourceMap::Entry(46, 25, "http://localhost/boo/fib.js", 19, 25)), + adoptPtr(new SourceMap::Entry(46, 27, "http://localhost/boo/fib.js", 19, 27)), adoptPtr(new SourceMap::Entry(46, 29, "http://localhost/boo/fib.js", 19, 29)), + adoptPtr(new SourceMap::Entry(46, 30, "http://localhost/boo/fib.js", 19, 30)), adoptPtr(new SourceMap::Entry(47, 0, "http://localhost/boo/fib.js", 20, 2)), + adoptPtr(new SourceMap::Entry(47, 9, "http://localhost/boo/fib.js", 20, 9)), adoptPtr(new SourceMap::Entry(47, 10, "http://localhost/boo/fib.js", 20, 10)), + adoptPtr(new SourceMap::Entry(47, 13, "http://localhost/boo/fib.js", 20, 13)), adoptPtr(new SourceMap::Entry(47, 14, "http://localhost/boo/fib.js", 20, 14)), + adoptPtr(new SourceMap::Entry(47, 22, "http://localhost/boo/fib.js", 20, 22)), adoptPtr(new SourceMap::Entry(47, 23, "http://localhost/boo/fib.js", 20, 23)), + adoptPtr(new SourceMap::Entry(47, 27, "http://localhost/boo/fib.js", 20, 27)), adoptPtr(new SourceMap::Entry(47, 29, "http://localhost/boo/fib.js", 20, 29)), + adoptPtr(new SourceMap::Entry(47, 30, "http://localhost/boo/fib.js", 20, 30)), adoptPtr(new SourceMap::Entry(47, 35, "http://localhost/boo/fib.js", 20, 35)), + adoptPtr(new SourceMap::Entry(47, 36, "http://localhost/boo/fib.js", 20, 36)), adoptPtr(new SourceMap::Entry(47, 37, "http://localhost/boo/fib.js", 20, 37)), + adoptPtr(new SourceMap::Entry(48, 1, "http://localhost/boo/fib.js", 20, 37)) }; const int expectedEntriesCount = sizeof(expectedEntries) / sizeof(OwnPtr<SourceMap::Entry>); @@ -154,7 +154,7 @@ " \"version\" : 3, \"file\": \"section.js\", \"sources\": [\"foo.js\", \"bar.js\"]," " \"names\" : [\"src\", \"maps\", \"are\", \"fun\"], \"mappings\": \"AAAA,E;;ABCDE;\"" " }}]}"; - OwnPtr<SourceMap> sourceMap = SourceMap::parse(String::fromUTF8(source)); + OwnPtr<SourceMap> sourceMap = SourceMap::parse(String::fromUTF8(source), String()); ASSERT_FALSE(!sourceMap) << source; } @@ -166,7 +166,7 @@ " \"version\" : 3, \"file\": \"section.js\", \"sources\": [\"foo.js\", \"bar.js\"]," " \"names\" : [\"src\", \"maps\", \"are\", \"fun\"], \"mappings\": \";;eAEU,SAAS\"" " }}]}"; - OwnPtr<SourceMap> sourceMap = SourceMap::parse(String::fromUTF8(source)); + OwnPtr<SourceMap> sourceMap = SourceMap::parse(String::fromUTF8(source), String()); ASSERT_FALSE(!sourceMap) << source; const SourceMap::Entry* entry = sourceMap->findEntry(102, 24);
diff --git a/third_party/WebKit/Source/core/inspector/v8/V8DebuggerAgentImpl.cpp b/third_party/WebKit/Source/core/inspector/v8/V8DebuggerAgentImpl.cpp index 1e550dc..8d464e4 100644 --- a/third_party/WebKit/Source/core/inspector/v8/V8DebuggerAgentImpl.cpp +++ b/third_party/WebKit/Source/core/inspector/v8/V8DebuggerAgentImpl.cpp
@@ -13,8 +13,6 @@ #include "core/dom/Microtask.h" #include "core/inspector/AsyncCallChain.h" #include "core/inspector/ContentSearchUtils.h" -#include "core/inspector/InjectedScript.h" -#include "core/inspector/InjectedScriptManager.h" #include "core/inspector/InstrumentingAgents.h" #include "core/inspector/JSONParser.h" #include "core/inspector/RemoteObjectId.h" @@ -22,6 +20,8 @@ #include "core/inspector/ScriptCallFrame.h" #include "core/inspector/ScriptCallStack.h" #include "core/inspector/v8/IgnoreExceptionsScope.h" +#include "core/inspector/v8/InjectedScript.h" +#include "core/inspector/v8/InjectedScriptManager.h" #include "core/inspector/v8/JavaScriptCallFrame.h" #include "core/inspector/v8/V8AsyncCallTracker.h" #include "core/inspector/v8/V8Debugger.h" @@ -133,7 +133,7 @@ RefPtr<SharedBuffer> data = PassRefPtr<SharedBuffer>(Platform::current()->parseDataURL(sourceMapURL, mimetype, charset)); if (!data) return nullptr; - return SourceMap::parse(String(data->data(), data->size())); + return SourceMap::parse(String(data->data(), data->size()), String()); } PassOwnPtr<V8DebuggerAgent> V8DebuggerAgent::create(InjectedScriptManager* injectedScriptManager, V8Debugger* debugger, int contextGroupId)
diff --git a/third_party/WebKit/Source/core/inspector/v8/V8DebuggerClient.h b/third_party/WebKit/Source/core/inspector/v8/V8DebuggerClient.h index 5d79c94..9b5ad436c 100644 --- a/third_party/WebKit/Source/core/inspector/v8/V8DebuggerClient.h +++ b/third_party/WebKit/Source/core/inspector/v8/V8DebuggerClient.h
@@ -16,12 +16,15 @@ USING_FAST_MALLOC(V8DebuggerClient); public: virtual ~V8DebuggerClient() { } - virtual v8::Local<v8::Object> compileDebuggerScript() = 0; virtual void runMessageLoopOnPause(int contextGroupId) = 0; virtual void quitMessageLoopOnPause() = 0; virtual void eventListeners(v8::Local<v8::Value>, EventListenerInfoMap&) = 0; virtual bool callingContextCanAccessContext(v8::Local<v8::Context> calling, v8::Local<v8::Context> target) = 0; + + virtual v8::MaybeLocal<v8::Value> compileAndRunInternalScript(const String& script) = 0; virtual v8::MaybeLocal<v8::Value> callFunction(v8::Local<v8::Function>, v8::Local<v8::Context>, v8::Local<v8::Value> receiver, int argc, v8::Local<v8::Value> info[]) = 0; + virtual v8::MaybeLocal<v8::Value> callInternalFunction(v8::Local<v8::Function>, v8::Local<v8::Value> receiver, int argc, v8::Local<v8::Value> info[]) = 0; + }; } // namespace blink
diff --git a/third_party/WebKit/Source/core/inspector/v8/V8DebuggerImpl.cpp b/third_party/WebKit/Source/core/inspector/v8/V8DebuggerImpl.cpp index d5ea6313..1f43a282 100644 --- a/third_party/WebKit/Source/core/inspector/v8/V8DebuggerImpl.cpp +++ b/third_party/WebKit/Source/core/inspector/v8/V8DebuggerImpl.cpp
@@ -38,6 +38,8 @@ #include "core/inspector/v8/V8DebuggerClient.h" #include "core/inspector/v8/V8JavaScriptCallFrame.h" #include "platform/JSONValues.h" +#include "public/platform/Platform.h" +#include "public/platform/WebData.h" #include "wtf/Atomics.h" #include "wtf/Vector.h" #include "wtf/text/CString.h" @@ -710,10 +712,13 @@ v8::HandleScope scope(m_isolate); v8::Context::Scope contextScope(debuggerContext()); - v8::Local<v8::Object> value = m_client->compileDebuggerScript(); - if (value.IsEmpty()) + const WebData& debuggerScriptSourceResource = Platform::current()->loadResource("DebuggerScriptSource.js"); + String source(debuggerScriptSourceResource.data(), debuggerScriptSourceResource.size()); + v8::Local<v8::Value> value; + if (!m_client->compileAndRunInternalScript(source).ToLocal(&value)) return; - m_debuggerScript.Reset(m_isolate, value); + ASSERT(value->IsObject()); + m_debuggerScript.Reset(m_isolate, value.As<v8::Object>()); } v8::Local<v8::Context> V8DebuggerImpl::debuggerContext() const
diff --git a/third_party/WebKit/Source/bindings/core/v8/ScriptFunctionCall.cpp b/third_party/WebKit/Source/core/inspector/v8/V8FunctionCall.cpp similarity index 83% rename from third_party/WebKit/Source/bindings/core/v8/ScriptFunctionCall.cpp rename to third_party/WebKit/Source/core/inspector/v8/V8FunctionCall.cpp index 845ec1a..1f168d9b 100644 --- a/third_party/WebKit/Source/bindings/core/v8/ScriptFunctionCall.cpp +++ b/third_party/WebKit/Source/core/inspector/v8/V8FunctionCall.cpp
@@ -28,7 +28,7 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include "bindings/core/v8/ScriptFunctionCall.h" +#include "core/inspector/v8/V8FunctionCall.h" #include "core/inspector/v8/V8DebuggerClient.h" #include "wtf/PassOwnPtr.h" @@ -45,7 +45,7 @@ return result; } -ScriptFunctionCall::ScriptFunctionCall(V8DebuggerClient* client, v8::Local<v8::Context> context, v8::Local<v8::Value> value, const String& name) +V8FunctionCall::V8FunctionCall(V8DebuggerClient* client, v8::Local<v8::Context> context, v8::Local<v8::Value> value, const String& name) : m_client(client) , m_context(context) , m_name(v8String(context->GetIsolate(), name)) @@ -53,32 +53,32 @@ { } -void ScriptFunctionCall::appendArgument(v8::Local<v8::Value> value) +void V8FunctionCall::appendArgument(v8::Local<v8::Value> value) { m_arguments.append(value); } -void ScriptFunctionCall::appendArgument(const String& argument) +void V8FunctionCall::appendArgument(const String& argument) { m_arguments.append(v8String(m_context->GetIsolate(), argument)); } -void ScriptFunctionCall::appendArgument(int argument) +void V8FunctionCall::appendArgument(int argument) { m_arguments.append(v8::Number::New(m_context->GetIsolate(), argument)); } -void ScriptFunctionCall::appendArgument(bool argument) +void V8FunctionCall::appendArgument(bool argument) { m_arguments.append(argument ? v8::True(m_context->GetIsolate()) : v8::False(m_context->GetIsolate())); } -void ScriptFunctionCall::appendUndefinedArgument() +void V8FunctionCall::appendUndefinedArgument() { m_arguments.append(v8::Undefined(m_context->GetIsolate())); } -v8::Local<v8::Value> ScriptFunctionCall::call(bool& hadException, bool reportExceptions) +v8::Local<v8::Value> V8FunctionCall::call(bool& hadException, bool reportExceptions) { v8::TryCatch tryCatch(m_context->GetIsolate()); tryCatch.SetVerbose(reportExceptions); @@ -88,13 +88,13 @@ return result; } -v8::Local<v8::Value> ScriptFunctionCall::call() +v8::Local<v8::Value> V8FunctionCall::call() { bool hadException = false; return call(hadException); } -v8::Local<v8::Value> ScriptFunctionCall::callWithoutExceptionHandling() +v8::Local<v8::Value> V8FunctionCall::callWithoutExceptionHandling() { v8::Local<v8::Object> thisObject = v8::Local<v8::Object>::Cast(m_value); v8::Local<v8::Value> value; @@ -116,7 +116,7 @@ return result; } -v8::Local<v8::Function> ScriptFunctionCall::function() +v8::Local<v8::Function> V8FunctionCall::function() { v8::TryCatch tryCatch(m_context->GetIsolate()); v8::Local<v8::Object> thisObject = v8::Local<v8::Object>::Cast(m_value);
diff --git a/third_party/WebKit/Source/bindings/core/v8/ScriptFunctionCall.h b/third_party/WebKit/Source/core/inspector/v8/V8FunctionCall.h similarity index 91% rename from third_party/WebKit/Source/bindings/core/v8/ScriptFunctionCall.h rename to third_party/WebKit/Source/core/inspector/v8/V8FunctionCall.h index 5fed2b078..8a47f0e 100644 --- a/third_party/WebKit/Source/bindings/core/v8/ScriptFunctionCall.h +++ b/third_party/WebKit/Source/core/inspector/v8/V8FunctionCall.h
@@ -28,8 +28,8 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#ifndef ScriptFunctionCall_h -#define ScriptFunctionCall_h +#ifndef V8FunctionCall_h +#define V8FunctionCall_h #include "wtf/Vector.h" #include "wtf/text/WTFString.h" @@ -39,10 +39,10 @@ class V8DebuggerClient; -class ScriptFunctionCall { +class V8FunctionCall { STACK_ALLOCATED(); public: - ScriptFunctionCall(V8DebuggerClient*, v8::Local<v8::Context>, v8::Local<v8::Value>, const String& name); + V8FunctionCall(V8DebuggerClient*, v8::Local<v8::Context>, v8::Local<v8::Value>, const String& name); void appendArgument(v8::Local<v8::Value>); void appendArgument(const String&); @@ -66,4 +66,4 @@ } // namespace blink -#endif // ScriptFunctionCall +#endif // V8FunctionCall
diff --git a/third_party/WebKit/Source/core/inspector/v8/V8InjectedScriptHost.cpp b/third_party/WebKit/Source/core/inspector/v8/V8InjectedScriptHost.cpp index cd91aa4..7a52c3f82 100644 --- a/third_party/WebKit/Source/core/inspector/v8/V8InjectedScriptHost.cpp +++ b/third_party/WebKit/Source/core/inspector/v8/V8InjectedScriptHost.cpp
@@ -14,9 +14,9 @@ #include "bindings/core/v8/V8Node.h" #include "bindings/core/v8/V8NodeList.h" #include "bindings/core/v8/V8ScriptRunner.h" -#include "core/inspector/InjectedScript.h" -#include "core/inspector/InjectedScriptHost.h" #include "core/inspector/v8/EventListenerInfo.h" +#include "core/inspector/v8/InjectedScript.h" +#include "core/inspector/v8/InjectedScriptHost.h" #include "core/inspector/v8/InspectorWrapper.h" #include "core/inspector/v8/JavaScriptCallFrame.h" #include "core/inspector/v8/V8DebuggerClient.h"
diff --git a/third_party/WebKit/Source/core/inspector/v8/V8RuntimeAgentImpl.cpp b/third_party/WebKit/Source/core/inspector/v8/V8RuntimeAgentImpl.cpp index 2f94c35..c8557cb 100644 --- a/third_party/WebKit/Source/core/inspector/v8/V8RuntimeAgentImpl.cpp +++ b/third_party/WebKit/Source/core/inspector/v8/V8RuntimeAgentImpl.cpp
@@ -30,10 +30,10 @@ #include "core/inspector/v8/V8RuntimeAgentImpl.h" -#include "core/inspector/InjectedScript.h" -#include "core/inspector/InjectedScriptManager.h" #include "core/inspector/RemoteObjectId.h" #include "core/inspector/v8/IgnoreExceptionsScope.h" +#include "core/inspector/v8/InjectedScript.h" +#include "core/inspector/v8/InjectedScriptManager.h" #include "core/inspector/v8/V8Debugger.h" #include "core/inspector/v8/V8DebuggerImpl.h" #include "platform/JSONValues.h"
diff --git a/third_party/WebKit/Source/core/layout/HitTestResult.cpp b/third_party/WebKit/Source/core/layout/HitTestResult.cpp index c71c372..7a4c2bc 100644 --- a/third_party/WebKit/Source/core/layout/HitTestResult.cpp +++ b/third_party/WebKit/Source/core/layout/HitTestResult.cpp
@@ -42,6 +42,7 @@ #include "core/layout/LayoutTextFragment.h" #include "core/page/FrameTree.h" #include "core/svg/SVGElement.h" +#include "platform/geometry/Region.h" #include "platform/scroll/Scrollbar.h" namespace blink { @@ -430,23 +431,38 @@ return m_innerNode->hasEditableStyle(); } -bool HitTestResult::addNodeToListBasedTestResult(Node* node, const HitTestLocation& locationInContainer, const LayoutRect& rect) +ListBasedHitTestBehavior HitTestResult::addNodeToListBasedTestResult(Node* node, const HitTestLocation& location, const LayoutRect& rect) { - // If not a list-based test, this function should be a no-op. + // If not a list-based test, stop testing because the hit has been found. if (!hitTestRequest().listBased()) - return false; + return StopHitTesting; - // If node is null, return true so the hit test can continue. if (!node) - return true; + return ContinueHitTesting; mutableListBasedTestResult().add(node); if (hitTestRequest().penetratingList()) - return true; + return ContinueHitTesting; - bool regionFilled = rect.contains(LayoutRect(locationInContainer.boundingBox())); - return !regionFilled; + return rect.contains(LayoutRect(location.boundingBox())) ? StopHitTesting : ContinueHitTesting; +} + +ListBasedHitTestBehavior HitTestResult::addNodeToListBasedTestResult(Node* node, const HitTestLocation& location, const Region& region) +{ + // If not a list-based test, stop testing because the hit has been found. + if (!hitTestRequest().listBased()) + return StopHitTesting; + + if (!node) + return ContinueHitTesting; + + mutableListBasedTestResult().add(node); + + if (hitTestRequest().penetratingList()) + return ContinueHitTesting; + + return region.contains(location.boundingBox()) ? StopHitTesting : ContinueHitTesting; } void HitTestResult::append(const HitTestResult& other)
diff --git a/third_party/WebKit/Source/core/layout/HitTestResult.h b/third_party/WebKit/Source/core/layout/HitTestResult.h index 156f2fd..ebae7fde 100644 --- a/third_party/WebKit/Source/core/layout/HitTestResult.h +++ b/third_party/WebKit/Source/core/layout/HitTestResult.h
@@ -28,7 +28,6 @@ #include "core/layout/HitTestRequest.h" #include "platform/geometry/FloatQuad.h" #include "platform/geometry/FloatRect.h" -#include "platform/geometry/LayoutRect.h" #include "platform/heap/Handle.h" #include "platform/text/TextDirection.h" #include "wtf/Forward.h" @@ -47,11 +46,19 @@ class KURL; class Node; class LayoutObject; +class Region; class Scrollbar; +// List-based hit test testing can continue even after a hit has been found. +// This is used to support fuzzy matching with rect-based hit tests as well as +// penetrating tests which collect all nodes (see: HitTestRequest::RequestType). +enum ListBasedHitTestBehavior { + ContinueHitTesting, + StopHitTesting +}; + class CORE_EXPORT HitTestResult { DISALLOW_NEW_EXCEPT_PLACEMENT_NEW(); - public: typedef WillBeHeapListHashSet<RefPtrWillBeMember<Node>> NodeSet; @@ -137,8 +144,13 @@ bool isCacheable() const { return m_cacheable; } void setCacheable(bool cacheable) { m_cacheable = cacheable; } - // Return true if the test is a list-based test and we should continue testing. - bool addNodeToListBasedTestResult(Node*, const HitTestLocation& pointInContainer, const LayoutRect& = LayoutRect()); + // TODO(pdr): When using the default rect argument, this function does not + // check if the tapped area is entirely contained by the HitTestLocation's + // bounding box. Callers should pass a LayoutRect as the third parameter so + // hit testing can early-out when a tapped area is covered. + ListBasedHitTestBehavior addNodeToListBasedTestResult(Node*, const HitTestLocation&, const LayoutRect& = LayoutRect()); + ListBasedHitTestBehavior addNodeToListBasedTestResult(Node*, const HitTestLocation&, const Region&); + void append(const HitTestResult&); // If m_listBasedTestResult is 0 then set it to a new NodeSet. Return *m_listBasedTestResult. Lazy allocation makes
diff --git a/third_party/WebKit/Source/core/layout/LayoutBlock.cpp b/third_party/WebKit/Source/core/layout/LayoutBlock.cpp index 8e907b7..376b79f 100644 --- a/third_party/WebKit/Source/core/layout/LayoutBlock.cpp +++ b/third_party/WebKit/Source/core/layout/LayoutBlock.cpp
@@ -1617,7 +1617,7 @@ && isPointInOverflowControl(result, locationInContainer.point(), adjustedLocation)) { updateHitTestResult(result, locationInContainer.point() - localOffset); // FIXME: isPointInOverflowControl() doesn't handle rect-based tests yet. - if (!result.addNodeToListBasedTestResult(nodeForHitTest(), locationInContainer)) + if (result.addNodeToListBasedTestResult(nodeForHitTest(), locationInContainer) == StopHitTesting) return true; } @@ -1635,7 +1635,7 @@ LayoutRect boundsRect(adjustedLocation, size()); if (visibleToHitTestRequest(result.hitTestRequest()) && locationInContainer.intersects(boundsRect)) { updateHitTestResult(result, flipForWritingMode(locationInContainer.point() - localOffset)); - if (!result.addNodeToListBasedTestResult(nodeForHitTest(), locationInContainer, boundsRect)) + if (result.addNodeToListBasedTestResult(nodeForHitTest(), locationInContainer, boundsRect) == StopHitTesting) return true; } }
diff --git a/third_party/WebKit/Source/core/layout/LayoutBox.cpp b/third_party/WebKit/Source/core/layout/LayoutBox.cpp index fd88baa..d0c904e9 100644 --- a/third_party/WebKit/Source/core/layout/LayoutBox.cpp +++ b/third_party/WebKit/Source/core/layout/LayoutBox.cpp
@@ -1201,7 +1201,7 @@ boundsRect.moveBy(adjustedLocation); if (visibleToHitTestRequest(result.hitTestRequest()) && action == HitTestForeground && locationInContainer.intersects(boundsRect)) { updateHitTestResult(result, locationInContainer.point() - toLayoutSize(adjustedLocation)); - if (!result.addNodeToListBasedTestResult(node(), locationInContainer, boundsRect)) + if (result.addNodeToListBasedTestResult(node(), locationInContainer, boundsRect) == StopHitTesting) return true; }
diff --git a/third_party/WebKit/Source/core/layout/LayoutFlexibleBox.cpp b/third_party/WebKit/Source/core/layout/LayoutFlexibleBox.cpp index f735ab0..f589bc1 100644 --- a/third_party/WebKit/Source/core/layout/LayoutFlexibleBox.cpp +++ b/third_party/WebKit/Source/core/layout/LayoutFlexibleBox.cpp
@@ -42,6 +42,11 @@ namespace blink { +static bool hasAspectRatio(const LayoutBox& child) +{ + return child.isImage() || child.isCanvas() || child.isVideo(); +} + struct LayoutFlexibleBox::LineContext { LineContext(LayoutUnit crossAxisOffset, LayoutUnit crossAxisExtent, size_t numberOfChildren, LayoutUnit maxAscent) : crossAxisOffset(crossAxisOffset) @@ -452,7 +457,7 @@ // computeLogicalWidth always re-computes the intrinsic widths. However, when our logical width is auto, // we can just use our cached value. So let's do that here. (Compare code in LayoutBlock::computePreferredLogicalWidths) LayoutUnit borderAndPadding = child.borderAndPaddingLogicalWidth(); - if (child.styleRef().logicalWidth().isAuto()) { + if (child.styleRef().logicalWidth().isAuto() && !hasAspectRatio(child)) { if (size.type() == MinContent) return child.minPreferredLogicalWidth() - borderAndPadding; if (size.type() == MaxContent) @@ -625,6 +630,44 @@ return isHorizontalFlow() ? child.location() : child.location().transposedPoint(); } +bool LayoutFlexibleBox::useChildAspectRatio(const LayoutBox& child) const +{ + if (!hasAspectRatio(child)) + return false; + if (child.intrinsicSize().height() == 0) { + // We can't compute a ratio in this case. + return false; + } + Length crossSize; + if (isHorizontalFlow()) + crossSize = child.styleRef().height(); + else + crossSize = child.styleRef().width(); + return crossAxisLengthIsDefinite(child, crossSize); +} + +LayoutUnit LayoutFlexibleBox::computeMainSizeFromAspectRatioUsing(const LayoutBox& child, Length crossSizeLength) const +{ + ASSERT(hasAspectRatio(child)); + ASSERT(child.intrinsicSize().height() != 0); + + LayoutUnit crossSize; + if (crossSizeLength.isFixed()) { + crossSize = crossSizeLength.value(); + } else { + ASSERT(crossSizeLength.hasPercent()); + crossSize = hasOrthogonalFlow(child) ? + adjustBorderBoxLogicalWidthForBoxSizing(valueForLength(crossSizeLength, contentWidth())) : + child.computePercentageLogicalHeight(crossSizeLength); + } + + const LayoutSize& childIntrinsicSize = child.intrinsicSize(); + double ratio = childIntrinsicSize.width().toFloat() / childIntrinsicSize.height().toFloat(); + if (isHorizontalFlow()) + return crossSize * ratio; + return crossSize / ratio; +} + void LayoutFlexibleBox::setFlowAwareLocationForChild(LayoutBox& child, const LayoutPoint& location) { if (isHorizontalFlow()) @@ -650,6 +693,20 @@ return true; } +bool LayoutFlexibleBox::crossAxisLengthIsDefinite(const LayoutBox& child, const Length& length) const +{ + if (length.isAuto()) + return false; + if (length.hasPercent()) { + return hasOrthogonalFlow(child) ? + hasDefiniteLogicalWidth() : + child.computePercentageLogicalHeight(length) != -1; + } + // TODO(cbiesinger): Eventually we should support other types of sizes here. Requires updating + // computeMainSizeFromAspectRatioUsing. + return length.isFixed(); +} + bool LayoutFlexibleBox::childFlexBaseSizeRequiresLayout(const LayoutBox& child) const { return !mainAxisLengthIsDefinite(child, flexBasisForChild(child)) && ( @@ -919,6 +976,8 @@ // css-flexbox section 4.5 LayoutUnit contentSize = computeMainAxisExtentForChild(child, MinSize, Length(MinContent)); ASSERT(contentSize >= 0); + if (hasAspectRatio(child) && child.intrinsicSize().height() > 0) + contentSize = adjustChildSizeForAspectRatioCrossAxisMinAndMax(child, contentSize); if (maxExtent != -1 && contentSize > maxExtent) contentSize = maxExtent; @@ -929,15 +988,38 @@ LayoutUnit specifiedSize = maxExtent != -1 ? std::min(resolvedMainSize, maxExtent) : resolvedMainSize; minExtent = std::min(specifiedSize, contentSize); + } else if (useChildAspectRatio(child)) { + Length crossSizeLength = isHorizontalFlow() ? child.styleRef().height() : child.styleRef().width(); + LayoutUnit transferredSize = computeMainSizeFromAspectRatioUsing(child, crossSizeLength); + transferredSize = adjustChildSizeForAspectRatioCrossAxisMinAndMax(child, transferredSize); + minExtent = std::min(transferredSize, contentSize); } else { minExtent = contentSize; } - // TODO(cbiesinger): Implement aspect ratio handling (here, transferred size) - crbug.com/249112 } ASSERT(minExtent >= 0); return std::max(childSize, minExtent); } +LayoutUnit LayoutFlexibleBox::adjustChildSizeForAspectRatioCrossAxisMinAndMax(const LayoutBox& child, LayoutUnit childSize) +{ + Length crossMin = isHorizontalFlow() ? child.style()->minHeight() : child.style()->minWidth(); + Length crossMax = isHorizontalFlow() ? child.style()->maxHeight() : child.style()->maxWidth(); + + + if (crossAxisLengthIsDefinite(child, crossMax)) { + LayoutUnit maxValue = computeMainSizeFromAspectRatioUsing(child, crossMax); + childSize = std::min(maxValue, childSize); + } + + if (crossAxisLengthIsDefinite(child, crossMin)) { + LayoutUnit minValue = computeMainSizeFromAspectRatioUsing(child, crossMin); + childSize = std::max(minValue, childSize); + } + + return childSize; +} + bool LayoutFlexibleBox::computeNextFlexLine(OrderedFlexItemList& orderedChildren, LayoutUnit& sumFlexBaseSize, double& totalFlexGrow, double& totalFlexShrink, double& totalWeightedFlexShrink, LayoutUnit& sumHypotheticalMainSize, bool relayoutChildren) { orderedChildren.clear(); @@ -1177,6 +1259,7 @@ if (isHorizontalFlow() != child.styleRef().isHorizontalWritingMode()) return false; + // TODO(cbiesinger): what about indefinite percentage heights? return isHorizontalFlow() ? child.styleRef().height().isAuto() : child.styleRef().width().isAuto(); } @@ -1206,6 +1289,7 @@ return child.styleRef().overflowY(); return child.styleRef().overflowX(); } + void LayoutFlexibleBox::layoutAndPlaceChildren(LayoutUnit& crossAxisOffset, const OrderedFlexItemList& children, const Vector<LayoutUnit, 16>& childSizes, LayoutUnit availableFreeSpace, bool relayoutChildren, SubtreeLayoutScope& layoutScope, Vector<LineContext>& lineContexts) { ASSERT(childSizes.size() == children.size());
diff --git a/third_party/WebKit/Source/core/layout/LayoutFlexibleBox.h b/third_party/WebKit/Source/core/layout/LayoutFlexibleBox.h index a4948ca8..d2605bd 100644 --- a/third_party/WebKit/Source/core/layout/LayoutFlexibleBox.h +++ b/third_party/WebKit/Source/core/layout/LayoutFlexibleBox.h
@@ -127,12 +127,15 @@ LayoutUnit crossAxisScrollbarExtent() const; LayoutUnit crossAxisScrollbarExtentForChild(const LayoutBox& child) const; LayoutPoint flowAwareLocationForChild(const LayoutBox& child) const; + bool useChildAspectRatio(const LayoutBox& child) const; + LayoutUnit computeMainSizeFromAspectRatioUsing(const LayoutBox& child, Length crossSizeLength) const; void setFlowAwareLocationForChild(LayoutBox& child, const LayoutPoint&); void adjustAlignmentForChild(LayoutBox& child, LayoutUnit); ItemPosition alignmentForChild(const LayoutBox& child) const; LayoutUnit mainAxisBorderAndPaddingExtentForChild(const LayoutBox& child) const; LayoutUnit computeInnerFlexBaseSizeForChild(LayoutBox& child, ChildLayoutType = LayoutIfNeeded); bool mainAxisLengthIsDefinite(const LayoutBox& child, const Length& flexBasis) const; + bool crossAxisLengthIsDefinite(const LayoutBox& child, const Length& flexBasis) const; bool childFlexBaseSizeRequiresLayout(const LayoutBox& child) const; bool needToStretchChildLogicalHeight(const LayoutBox& child) const; bool childHasIntrinsicMainAxisSize(const LayoutBox& child) const; @@ -154,6 +157,7 @@ LayoutUnit computeChildMarginValue(Length margin); void prepareOrderIteratorAndMargins(); LayoutUnit adjustChildSizeForMinAndMax(const LayoutBox& child, LayoutUnit childSize); + LayoutUnit adjustChildSizeForAspectRatioCrossAxisMinAndMax(const LayoutBox& child, LayoutUnit childSize); // The hypothetical main size of an item is the flex base size clamped according to its min and max main size properties bool computeNextFlexLine(OrderedFlexItemList& orderedChildren, LayoutUnit& sumFlexBaseSize, double& totalFlexGrow, double& totalFlexShrink, double& totalWeightedFlexShrink, LayoutUnit& sumHypotheticalMainSize, bool relayoutChildren);
diff --git a/third_party/WebKit/Source/core/layout/LayoutInline.cpp b/third_party/WebKit/Source/core/layout/LayoutInline.cpp index 618a4ed..51843d1 100644 --- a/third_party/WebKit/Source/core/layout/LayoutInline.cpp +++ b/third_party/WebKit/Source/core/layout/LayoutInline.cpp
@@ -801,20 +801,16 @@ if (!visibleToHitTestRequest(result.hitTestRequest())) return false; - HitTestLocation tmpLocation(locationInContainer, -toLayoutSize(accumulatedOffset)); + HitTestLocation adjustedLocation(locationInContainer, -toLayoutSize(accumulatedOffset)); Region regionResult; - HitTestCulledInlinesGeneratorContext context(regionResult, tmpLocation); + HitTestCulledInlinesGeneratorContext context(regionResult, adjustedLocation); generateCulledLineBoxRects(context, this); if (context.intersected()) { - updateHitTestResult(result, tmpLocation.point()); - // We can not use addNodeToListBasedTestResult to determine if we fully enclose the hit-test area - // because it can only handle rectangular targets. - result.addNodeToListBasedTestResult(node(), locationInContainer); - // We check if using list-based hit-test to continue hit testing. - if (!result.hitTestRequest().penetratingList()) - return regionResult.contains(tmpLocation.boundingBox()); + updateHitTestResult(result, adjustedLocation.point()); + if (result.addNodeToListBasedTestResult(node(), adjustedLocation, regionResult) == StopHitTesting) + return true; } return false; }
diff --git a/third_party/WebKit/Source/core/layout/LayoutTable.cpp b/third_party/WebKit/Source/core/layout/LayoutTable.cpp index 58eaf8e9..b0a76c4 100644 --- a/third_party/WebKit/Source/core/layout/LayoutTable.cpp +++ b/third_party/WebKit/Source/core/layout/LayoutTable.cpp
@@ -1356,7 +1356,7 @@ LayoutRect boundsRect(adjustedLocation, size()); if (visibleToHitTestRequest(result.hitTestRequest()) && (action == HitTestBlockBackground || action == HitTestChildBlockBackground) && locationInContainer.intersects(boundsRect)) { updateHitTestResult(result, flipForWritingMode(locationInContainer.point() - toLayoutSize(adjustedLocation))); - if (!result.addNodeToListBasedTestResult(node(), locationInContainer, boundsRect)) + if (result.addNodeToListBasedTestResult(node(), locationInContainer, boundsRect) == StopHitTesting) return true; }
diff --git a/third_party/WebKit/Source/core/layout/LayoutTestHelper.cpp b/third_party/WebKit/Source/core/layout/LayoutTestHelper.cpp index 0d83855a..8d6a390 100644 --- a/third_party/WebKit/Source/core/layout/LayoutTestHelper.cpp +++ b/third_party/WebKit/Source/core/layout/LayoutTestHelper.cpp
@@ -67,6 +67,8 @@ m_subframe = LocalFrame::create(m_frameLoaderClient.get(), document().frame()->host(), &iframe); m_subframe->setView(FrameView::create(m_subframe.get(), IntSize(500, 500))); m_subframe->init(); + m_subframe->view()->setParentVisible(true); + m_subframe->view()->setSelfVisible(true); static_cast<SingleChildFrameLoaderClient*>(document().frame()->client())->setChild(m_subframe.get()); document().frame()->host()->incrementSubframeCount(); Document& frameDocument = *iframe.contentDocument();
diff --git a/third_party/WebKit/Source/core/layout/LayoutTestHelper.h b/third_party/WebKit/Source/core/layout/LayoutTestHelper.h index 81eb4dce..b27abac 100644 --- a/third_party/WebKit/Source/core/layout/LayoutTestHelper.h +++ b/third_party/WebKit/Source/core/layout/LayoutTestHelper.h
@@ -45,6 +45,8 @@ void enableCompositing() { m_pageHolder->page().settings().setAcceleratedCompositingEnabled(true); + document().view()->setParentVisible(true); + document().view()->setSelfVisible(true); document().view()->updateAllLifecyclePhases(); }
diff --git a/third_party/WebKit/Source/core/layout/compositing/CompositedLayerMapping.cpp b/third_party/WebKit/Source/core/layout/compositing/CompositedLayerMapping.cpp index d41aef29..8afe09c5c 100644 --- a/third_party/WebKit/Source/core/layout/compositing/CompositedLayerMapping.cpp +++ b/third_party/WebKit/Source/core/layout/compositing/CompositedLayerMapping.cpp
@@ -2256,6 +2256,9 @@ // Start with the bounds of the graphics layer in the space of the anchor LayoutObject. FloatRect graphicsLayerBoundsInObjectSpace(graphicsLayerBounds); graphicsLayerBoundsInObjectSpace.move(offsetFromAnchorLayoutObject); + // The object space means including writing mode flip. + if (anchorLayoutObject->isBox()) + toLayoutBox(anchorLayoutObject)->flipForWritingMode(graphicsLayerBoundsInObjectSpace); // Now map the bounds to its visible content rect in screen space, including applying clips along the way. LayoutRect visibleContentRect(graphicsLayerBoundsInObjectSpace);
diff --git a/third_party/WebKit/Source/core/layout/compositing/CompositedLayerMappingTest.cpp b/third_party/WebKit/Source/core/layout/compositing/CompositedLayerMappingTest.cpp index ac9d883..0f03819 100644 --- a/third_party/WebKit/Source/core/layout/compositing/CompositedLayerMappingTest.cpp +++ b/third_party/WebKit/Source/core/layout/compositing/CompositedLayerMappingTest.cpp
@@ -109,6 +109,23 @@ EXPECT_RECT_EQ(IntRect(0, 0, 200, 10000), computeInterestRect(paintLayer->compositedLayerMapping(), paintLayer->graphicsLayerBacking(), IntRect())); } +TEST_F(CompositedLayerMappingTest, VerticalRightLeftWritingModeDocument) +{ + setBodyInnerHTML("<style>html,body { margin: 0px } html { -webkit-writing-mode: vertical-rl}</style> <div id='target' style='width: 10000px; height: 200px;'></div>"); + + document().settings()->setMainFrameClipsContent(false); + + document().view()->updateAllLifecyclePhases(); + document().view()->scrollTo(DoublePoint(-5000, 0)); + document().view()->updateAllLifecyclePhases(); + + PaintLayer* paintLayer = document().layoutView()->layer(); + ASSERT_TRUE(paintLayer->graphicsLayerBacking()); + ASSERT_TRUE(paintLayer->compositedLayerMapping()); + // A scroll by -5000px is equivalent to a scroll by (10000 - 5000 - 800)px = 4200px in non-RTL mode. Expanding + // the resulting rect by 4000px in each direction yields this result. + EXPECT_RECT_EQ(IntRect(200, 0, 8800, 600), recomputeInterestRect(paintLayer->graphicsLayerBacking())); +} TEST_F(CompositedLayerMappingTest, RotatedInterestRect) {
diff --git a/third_party/WebKit/Source/core/layout/compositing/PaintLayerCompositor.cpp b/third_party/WebKit/Source/core/layout/compositing/PaintLayerCompositor.cpp index afe1f47..9b7b414 100644 --- a/third_party/WebKit/Source/core/layout/compositing/PaintLayerCompositor.cpp +++ b/third_party/WebKit/Source/core/layout/compositing/PaintLayerCompositor.cpp
@@ -767,6 +767,11 @@ bool PaintLayerCompositor::canBeComposited(const PaintLayer* layer) const { + FrameView* frameView = layer->layoutObject()->frameView(); + // Elements within an invisible frame must not be composited because they are not drawn. + if (frameView && !frameView->isVisible()) + return false; + const bool hasCompositorAnimation = m_compositingReasonFinder.requiresCompositingForAnimation(*layer->layoutObject()->style()); return m_hasAcceleratedCompositing && (hasCompositorAnimation || !layer->subtreeIsInvisible()) && layer->isSelfPaintingLayer() && !layer->layoutObject()->isLayoutFlowThread(); }
diff --git a/third_party/WebKit/Source/core/layout/line/EllipsisBox.cpp b/third_party/WebKit/Source/core/layout/line/EllipsisBox.cpp index ff7f9d51..4cb7c30 100644 --- a/third_party/WebKit/Source/core/layout/line/EllipsisBox.cpp +++ b/third_party/WebKit/Source/core/layout/line/EllipsisBox.cpp
@@ -53,9 +53,7 @@ LayoutRect boundsRect(boxOrigin, size()); if (visibleToHitTestRequest(result.hitTestRequest()) && boundsRect.intersects(LayoutRect(HitTestLocation::rectForPoint(locationInContainer.point(), 0, 0, 0, 0)))) { lineLayoutItem().updateHitTestResult(result, locationInContainer.point() - toLayoutSize(adjustedLocation)); - // FIXME: the call to rawValue() below is temporary and should be removed once the transition - // to LayoutUnit-based types is complete (crbug.com/321237) - if (!result.addNodeToListBasedTestResult(lineLayoutItem().node(), locationInContainer, boundsRect)) + if (result.addNodeToListBasedTestResult(lineLayoutItem().node(), locationInContainer, boundsRect) == StopHitTesting) return true; }
diff --git a/third_party/WebKit/Source/core/layout/line/InlineFlowBox.cpp b/third_party/WebKit/Source/core/layout/line/InlineFlowBox.cpp index e429394..aa91d18 100644 --- a/third_party/WebKit/Source/core/layout/line/InlineFlowBox.cpp +++ b/third_party/WebKit/Source/core/layout/line/InlineFlowBox.cpp
@@ -1046,11 +1046,11 @@ flipForWritingMode(rect); rect.moveBy(accumulatedOffset); - // Pixel snap hit testing. + // Pixel snap hit testing. rect = LayoutRect(pixelSnappedIntRect(rect)); if (visibleToHitTestRequest(result.hitTestRequest()) && locationInContainer.intersects(rect)) { lineLayoutItem().updateHitTestResult(result, flipForWritingMode(locationInContainer.point() - toLayoutSize(accumulatedOffset))); // Don't add in m_topLeft here, we want coords in the containing block's space. - if (!result.addNodeToListBasedTestResult(lineLayoutItem().node(), locationInContainer, rect)) + if (result.addNodeToListBasedTestResult(lineLayoutItem().node(), locationInContainer, rect) == StopHitTesting) return true; }
diff --git a/third_party/WebKit/Source/core/layout/line/InlineTextBox.cpp b/third_party/WebKit/Source/core/layout/line/InlineTextBox.cpp index 4fcfc43..fb2c6b4 100644 --- a/third_party/WebKit/Source/core/layout/line/InlineTextBox.cpp +++ b/third_party/WebKit/Source/core/layout/line/InlineTextBox.cpp
@@ -383,17 +383,15 @@ bool InlineTextBox::nodeAtPoint(HitTestResult& result, const HitTestLocation& locationInContainer, const LayoutPoint& accumulatedOffset, LayoutUnit /* lineTop */, LayoutUnit /*lineBottom*/) { - if (isLineBreak()) + if (isLineBreak() || m_truncation == cFullTruncation) return false; LayoutPoint boxOrigin = locationIncludingFlipping(); boxOrigin.moveBy(accumulatedOffset); LayoutRect rect(boxOrigin, size()); - // FIXME: both calls to rawValue() below is temporary and should be removed once the transition - // to LayoutUnit-based types is complete (crbug.com/321237) - if (m_truncation != cFullTruncation && visibleToHitTestRequest(result.hitTestRequest()) && locationInContainer.intersects(rect)) { + if (visibleToHitTestRequest(result.hitTestRequest()) && locationInContainer.intersects(rect)) { lineLayoutItem().updateHitTestResult(result, flipForWritingMode(locationInContainer.point() - toLayoutSize(accumulatedOffset))); - if (!result.addNodeToListBasedTestResult(lineLayoutItem().node(), locationInContainer, rect)) + if (result.addNodeToListBasedTestResult(lineLayoutItem().node(), locationInContainer, rect) == StopHitTesting) return true; } return false;
diff --git a/third_party/WebKit/Source/core/layout/svg/LayoutSVGContainer.cpp b/third_party/WebKit/Source/core/layout/svg/LayoutSVGContainer.cpp index 4a9ba97..d891048 100644 --- a/third_party/WebKit/Source/core/layout/svg/LayoutSVGContainer.cpp +++ b/third_party/WebKit/Source/core/layout/svg/LayoutSVGContainer.cpp
@@ -174,7 +174,7 @@ if (child->nodeAtFloatPoint(result, localPoint, hitTestAction)) { const LayoutPoint& localLayoutPoint = roundedLayoutPoint(localPoint); updateHitTestResult(result, localLayoutPoint); - if (!result.addNodeToListBasedTestResult(child->node(), localLayoutPoint)) + if (result.addNodeToListBasedTestResult(child->node(), localLayoutPoint) == StopHitTesting) return true; } } @@ -185,7 +185,7 @@ if (objectBoundingBox().contains(localPoint)) { const LayoutPoint& localLayoutPoint = roundedLayoutPoint(localPoint); updateHitTestResult(result, localLayoutPoint); - if (!result.addNodeToListBasedTestResult(element(), localLayoutPoint)) + if (result.addNodeToListBasedTestResult(element(), localLayoutPoint) == StopHitTesting) return true; } }
diff --git a/third_party/WebKit/Source/core/layout/svg/LayoutSVGImage.cpp b/third_party/WebKit/Source/core/layout/svg/LayoutSVGImage.cpp index 4ad3cc2..aa62500f 100644 --- a/third_party/WebKit/Source/core/layout/svg/LayoutSVGImage.cpp +++ b/third_party/WebKit/Source/core/layout/svg/LayoutSVGImage.cpp
@@ -129,7 +129,7 @@ if (m_objectBoundingBox.contains(localPoint)) { const LayoutPoint& localLayoutPoint = roundedLayoutPoint(localPoint); updateHitTestResult(result, localLayoutPoint); - if (!result.addNodeToListBasedTestResult(element(), localLayoutPoint)) + if (result.addNodeToListBasedTestResult(element(), localLayoutPoint) == StopHitTesting) return true; } }
diff --git a/third_party/WebKit/Source/core/layout/svg/LayoutSVGRoot.cpp b/third_party/WebKit/Source/core/layout/svg/LayoutSVGRoot.cpp index 1fcbbe02..708a8dc 100644 --- a/third_party/WebKit/Source/core/layout/svg/LayoutSVGRoot.cpp +++ b/third_party/WebKit/Source/core/layout/svg/LayoutSVGRoot.cpp
@@ -381,7 +381,7 @@ // FIXME: nodeAtFloatPoint() doesn't handle rect-based hit tests yet. if (child->nodeAtFloatPoint(result, localPoint, hitTestAction)) { updateHitTestResult(result, pointInBorderBox); - if (!result.addNodeToListBasedTestResult(child->node(), locationInContainer)) + if (result.addNodeToListBasedTestResult(child->node(), locationInContainer) == StopHitTesting) return true; } } @@ -397,7 +397,7 @@ LayoutRect boundsRect(accumulatedOffset + location(), size()); if (locationInContainer.intersects(boundsRect)) { updateHitTestResult(result, pointInBorderBox); - if (!result.addNodeToListBasedTestResult(node(), locationInContainer, boundsRect)) + if (result.addNodeToListBasedTestResult(node(), locationInContainer, boundsRect) == StopHitTesting) return true; } }
diff --git a/third_party/WebKit/Source/core/layout/svg/LayoutSVGShape.cpp b/third_party/WebKit/Source/core/layout/svg/LayoutSVGShape.cpp index 3674c49..485dad1f 100644 --- a/third_party/WebKit/Source/core/layout/svg/LayoutSVGShape.cpp +++ b/third_party/WebKit/Source/core/layout/svg/LayoutSVGShape.cpp
@@ -222,7 +222,7 @@ if (nodeAtFloatPointInternal(result.hitTestRequest(), localPoint, hitRules)) { const LayoutPoint& localLayoutPoint = roundedLayoutPoint(localPoint); updateHitTestResult(result, localLayoutPoint); - if (!result.addNodeToListBasedTestResult(element(), localLayoutPoint)) + if (result.addNodeToListBasedTestResult(element(), localLayoutPoint) == StopHitTesting) return true; }
diff --git a/third_party/WebKit/Source/core/layout/svg/line/SVGInlineTextBox.cpp b/third_party/WebKit/Source/core/layout/svg/line/SVGInlineTextBox.cpp index a7e1d65..d0391351 100644 --- a/third_party/WebKit/Source/core/layout/svg/line/SVGInlineTextBox.cpp +++ b/third_party/WebKit/Source/core/layout/svg/line/SVGInlineTextBox.cpp
@@ -266,7 +266,7 @@ FloatQuad fragmentQuad = fragment.boundingQuad(baseline); if (fragmentQuad.containsPoint(floatLocation)) { lineLayoutItem.updateHitTestResult(result, locationInContainer.point() - toLayoutSize(accumulatedOffset)); - if (!result.addNodeToListBasedTestResult(lineLayoutItem.node(), locationInContainer, rect)) + if (result.addNodeToListBasedTestResult(lineLayoutItem.node(), locationInContainer, rect) == StopHitTesting) return true; } }
diff --git a/third_party/WebKit/Source/core/loader/FrameFetchContext.cpp b/third_party/WebKit/Source/core/loader/FrameFetchContext.cpp index 000e8f9..dded49c 100644 --- a/third_party/WebKit/Source/core/loader/FrameFetchContext.cpp +++ b/third_party/WebKit/Source/core/loader/FrameFetchContext.cpp
@@ -250,14 +250,17 @@ void FrameFetchContext::dispatchDidReceiveResponse(unsigned long identifier, const ResourceResponse& response, ResourceLoader* resourceLoader) { + LinkLoader::CanLoadResources resourceLoadingPolicy = LinkLoader::LoadResourcesAndPreconnect; MixedContentChecker::checkMixedPrivatePublic(frame(), response.remoteIPAddress()); - LinkLoader::loadLinkFromHeader(response.httpHeaderField(HTTPNames::Link), frame()->document(), NetworkHintsInterfaceImpl(), LinkLoader::DoNotLoadResources); if (m_documentLoader == frame()->loader().provisionalDocumentLoader()) { ResourceFetcher* fetcher = nullptr; if (frame()->document()) fetcher = frame()->document()->fetcher(); m_documentLoader->clientHintsPreferences().updateFromAcceptClientHintsHeader(response.httpHeaderField(HTTPNames::Accept_CH), fetcher); + // When response is received with a provisional docloader, the resource haven't committed yet, and we cannot load resources, only preconnect. + resourceLoadingPolicy = LinkLoader::DoNotLoadResources; } + LinkLoader::loadLinkFromHeader(response.httpHeaderField(HTTPNames::Link), frame()->document(), NetworkHintsInterfaceImpl(), resourceLoadingPolicy); if (response.hasMajorCertificateErrors() && resourceLoader) MixedContentChecker::handleCertificateError(frame(), resourceLoader->originalRequest(), response);
diff --git a/third_party/WebKit/Source/core/loader/FrameLoader.cpp b/third_party/WebKit/Source/core/loader/FrameLoader.cpp index 266ae71..11f345c 100644 --- a/third_party/WebKit/Source/core/loader/FrameLoader.cpp +++ b/third_party/WebKit/Source/core/loader/FrameLoader.cpp
@@ -441,7 +441,7 @@ m_frame->document()->initContentSecurityPolicy(m_documentLoader ? m_documentLoader->releaseContentSecurityPolicy() : ContentSecurityPolicy::create()); if (m_documentLoader) { m_frame->document()->clientHintsPreferences().updateFrom(m_documentLoader->clientHintsPreferences()); - LinkLoader::loadLinkFromHeader(m_documentLoader->response().httpHeaderField(HTTPNames::Link), m_frame->document(), NetworkHintsInterfaceImpl(), LinkLoader::LoadResources); + LinkLoader::loadLinkFromHeader(m_documentLoader->response().httpHeaderField(HTTPNames::Link), m_frame->document(), NetworkHintsInterfaceImpl(), LinkLoader::OnlyLoadResources); } Settings* settings = m_frame->document()->settings(); @@ -1210,8 +1210,8 @@ ResourceError c(ResourceError::cancelledError(KURL())); if ((error.errorCode() != c.errorCode() || error.domain() != c.domain()) && m_frame->owner()) { // FIXME: For now, fallback content doesn't work cross process. - ASSERT(m_frame->owner()->isLocal()); - m_frame->deprecatedLocalOwner()->renderFallbackContent(); + if (m_frame->owner()->isLocal()) + m_frame->deprecatedLocalOwner()->renderFallbackContent(); } HistoryCommitType historyCommitType = loadTypeToCommitType(m_loadType);
diff --git a/third_party/WebKit/Source/core/loader/LinkLoader.cpp b/third_party/WebKit/Source/core/loader/LinkLoader.cpp index e0f24c16..fd4abadc 100644 --- a/third_party/WebKit/Source/core/loader/LinkLoader.cpp +++ b/third_party/WebKit/Source/core/loader/LinkLoader.cpp
@@ -253,13 +253,14 @@ LinkRelAttribute relAttribute(header.rel()); KURL url = document->completeURL(header.url()); - if (canLoadResources == DoNotLoadResources) { + if (canLoadResources != OnlyLoadResources) { if (RuntimeEnabledFeatures::linkHeaderEnabled()) dnsPrefetchIfNeeded(relAttribute, url, *document, networkHintsInterface, LinkCalledFromHeader); if (RuntimeEnabledFeatures::linkPreconnectEnabled()) preconnectIfNeeded(relAttribute, url, *document, header.crossOrigin(), networkHintsInterface, LinkCalledFromHeader); - } else { + } + if (canLoadResources != DoNotLoadResources) { if (RuntimeEnabledFeatures::linkPreloadEnabled()) preloadIfNeeded(relAttribute, url, *document, header.as(), LinkCalledFromHeader); }
diff --git a/third_party/WebKit/Source/core/loader/LinkLoader.h b/third_party/WebKit/Source/core/loader/LinkLoader.h index dd55278..a872886 100644 --- a/third_party/WebKit/Source/core/loader/LinkLoader.h +++ b/third_party/WebKit/Source/core/loader/LinkLoader.h
@@ -74,7 +74,7 @@ void released(); bool loadLink(const LinkRelAttribute&, CrossOriginAttributeValue, const String& type, const String& as, const KURL&, Document&, const NetworkHintsInterface&); - enum CanLoadResources { LoadResources, DoNotLoadResources }; + enum CanLoadResources { OnlyLoadResources, DoNotLoadResources, LoadResourcesAndPreconnect }; static bool loadLinkFromHeader(const String& headerValue, Document*, const NetworkHintsInterface&, CanLoadResources); static Resource::Type getTypeFromAsAttribute(const String& as, Document*);
diff --git a/third_party/WebKit/Source/core/page/Page.cpp b/third_party/WebKit/Source/core/page/Page.cpp index 2db6b62f..ccf0712 100644 --- a/third_party/WebKit/Source/core/page/Page.cpp +++ b/third_party/WebKit/Source/core/page/Page.cpp
@@ -355,7 +355,6 @@ { static const double waitingTimeBeforeCompressingString = 10; - CompressibleStringImpl::setPageBackground(visibilityState == PageVisibilityStateHidden); if (m_visibilityState == visibilityState) return; m_visibilityState = visibilityState;
diff --git a/third_party/WebKit/Source/core/testing/Internals.cpp b/third_party/WebKit/Source/core/testing/Internals.cpp index 920e6bb..5948b8d 100644 --- a/third_party/WebKit/Source/core/testing/Internals.cpp +++ b/third_party/WebKit/Source/core/testing/Internals.cpp
@@ -309,9 +309,9 @@ return 0; } - unsigned beforeCount = document->styleEngine().resolverAccessCount(); + unsigned beforeCount = document->styleEngine().styleForElementCount(); document->updateLayoutTreeIfNeeded(); - return document->styleEngine().resolverAccessCount() - beforeCount; + return document->styleEngine().styleForElementCount() - beforeCount; } unsigned Internals::needsLayoutCount(ExceptionState& exceptionState) const
diff --git a/third_party/WebKit/Source/devtools/devtools.gypi b/third_party/WebKit/Source/devtools/devtools.gypi index 9cc4d10..7a8de50 100644 --- a/third_party/WebKit/Source/devtools/devtools.gypi +++ b/third_party/WebKit/Source/devtools/devtools.gypi
@@ -119,6 +119,7 @@ ], 'devtools_sass_js_files': [ 'front_end/sass/SASSLiveSourceMap.js', + 'front_end/sass/SASSWorkspaceAdapter.js', 'front_end/sass/SASSSupport.js', ], 'devtools_screencast_js_files': [ @@ -201,7 +202,9 @@ 'front_end/emulation/mediaQueryInspector.css', 'front_end/emulation/sensors.css', 'front_end/emulation/DeviceModeModel.js', + 'front_end/emulation/DeviceModeToolbar.js', 'front_end/emulation/DeviceModeView.js', + 'front_end/emulation/DeviceModeWrapper.js', 'front_end/emulation/DeviceOrientation.js', 'front_end/emulation/DevicesSettingsTab.js', 'front_end/emulation/EmulatedDevices.js',
diff --git a/third_party/WebKit/Source/devtools/front_end/emulation/DeviceModeModel.js b/third_party/WebKit/Source/devtools/front_end/emulation/DeviceModeModel.js index 3ab03939..4f18f18 100644 --- a/third_party/WebKit/Source/devtools/front_end/emulation/DeviceModeModel.js +++ b/third_party/WebKit/Source/devtools/front_end/emulation/DeviceModeModel.js
@@ -18,7 +18,6 @@ this._deviceMetricsThrottler = new WebInspector.Throttler(0); this._appliedDeviceSize = new Size(1, 1); this._currentDeviceScaleFactor = window.devicePixelRatio; - this._appliedDeviceScaleFactor = 0; this._scaleSetting = WebInspector.settings.createSetting("emulation.deviceScale", 1); // We've used to allow zero before. @@ -284,14 +283,6 @@ }, /** - * @return {number} - */ - appliedDeviceScaleFactor: function() - { - return this._appliedDeviceScaleFactor; - }, - - /** * @return {!WebInspector.Setting} */ scaleSetting: function() @@ -384,11 +375,6 @@ this._target = null; }, - requestAppBanner: function() - { - this._target.pageAgent().requestAppBanner(); - }, - _scaleSettingChanged: function() { this._calculateAndEmulate(true); @@ -528,7 +514,6 @@ Math.min(pageWidth * scale, this._availableSize.width - this._screenRect.left - positionX * scale), Math.min(pageHeight * scale, this._availableSize.height - this._screenRect.top - positionY * scale)); this._scale = scale; - this._appliedDeviceScaleFactor = deviceScaleFactor; if (scale === 1 && this._availableSize.width >= screenSize.width && this._availableSize.height >= screenSize.height) { // When we have enough space, no page size override is required. This will speed things up and remove lag.
diff --git a/third_party/WebKit/Source/devtools/front_end/emulation/DeviceModeToolbar.js b/third_party/WebKit/Source/devtools/front_end/emulation/DeviceModeToolbar.js new file mode 100644 index 0000000..00f8721 --- /dev/null +++ b/third_party/WebKit/Source/devtools/front_end/emulation/DeviceModeToolbar.js
@@ -0,0 +1,566 @@ +// 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. + +/** + * @param {!WebInspector.DeviceModeModel} model + * @param {!WebInspector.Setting} showMediaInspectorSetting + * @param {!WebInspector.Setting} showRulersSetting + * @constructor + */ +WebInspector.DeviceModeToolbar = function(model, showMediaInspectorSetting, showRulersSetting) +{ + this._model = model; + this._showMediaInspectorSetting = showMediaInspectorSetting; + this._showRulersSetting = showRulersSetting; + /** @type {!Map<!WebInspector.EmulatedDevice, !WebInspector.EmulatedDevice.Mode>} */ + this._lastMode = new Map(); + + this._element = createElementWithClass("div", "device-mode-toolbar"); + + var leftContainer = this._element.createChild("div", "device-mode-toolbar-spacer"); + leftContainer.createChild("div", "device-mode-toolbar-spacer"); + var leftToolbar = new WebInspector.Toolbar("", leftContainer); + leftToolbar.makeWrappable(); + this._fillLeftToolbar(leftToolbar); + + var mainToolbar = new WebInspector.Toolbar("", this._element); + mainToolbar.makeWrappable(); + this._fillMainToolbar(mainToolbar); + + var rightContainer = this._element.createChild("div", "device-mode-toolbar-spacer"); + var rightToolbar = new WebInspector.Toolbar("device-mode-toolbar-fixed-size", rightContainer); + rightToolbar.makeWrappable(); + this._fillRightToolbar(rightToolbar); + var modeToolbar = new WebInspector.Toolbar("device-mode-toolbar-fixed-size", rightContainer); + modeToolbar.makeWrappable(); + this._fillModeToolbar(modeToolbar); + rightContainer.createChild("div", "device-mode-toolbar-spacer"); + var optionsToolbar = new WebInspector.Toolbar("", rightContainer); + optionsToolbar.makeWrappable(true); + this._fillOptionsToolbar(optionsToolbar); + + WebInspector.emulatedDevicesList.addEventListener(WebInspector.EmulatedDevicesList.Events.CustomDevicesUpdated, this._deviceListChanged, this); + WebInspector.emulatedDevicesList.addEventListener(WebInspector.EmulatedDevicesList.Events.StandardDevicesUpdated, this._deviceListChanged, this); + + this._persistenceSetting = WebInspector.settings.createSetting("emulation.deviceModeValue", {device: "", orientation: "", mode: ""}); +} + +WebInspector.DeviceModeToolbar.prototype = { + /** + * @param {!WebInspector.Toolbar} toolbar + */ + _fillLeftToolbar: function(toolbar) + { + toolbar.appendToolbarItem(this._wrapToolbarItem(createElementWithClass("div", "device-mode-empty-toolbar-element"))); + this._deviceSelectItem = new WebInspector.ToolbarMenuButton(this._appendDeviceMenuItems.bind(this)); + this._deviceSelectItem.setGlyph(""); + this._deviceSelectItem.turnIntoSelect(95); + toolbar.appendToolbarItem(this._deviceSelectItem); + }, + + /** + * @param {!WebInspector.Toolbar} toolbar + */ + _fillMainToolbar: function(toolbar) + { + var widthInput = createElementWithClass("input", "device-mode-size-input"); + widthInput.maxLength = 4; + widthInput.type = "text"; + widthInput.title = WebInspector.UIString("Width"); + this._updateWidthInput = this._bindInput(widthInput, this._model.setWidthAndScaleToFit.bind(this._model), WebInspector.DeviceModeModel.deviceSizeValidator); + this._widthInput = widthInput; + this._widthItem = this._wrapToolbarItem(widthInput); + toolbar.appendToolbarItem(this._widthItem); + + var xElement = createElementWithClass("div", "device-mode-x"); + xElement.textContent = "\u00D7"; + this._xItem = this._wrapToolbarItem(xElement); + toolbar.appendToolbarItem(this._xItem); + + var heightInput = createElementWithClass("input", "device-mode-size-input"); + heightInput.maxLength = 4; + heightInput.type = "text"; + heightInput.title = WebInspector.UIString("Height (leave empty for full)"); + this._updateHeightInput = this._bindInput(heightInput, this._model.setHeightAndScaleToFit.bind(this._model), validateHeight); + this._heightInput = heightInput; + this._heightItem = this._wrapToolbarItem(heightInput); + toolbar.appendToolbarItem(this._heightItem); + + /** + * @param {string} value + * @return {string} + */ + function validateHeight(value) + { + return !value ? "" : WebInspector.DeviceModeModel.deviceSizeValidator(value); + } + }, + + /** + * @param {!WebInspector.Toolbar} toolbar + */ + _fillRightToolbar: function(toolbar) + { + toolbar.appendToolbarItem(this._wrapToolbarItem(createElementWithClass("div", "device-mode-empty-toolbar-element"))); + this._scaleItem = new WebInspector.ToolbarMenuButton(this._appendScaleMenuItems.bind(this)); + this._scaleItem.setTitle(WebInspector.UIString("Zoom")); + this._scaleItem.setGlyph(""); + this._scaleItem.turnIntoSelect(); + toolbar.appendToolbarItem(this._scaleItem); + }, + + /** + * @param {!WebInspector.Toolbar} toolbar + */ + _fillModeToolbar: function(toolbar) + { + toolbar.appendToolbarItem(this._wrapToolbarItem(createElementWithClass("div", "device-mode-empty-toolbar-element"))); + this._modeButton = new WebInspector.ToolbarButton("", "rotate-screen-toolbar-item"); + this._modeButton.addEventListener("click", this._modeMenuClicked, this); + toolbar.appendToolbarItem(this._modeButton); + }, + + /** + * @param {!WebInspector.Toolbar} toolbar + */ + _fillOptionsToolbar: function(toolbar) + { + this._uaItem = new WebInspector.ToolbarText(); + this._uaItem.setVisible(false); + this._uaItem.setTitle(WebInspector.UIString("User agent type")); + toolbar.appendToolbarItem(this._uaItem); + + this._deviceScaleItem = new WebInspector.ToolbarText(); + this._deviceScaleItem.setVisible(false); + this._deviceScaleItem.setTitle(WebInspector.UIString("Device pixel ratio")); + toolbar.appendToolbarItem(this._deviceScaleItem); + + var moreOptionsButton = new WebInspector.ToolbarMenuButton(this._appendOptionsMenuItems.bind(this)); + moreOptionsButton.setTitle(WebInspector.UIString("More options")); + toolbar.appendToolbarItem(moreOptionsButton); + + toolbar.appendToolbarItem(this._wrapToolbarItem(createElementWithClass("div", "device-mode-empty-toolbar-element"))); + }, + + + /** + * @param {!Element} input + * @param {function(number)} apply + * @param {function(string):?string} validate + * @return {function(number)} + */ + _bindInput: function(input, apply, validate) + { + input.addEventListener("change", onChange, false); + input.addEventListener("input", onInput, false); + input.addEventListener("keydown", onKeyDown, false); + input.addEventListener("focus", input.select.bind(input), false); + + function onInput() + { + input.classList.toggle("error-input", !!validate(input.value)); + } + + function onChange() + { + var valid = !validate(input.value); + input.classList.toggle("error-input", !valid); + if (valid) + apply(input.value ? Number(input.value) : 0); + } + + /** + * @param {!Event} event + */ + function onKeyDown(event) + { + if (isEnterKey(event)) { + if (!validate(input.value)) + apply(input.value ? Number(input.value) : 0); + return; + } + + var increment = event.keyIdentifier === "Up" ? 1 : event.keyIdentifier === "Down" ? -1 : 0; + if (!increment) + return; + if (event.shiftKey) + increment *= 10; + + var value = input.value; + if (validate(value) || !value) + return; + + value = (value ? Number(value) : 0) + increment; + var stringValue = value ? String(value) : ""; + if (validate(stringValue) || !value) + return; + + input.value = stringValue; + apply(input.value ? Number(input.value) : 0); + event.preventDefault(); + } + + /** + * @param {number} value + */ + function setValue(value) + { + var stringValue = value ? String(value) : ""; + if (stringValue === input.value) + return; + var valid = !validate(stringValue); + input.classList.toggle("error-input", !valid); + input.value = stringValue; + input.setSelectionRange(stringValue.length, stringValue.length); + } + + return setValue; + }, + + /** + * @param {!WebInspector.ContextMenu} contextMenu + */ + _appendScaleMenuItems: function(contextMenu) + { + var scaleSetting = this._model.scaleSetting(); + if (this._model.type() === WebInspector.DeviceModeModel.Type.Device) { + contextMenu.appendItem(WebInspector.UIString("Fit to window (%.0f%%)", this._model.fitScale() * 100), scaleSetting.set.bind(scaleSetting, this._model.fitScale()), false); + contextMenu.appendSeparator(); + } + appendScaleItem(WebInspector.UIString("50%"), 0.5); + appendScaleItem(WebInspector.UIString("75%"), 0.75); + appendScaleItem(WebInspector.UIString("100%"), 1); + appendScaleItem(WebInspector.UIString("125%"), 1.25); + appendScaleItem(WebInspector.UIString("150%"), 1.5); + + /** + * @param {string} title + * @param {number} value + */ + function appendScaleItem(title, value) + { + contextMenu.appendCheckboxItem(title, scaleSetting.set.bind(scaleSetting, value), scaleSetting.get() === value, false); + } + }, + + /** + * @param {!WebInspector.ContextMenu} contextMenu + */ + _appendOptionsMenuItems: function(contextMenu) + { + var uaDisabled = this._model.type() !== WebInspector.DeviceModeModel.Type.Responsive; + var uaSetting = this._model.uaSetting(); + var uaSubmenu = contextMenu.appendSubMenuItem(WebInspector.UIString("User agent type"), false); + var uaValue = this._model.uaSetting().get(); + if (this._model.type() === WebInspector.DeviceModeModel.Type.None) + uaValue = WebInspector.DeviceModeModel.UA.Desktop; + if (this._model.type() === WebInspector.DeviceModeModel.Type.Device) + uaValue = this._model.device().mobile() ? WebInspector.DeviceModeModel.UA.Mobile : this._model.device().touch() ? WebInspector.DeviceModeModel.UA.DesktopTouch : WebInspector.DeviceModeModel.UA.Desktop; + appendUAItem(WebInspector.UIString("Mobile (default)"), WebInspector.DeviceModeModel.UA.Mobile); + appendUAItem(WebInspector.UIString("Desktop"), WebInspector.DeviceModeModel.UA.Desktop); + appendUAItem(WebInspector.UIString("Desktop with touch"), WebInspector.DeviceModeModel.UA.DesktopTouch); + + /** + * @param {string} title + * @param {!WebInspector.DeviceModeModel.UA} value + */ + function appendUAItem(title, value) + { + uaSubmenu.appendCheckboxItem(title, uaSetting.set.bind(uaSetting, value), uaValue === value, uaDisabled); + } + + var deviceScaleFactorDisabled = this._model.type() !== WebInspector.DeviceModeModel.Type.Responsive; + var deviceScaleFactorSubmenu = contextMenu.appendSubMenuItem(WebInspector.UIString("Device pixel ratio"), false); + var deviceScaleFactorSetting = this._model.deviceScaleFactorSetting(); + var deviceScaleFactorValue = deviceScaleFactorDisabled ? 0 : deviceScaleFactorSetting.get(); + appendDeviceScaleFactorItem(WebInspector.UIString("Default: %f", this._model.defaultDeviceScaleFactor()), 0); + deviceScaleFactorSubmenu.appendSeparator(); + appendDeviceScaleFactorItem(WebInspector.UIString("1"), 1); + appendDeviceScaleFactorItem(WebInspector.UIString("2"), 2); + appendDeviceScaleFactorItem(WebInspector.UIString("3"), 3); + + /** + * @param {string} title + * @param {number} value + */ + function appendDeviceScaleFactorItem(title, value) + { + deviceScaleFactorSubmenu.appendCheckboxItem(title, deviceScaleFactorSetting.set.bind(deviceScaleFactorSetting, value), deviceScaleFactorValue === value, deviceScaleFactorDisabled); + } + + contextMenu.appendItem(WebInspector.UIString("Reset to defaults"), this._model.reset.bind(this._model), this._model.type() !== WebInspector.DeviceModeModel.Type.Responsive); + contextMenu.appendSeparator(); + + contextMenu.appendCheckboxItem(WebInspector.UIString("Show media queries"), this._toggleMediaInspector.bind(this), this._showMediaInspectorSetting.get(), this._model.type() === WebInspector.DeviceModeModel.Type.None); + contextMenu.appendCheckboxItem(WebInspector.UIString("Show rulers"), this._toggleRulers.bind(this), this._showRulersSetting.get(), this._model.type() === WebInspector.DeviceModeModel.Type.None); + contextMenu.appendItem(WebInspector.UIString("Configure network\u2026"), this._openNetworkConfig.bind(this), false); + contextMenu.appendItemsAtLocation("deviceModeMenu"); + }, + + _toggleMediaInspector: function() + { + this._showMediaInspectorSetting.set(!this._showMediaInspectorSetting.get()); + }, + + _toggleRulers: function() + { + this._showRulersSetting.set(!this._showRulersSetting.get()); + }, + + _openNetworkConfig: function() + { + InspectorFrontendHost.bringToFront(); + // TODO(dgozman): make it explicit. + WebInspector.actionRegistry.action("network.show-config").execute(); + }, + + /** + * @param {!Element} element + * @return {!WebInspector.ToolbarItem} + */ + _wrapToolbarItem: function(element) + { + var container = createElement("div"); + var shadowRoot = WebInspector.createShadowRootWithCoreStyles(container, "emulation/deviceModeToolbar.css"); + shadowRoot.appendChild(element); + return new WebInspector.ToolbarItem(container); + }, + + /** + * @param {!WebInspector.EmulatedDevice} device + */ + _emulateDevice: function(device) + { + this._model.emulate(WebInspector.DeviceModeModel.Type.Device, device, this._lastMode.get(device) || device.modes[0]); + }, + + _switchToResponsive: function() + { + this._model.emulate(WebInspector.DeviceModeModel.Type.Responsive, null, null); + }, + + /** + * @param {!Array<!WebInspector.EmulatedDevice>} devices + * @return {!Array<!WebInspector.EmulatedDevice>} + */ + _filterDevices: function(devices) + { + devices = devices.filter(function(d) { return d.show(); }); + devices.sort(WebInspector.EmulatedDevice.deviceComparator); + return devices; + }, + + /** + * @return {!Array<!WebInspector.EmulatedDevice>} + */ + _standardDevices: function() + { + return this._filterDevices(WebInspector.emulatedDevicesList.standard()); + }, + + /** + * @return {!Array<!WebInspector.EmulatedDevice>} + */ + _customDevices: function() + { + return this._filterDevices(WebInspector.emulatedDevicesList.custom()); + }, + + /** + * @return {!Array<!WebInspector.EmulatedDevice>} + */ + _allDevices: function() + { + return this._standardDevices().concat(this._customDevices()); + }, + + /** + * @param {!WebInspector.ContextMenu} contextMenu + */ + _appendDeviceMenuItems: function(contextMenu) + { + contextMenu.appendCheckboxItem(WebInspector.UIString("Responsive"), this._switchToResponsive.bind(this), this._model.type() === WebInspector.DeviceModeModel.Type.Responsive, false); + appendGroup.call(this, this._standardDevices()); + appendGroup.call(this, this._customDevices()); + contextMenu.appendSeparator(); + contextMenu.appendItem(WebInspector.UIString("Edit\u2026"), WebInspector.emulatedDevicesList.revealCustomSetting.bind(WebInspector.emulatedDevicesList), false); + + /** + * @param {!Array<!WebInspector.EmulatedDevice>} devices + * @this {WebInspector.DeviceModeToolbar} + */ + function appendGroup(devices) + { + if (!devices.length) + return; + contextMenu.appendSeparator(); + for (var device of devices) + contextMenu.appendCheckboxItem(device.title, this._emulateDevice.bind(this, device), this._model.device() === device, false); + } + }, + + /** + * @this {WebInspector.DeviceModeToolbar} + */ + _deviceListChanged: function() + { + if (!this._model.device()) + return; + + var devices = this._allDevices(); + if (devices.indexOf(this._model.device()) === -1) + this._emulateDevice(devices[0] || WebInspector.emulatedDevicesList.standard()[0]); + }, + + /** + * @param {!WebInspector.Event} event + */ + _modeMenuClicked: function(event) + { + var device = this._model.device(); + var model = this._model; + + if (device.modes.length === 2 && device.modes[0].orientation !== device.modes[1].orientation) { + model.emulate(model.type(), model.device(), model.mode() === device.modes[0] ? device.modes[1] : device.modes[0]); + return; + } + + var contextMenu = new WebInspector.ContextMenu(/** @type {!Event} */ (event.data), + false, + event.target.element.totalOffsetLeft(), + event.target.element.totalOffsetTop() + event.target.element.offsetHeight); + addOrientation(WebInspector.EmulatedDevice.Vertical, WebInspector.UIString("Portrait")); + addOrientation(WebInspector.EmulatedDevice.Horizontal, WebInspector.UIString("Landscape")); + contextMenu.show(); + + /** + * @param {string} orientation + * @param {string} title + */ + function addOrientation(orientation, title) + { + var modes = device.modesForOrientation(orientation); + if (!modes.length) + return; + if (modes.length === 1) { + addMode(modes[0], title); + } else { + for (var index = 0; index < modes.length; index++) + addMode(modes[index], title + " \u2013 " + modes[index].title); + } + } + + /** + * @param {!WebInspector.EmulatedDevice.Mode} mode + * @param {string} title + */ + function addMode(mode, title) + { + contextMenu.appendCheckboxItem(title, applyMode.bind(null, mode), model.mode() === mode, false); + } + + /** + * @param {!WebInspector.EmulatedDevice.Mode} mode + */ + function applyMode(mode) + { + model.emulate(model.type(), model.device(), mode); + } + }, + + /** + * @return {!Element} + */ + element: function() + { + return this._element; + }, + + update: function() + { + if (this._model.type() !== this._cachedModelType) { + this._cachedModelType = this._model.type(); + this._widthInput.disabled = this._model.type() !== WebInspector.DeviceModeModel.Type.Responsive; + this._heightInput.disabled = this._model.type() !== WebInspector.DeviceModeModel.Type.Responsive; + } + + var size = this._model.appliedDeviceSize(); + this._updateHeightInput(this._model.type() === WebInspector.DeviceModeModel.Type.Responsive && this._model.isFullHeight() ? 0 : size.height); + this._updateWidthInput(size.width); + this._heightInput.placeholder = size.height; + + if (this._model.scale() !== this._cachedScale) { + this._scaleItem.setText(WebInspector.UIString("%.0f%%", this._model.scale() * 100)); + this._scaleItem.setState(this._model.scale() === 1 ? "off" : "on"); + this._cachedScale = this._model.scale(); + } + + var deviceScale = this._model.deviceScaleFactorSetting().get(); + this._deviceScaleItem.setVisible(this._model.type() === WebInspector.DeviceModeModel.Type.Responsive && !!deviceScale); + if (deviceScale !== this._cachedDeviceScale) { + this._deviceScaleItem.setText(WebInspector.UIString("DPR: %.1f", deviceScale)); + this._cachedDeviceScale = deviceScale; + } + + var uaType = this._model.type() === WebInspector.DeviceModeModel.Type.Responsive ? this._model.uaSetting().get() : WebInspector.DeviceModeModel.UA.Mobile; + this._uaItem.setVisible(this._model.type() === WebInspector.DeviceModeModel.Type.Responsive && uaType !== WebInspector.DeviceModeModel.UA.Mobile); + if (uaType !== this._cachedUaType) { + this._uaItem.setText(uaType === WebInspector.DeviceModeModel.UA.Desktop ? WebInspector.UIString("Desktop") : WebInspector.UIString("Touch")); + this._cachedUaType = uaType; + } + + var deviceItemTitle = WebInspector.UIString("None"); + if (this._model.type() === WebInspector.DeviceModeModel.Type.Responsive) + deviceItemTitle = WebInspector.UIString("Responsive"); + if (this._model.type() === WebInspector.DeviceModeModel.Type.Device) + deviceItemTitle = this._model.device().title; + this._deviceSelectItem.setText(deviceItemTitle); + + if (this._model.device() !== this._cachedModelDevice) { + var device = this._model.device(); + this._modeButton.setVisible(!!device); + if (device) { + var modeCount = device ? device.modes.length : 0; + this._modeButton.setEnabled(modeCount >= 2); + this._modeButton.setTitle(modeCount === 2 ? WebInspector.UIString("Rotate") : WebInspector.UIString("Screen options")); + } + this._cachedModelDevice = device; + } + + if (this._model.type() === WebInspector.DeviceModeModel.Type.Device) + this._lastMode.set(/** @type {!WebInspector.EmulatedDevice} */ (this._model.device()), /** @type {!WebInspector.EmulatedDevice.Mode} */ (this._model.mode())); + + if (this._model.mode() !== this._cachedModelMode && this._model.type() !== WebInspector.DeviceModeModel.Type.None) { + this._cachedModelMode = this._model.mode(); + var value = this._persistenceSetting.get(); + if (this._model.device()) { + value.device = this._model.device().title; + value.orientation = this._model.mode() ? this._model.mode().orientation : ""; + value.mode = this._model.mode() ? this._model.mode().title : ""; + } else { + value.device = ""; + value.orientation = ""; + value.mode = ""; + } + this._persistenceSetting.set(value); + } + }, + + restore: function() + { + for (var device of this._allDevices()) { + if (device.title === this._persistenceSetting.get().device) { + for (var mode of device.modes) { + if (mode.orientation === this._persistenceSetting.get().orientation && mode.title === this._persistenceSetting.get().mode) { + this._lastMode.set(device, mode); + this._emulateDevice(device); + return; + } + } + } + } + + this._model.emulate(WebInspector.DeviceModeModel.Type.Responsive, null, null); + } +}
diff --git a/third_party/WebKit/Source/devtools/front_end/emulation/DeviceModeView.js b/third_party/WebKit/Source/devtools/front_end/emulation/DeviceModeView.js index da37808..7954e04 100644 --- a/third_party/WebKit/Source/devtools/front_end/emulation/DeviceModeView.js +++ b/third_party/WebKit/Source/devtools/front_end/emulation/DeviceModeView.js
@@ -33,7 +33,7 @@ WebInspector.DeviceModeView.prototype = { _createUI: function() { - this._toolbar = new WebInspector.DeviceModeView.Toolbar(this._model, this._showMediaInspectorSetting, this._showRulersSetting); + this._toolbar = new WebInspector.DeviceModeToolbar(this._model, this._showMediaInspectorSetting, this._showRulersSetting); this.contentElement.appendChild(this._toolbar.element()); this._contentClip = this.contentElement.createChild("div", "device-mode-content-clip vbox"); @@ -343,569 +343,6 @@ } /** - * @param {!WebInspector.DeviceModeModel} model - * @param {!WebInspector.Setting} showMediaInspectorSetting - * @param {!WebInspector.Setting} showRulersSetting - * @constructor - */ -WebInspector.DeviceModeView.Toolbar = function(model, showMediaInspectorSetting, showRulersSetting) -{ - this._model = model; - this._showMediaInspectorSetting = showMediaInspectorSetting; - this._showRulersSetting = showRulersSetting; - /** @type {!Map<!WebInspector.EmulatedDevice, !WebInspector.EmulatedDevice.Mode>} */ - this._lastMode = new Map(); - - this._element = createElementWithClass("div", "device-mode-toolbar"); - - var leftContainer = this._element.createChild("div", "device-mode-toolbar-spacer"); - leftContainer.createChild("div", "device-mode-toolbar-spacer"); - var leftToolbar = new WebInspector.Toolbar("", leftContainer); - leftToolbar.makeWrappable(); - this._fillLeftToolbar(leftToolbar); - - var mainToolbar = new WebInspector.Toolbar("", this._element); - mainToolbar.makeWrappable(); - this._fillMainToolbar(mainToolbar); - - var rightContainer = this._element.createChild("div", "device-mode-toolbar-spacer"); - var rightToolbar = new WebInspector.Toolbar("device-mode-toolbar-fixed-size", rightContainer); - rightToolbar.makeWrappable(); - this._fillRightToolbar(rightToolbar); - var modeToolbar = new WebInspector.Toolbar("device-mode-toolbar-fixed-size", rightContainer); - modeToolbar.makeWrappable(); - this._fillModeToolbar(modeToolbar); - rightContainer.createChild("div", "device-mode-toolbar-spacer"); - var optionsToolbar = new WebInspector.Toolbar("", rightContainer); - optionsToolbar.makeWrappable(true); - this._fillOptionsToolbar(optionsToolbar); - - WebInspector.emulatedDevicesList.addEventListener(WebInspector.EmulatedDevicesList.Events.CustomDevicesUpdated, this._deviceListChanged, this); - WebInspector.emulatedDevicesList.addEventListener(WebInspector.EmulatedDevicesList.Events.StandardDevicesUpdated, this._deviceListChanged, this); - - this._persistenceSetting = WebInspector.settings.createSetting("emulation.deviceModeValue", {device: "", orientation: "", mode: ""}); -} - -WebInspector.DeviceModeView.Toolbar.prototype = { - /** - * @param {!WebInspector.Toolbar} toolbar - */ - _fillLeftToolbar: function(toolbar) - { - toolbar.appendToolbarItem(this._wrapToolbarItem(createElementWithClass("div", "device-mode-empty-toolbar-element"))); - this._deviceSelectItem = new WebInspector.ToolbarMenuButton(this._appendDeviceMenuItems.bind(this)); - this._deviceSelectItem.setGlyph(""); - this._deviceSelectItem.turnIntoSelect(95); - toolbar.appendToolbarItem(this._deviceSelectItem); - }, - - /** - * @param {!WebInspector.Toolbar} toolbar - */ - _fillMainToolbar: function(toolbar) - { - var widthInput = createElementWithClass("input", "device-mode-size-input"); - widthInput.maxLength = 4; - widthInput.type = "text"; - widthInput.title = WebInspector.UIString("Width"); - this._updateWidthInput = this._bindInput(widthInput, this._model.setWidthAndScaleToFit.bind(this._model), WebInspector.DeviceModeModel.deviceSizeValidator); - this._widthInput = widthInput; - this._widthItem = this._wrapToolbarItem(widthInput); - toolbar.appendToolbarItem(this._widthItem); - - var xElement = createElementWithClass("div", "device-mode-x"); - xElement.textContent = "\u00D7"; - this._xItem = this._wrapToolbarItem(xElement); - toolbar.appendToolbarItem(this._xItem); - - var heightInput = createElementWithClass("input", "device-mode-size-input"); - heightInput.maxLength = 4; - heightInput.type = "text"; - heightInput.title = WebInspector.UIString("Height (leave empty for full)"); - this._updateHeightInput = this._bindInput(heightInput, this._model.setHeightAndScaleToFit.bind(this._model), validateHeight); - this._heightInput = heightInput; - this._heightItem = this._wrapToolbarItem(heightInput); - toolbar.appendToolbarItem(this._heightItem); - - /** - * @param {string} value - * @return {string} - */ - function validateHeight(value) - { - return !value ? "" : WebInspector.DeviceModeModel.deviceSizeValidator(value); - } - }, - - /** - * @param {!WebInspector.Toolbar} toolbar - */ - _fillRightToolbar: function(toolbar) - { - toolbar.appendToolbarItem(this._wrapToolbarItem(createElementWithClass("div", "device-mode-empty-toolbar-element"))); - this._scaleItem = new WebInspector.ToolbarMenuButton(this._appendScaleMenuItems.bind(this)); - this._scaleItem.setTitle(WebInspector.UIString("Zoom")); - this._scaleItem.setGlyph(""); - this._scaleItem.turnIntoSelect(); - toolbar.appendToolbarItem(this._scaleItem); - }, - - /** - * @param {!WebInspector.Toolbar} toolbar - */ - _fillModeToolbar: function(toolbar) - { - toolbar.appendToolbarItem(this._wrapToolbarItem(createElementWithClass("div", "device-mode-empty-toolbar-element"))); - this._modeButton = new WebInspector.ToolbarButton("", "rotate-screen-toolbar-item"); - this._modeButton.addEventListener("click", this._modeMenuClicked, this); - toolbar.appendToolbarItem(this._modeButton); - }, - - /** - * @param {!WebInspector.Toolbar} toolbar - */ - _fillOptionsToolbar: function(toolbar) - { - this._uaItem = new WebInspector.ToolbarText(); - this._uaItem.setVisible(false); - this._uaItem.setTitle(WebInspector.UIString("User agent type")); - toolbar.appendToolbarItem(this._uaItem); - - this._deviceScaleItem = new WebInspector.ToolbarText(); - this._deviceScaleItem.setVisible(false); - this._deviceScaleItem.setTitle(WebInspector.UIString("Device pixel ratio")); - toolbar.appendToolbarItem(this._deviceScaleItem); - - var moreOptionsButton = new WebInspector.ToolbarMenuButton(this._appendOptionsMenuItems.bind(this)); - moreOptionsButton.setTitle(WebInspector.UIString("More options")); - toolbar.appendToolbarItem(moreOptionsButton); - - toolbar.appendToolbarItem(this._wrapToolbarItem(createElementWithClass("div", "device-mode-empty-toolbar-element"))); - }, - - - /** - * @param {!Element} input - * @param {function(number)} apply - * @param {function(string):?string} validate - * @return {function(number)} - */ - _bindInput: function(input, apply, validate) - { - input.addEventListener("change", onChange, false); - input.addEventListener("input", onInput, false); - input.addEventListener("keydown", onKeyDown, false); - input.addEventListener("focus", input.select.bind(input), false); - - function onInput() - { - input.classList.toggle("error-input", !!validate(input.value)); - } - - function onChange() - { - var valid = !validate(input.value); - input.classList.toggle("error-input", !valid); - if (valid) - apply(input.value ? Number(input.value) : 0); - } - - /** - * @param {!Event} event - */ - function onKeyDown(event) - { - if (isEnterKey(event)) { - if (!validate(input.value)) - apply(input.value ? Number(input.value) : 0); - return; - } - - var increment = event.keyIdentifier === "Up" ? 1 : event.keyIdentifier === "Down" ? -1 : 0; - if (!increment) - return; - if (event.shiftKey) - increment *= 10; - - var value = input.value; - if (validate(value) || !value) - return; - - value = (value ? Number(value) : 0) + increment; - var stringValue = value ? String(value) : ""; - if (validate(stringValue) || !value) - return; - - input.value = stringValue; - apply(input.value ? Number(input.value) : 0); - event.preventDefault(); - } - - /** - * @param {number} value - */ - function setValue(value) - { - var stringValue = value ? String(value) : ""; - if (stringValue === input.value) - return; - var valid = !validate(stringValue); - input.classList.toggle("error-input", !valid); - input.value = stringValue; - input.setSelectionRange(stringValue.length, stringValue.length); - } - - return setValue; - }, - - /** - * @param {!WebInspector.ContextMenu} contextMenu - */ - _appendScaleMenuItems: function(contextMenu) - { - var scaleSetting = this._model.scaleSetting(); - if (this._model.type() === WebInspector.DeviceModeModel.Type.Device) { - contextMenu.appendItem(WebInspector.UIString("Fit to window (%.0f%%)", this._model.fitScale() * 100), scaleSetting.set.bind(scaleSetting, this._model.fitScale()), false); - contextMenu.appendSeparator(); - } - appendScaleItem(WebInspector.UIString("50%"), 0.5); - appendScaleItem(WebInspector.UIString("75%"), 0.75); - appendScaleItem(WebInspector.UIString("100%"), 1); - appendScaleItem(WebInspector.UIString("125%"), 1.25); - appendScaleItem(WebInspector.UIString("150%"), 1.5); - - /** - * @param {string} title - * @param {number} value - */ - function appendScaleItem(title, value) - { - contextMenu.appendCheckboxItem(title, scaleSetting.set.bind(scaleSetting, value), scaleSetting.get() === value, false); - } - }, - - /** - * @param {!WebInspector.ContextMenu} contextMenu - */ - _appendOptionsMenuItems: function(contextMenu) - { - var uaDisabled = this._model.type() !== WebInspector.DeviceModeModel.Type.Responsive; - var uaSetting = this._model.uaSetting(); - var uaSubmenu = contextMenu.appendSubMenuItem(WebInspector.UIString("User agent type"), false); - var uaValue = this._model.uaSetting().get(); - if (this._model.type() === WebInspector.DeviceModeModel.Type.None) - uaValue = WebInspector.DeviceModeModel.UA.Desktop; - if (this._model.type() === WebInspector.DeviceModeModel.Type.Device) - uaValue = this._model.device().mobile() ? WebInspector.DeviceModeModel.UA.Mobile : this._model.device().touch() ? WebInspector.DeviceModeModel.UA.DesktopTouch : WebInspector.DeviceModeModel.UA.Desktop; - appendUAItem(WebInspector.UIString("Mobile (default)"), WebInspector.DeviceModeModel.UA.Mobile); - appendUAItem(WebInspector.UIString("Desktop"), WebInspector.DeviceModeModel.UA.Desktop); - appendUAItem(WebInspector.UIString("Desktop with touch"), WebInspector.DeviceModeModel.UA.DesktopTouch); - - /** - * @param {string} title - * @param {!WebInspector.DeviceModeModel.UA} value - */ - function appendUAItem(title, value) - { - uaSubmenu.appendCheckboxItem(title, uaSetting.set.bind(uaSetting, value), uaValue === value, uaDisabled); - } - - var deviceScaleFactorDisabled = this._model.type() !== WebInspector.DeviceModeModel.Type.Responsive; - var deviceScaleFactorSubmenu = contextMenu.appendSubMenuItem(WebInspector.UIString("Device pixel ratio"), false); - var deviceScaleFactorSetting = this._model.deviceScaleFactorSetting(); - var deviceScaleFactorValue = deviceScaleFactorDisabled ? 0 : deviceScaleFactorSetting.get(); - appendDeviceScaleFactorItem(WebInspector.UIString("Default: %f", this._model.defaultDeviceScaleFactor()), 0); - deviceScaleFactorSubmenu.appendSeparator(); - appendDeviceScaleFactorItem(WebInspector.UIString("1"), 1); - appendDeviceScaleFactorItem(WebInspector.UIString("2"), 2); - appendDeviceScaleFactorItem(WebInspector.UIString("3"), 3); - - /** - * @param {string} title - * @param {number} value - */ - function appendDeviceScaleFactorItem(title, value) - { - deviceScaleFactorSubmenu.appendCheckboxItem(title, deviceScaleFactorSetting.set.bind(deviceScaleFactorSetting, value), deviceScaleFactorValue === value, deviceScaleFactorDisabled); - } - - contextMenu.appendItem(WebInspector.UIString("Reset to defaults"), this._model.reset.bind(this._model), this._model.type() !== WebInspector.DeviceModeModel.Type.Responsive); - contextMenu.appendSeparator(); - - contextMenu.appendCheckboxItem(WebInspector.UIString("Show media queries"), this._toggleMediaInspector.bind(this), this._showMediaInspectorSetting.get(), this._model.type() === WebInspector.DeviceModeModel.Type.None); - contextMenu.appendCheckboxItem(WebInspector.UIString("Show rulers"), this._toggleRulers.bind(this), this._showRulersSetting.get(), this._model.type() === WebInspector.DeviceModeModel.Type.None); - contextMenu.appendItem(WebInspector.UIString("Configure network\u2026"), this._openNetworkConfig.bind(this), false); - contextMenu.appendItemsAtLocation("deviceModeMenu"); - }, - - _toggleMediaInspector: function() - { - this._showMediaInspectorSetting.set(!this._showMediaInspectorSetting.get()); - }, - - _toggleRulers: function() - { - this._showRulersSetting.set(!this._showRulersSetting.get()); - }, - - _openNetworkConfig: function() - { - InspectorFrontendHost.bringToFront(); - // TODO(dgozman): make it explicit. - WebInspector.actionRegistry.action("network.show-config").execute(); - }, - - /** - * @param {!Element} element - * @return {!WebInspector.ToolbarItem} - */ - _wrapToolbarItem: function(element) - { - var container = createElement("div"); - var shadowRoot = WebInspector.createShadowRootWithCoreStyles(container, "emulation/deviceModeToolbar.css"); - shadowRoot.appendChild(element); - return new WebInspector.ToolbarItem(container); - }, - - /** - * @param {!WebInspector.EmulatedDevice} device - */ - _emulateDevice: function(device) - { - this._model.emulate(WebInspector.DeviceModeModel.Type.Device, device, this._lastMode.get(device) || device.modes[0]); - }, - - _switchToResponsive: function() - { - this._model.emulate(WebInspector.DeviceModeModel.Type.Responsive, null, null); - }, - - /** - * @param {!Array<!WebInspector.EmulatedDevice>} devices - * @return {!Array<!WebInspector.EmulatedDevice>} - */ - _filterDevices: function(devices) - { - devices = devices.filter(function(d) { return d.show(); }); - devices.sort(WebInspector.EmulatedDevice.deviceComparator); - return devices; - }, - - /** - * @return {!Array<!WebInspector.EmulatedDevice>} - */ - _standardDevices: function() - { - return this._filterDevices(WebInspector.emulatedDevicesList.standard()); - }, - - /** - * @return {!Array<!WebInspector.EmulatedDevice>} - */ - _customDevices: function() - { - return this._filterDevices(WebInspector.emulatedDevicesList.custom()); - }, - - /** - * @return {!Array<!WebInspector.EmulatedDevice>} - */ - _allDevices: function() - { - return this._standardDevices().concat(this._customDevices()); - }, - - /** - * @param {!WebInspector.ContextMenu} contextMenu - */ - _appendDeviceMenuItems: function(contextMenu) - { - contextMenu.appendCheckboxItem(WebInspector.UIString("Responsive"), this._switchToResponsive.bind(this), this._model.type() === WebInspector.DeviceModeModel.Type.Responsive, false); - appendGroup.call(this, this._standardDevices()); - appendGroup.call(this, this._customDevices()); - contextMenu.appendSeparator(); - contextMenu.appendItem(WebInspector.UIString("Edit\u2026"), WebInspector.emulatedDevicesList.revealCustomSetting.bind(WebInspector.emulatedDevicesList), false); - - /** - * @param {!Array<!WebInspector.EmulatedDevice>} devices - * @this {WebInspector.DeviceModeView.Toolbar} - */ - function appendGroup(devices) - { - if (!devices.length) - return; - contextMenu.appendSeparator(); - for (var device of devices) - contextMenu.appendCheckboxItem(device.title, this._emulateDevice.bind(this, device), this._model.device() === device, false); - } - }, - - /** - * @this {WebInspector.DeviceModeView.Toolbar} - */ - _deviceListChanged: function() - { - if (!this._model.device()) - return; - - var devices = this._allDevices(); - if (devices.indexOf(this._model.device()) === -1) - this._emulateDevice(devices[0] || WebInspector.emulatedDevicesList.standard()[0]); - }, - - /** - * @param {!WebInspector.Event} event - */ - _modeMenuClicked: function(event) - { - var device = this._model.device(); - var model = this._model; - - if (device.modes.length === 2 && device.modes[0].orientation !== device.modes[1].orientation) { - model.emulate(model.type(), model.device(), model.mode() === device.modes[0] ? device.modes[1] : device.modes[0]); - return; - } - - var contextMenu = new WebInspector.ContextMenu(/** @type {!Event} */ (event.data), - false, - event.target.element.totalOffsetLeft(), - event.target.element.totalOffsetTop() + event.target.element.offsetHeight); - addOrientation(WebInspector.EmulatedDevice.Vertical, WebInspector.UIString("Portrait")); - addOrientation(WebInspector.EmulatedDevice.Horizontal, WebInspector.UIString("Landscape")); - contextMenu.show(); - - /** - * @param {string} orientation - * @param {string} title - */ - function addOrientation(orientation, title) - { - var modes = device.modesForOrientation(orientation); - if (!modes.length) - return; - if (modes.length === 1) { - addMode(modes[0], title); - } else { - for (var index = 0; index < modes.length; index++) - addMode(modes[index], title + " \u2013 " + modes[index].title); - } - } - - /** - * @param {!WebInspector.EmulatedDevice.Mode} mode - * @param {string} title - */ - function addMode(mode, title) - { - contextMenu.appendCheckboxItem(title, applyMode.bind(null, mode), model.mode() === mode, false); - } - - /** - * @param {!WebInspector.EmulatedDevice.Mode} mode - */ - function applyMode(mode) - { - model.emulate(model.type(), model.device(), mode); - } - }, - - /** - * @return {!Element} - */ - element: function() - { - return this._element; - }, - - update: function() - { - if (this._model.type() !== this._cachedModelType) { - this._cachedModelType = this._model.type(); - this._widthInput.disabled = this._model.type() !== WebInspector.DeviceModeModel.Type.Responsive; - this._heightInput.disabled = this._model.type() !== WebInspector.DeviceModeModel.Type.Responsive; - } - - var size = this._model.appliedDeviceSize(); - this._updateHeightInput(this._model.type() === WebInspector.DeviceModeModel.Type.Responsive && this._model.isFullHeight() ? 0 : size.height); - this._updateWidthInput(size.width); - this._heightInput.placeholder = size.height; - - if (this._model.scale() !== this._cachedScale) { - this._scaleItem.setText(WebInspector.UIString("%.0f%%", this._model.scale() * 100)); - this._scaleItem.setState(this._model.scale() === 1 ? "off" : "on"); - this._cachedScale = this._model.scale(); - } - - var deviceScale = this._model.deviceScaleFactorSetting().get(); - this._deviceScaleItem.setVisible(this._model.type() === WebInspector.DeviceModeModel.Type.Responsive && !!deviceScale); - if (deviceScale !== this._cachedDeviceScale) { - this._deviceScaleItem.setText(WebInspector.UIString("DPR: %.1f", deviceScale)); - this._cachedDeviceScale = deviceScale; - } - - var uaType = this._model.type() === WebInspector.DeviceModeModel.Type.Responsive ? this._model.uaSetting().get() : WebInspector.DeviceModeModel.UA.Mobile; - this._uaItem.setVisible(this._model.type() === WebInspector.DeviceModeModel.Type.Responsive && uaType !== WebInspector.DeviceModeModel.UA.Mobile); - if (uaType !== this._cachedUaType) { - this._uaItem.setText(uaType === WebInspector.DeviceModeModel.UA.Desktop ? WebInspector.UIString("Desktop") : WebInspector.UIString("Touch")); - this._cachedUaType = uaType; - } - - var deviceItemTitle = WebInspector.UIString("None"); - if (this._model.type() === WebInspector.DeviceModeModel.Type.Responsive) - deviceItemTitle = WebInspector.UIString("Responsive"); - if (this._model.type() === WebInspector.DeviceModeModel.Type.Device) - deviceItemTitle = this._model.device().title; - this._deviceSelectItem.setText(deviceItemTitle); - - if (this._model.device() !== this._cachedModelDevice) { - var device = this._model.device(); - this._modeButton.setVisible(!!device); - if (device) { - var modeCount = device ? device.modes.length : 0; - this._modeButton.setEnabled(modeCount >= 2); - this._modeButton.setTitle(modeCount === 2 ? WebInspector.UIString("Rotate") : WebInspector.UIString("Screen options")); - } - this._cachedModelDevice = device; - } - - if (this._model.type() === WebInspector.DeviceModeModel.Type.Device) - this._lastMode.set(/** @type {!WebInspector.EmulatedDevice} */ (this._model.device()), /** @type {!WebInspector.EmulatedDevice.Mode} */ (this._model.mode())); - - if (this._model.mode() !== this._cachedModelMode && this._model.type() !== WebInspector.DeviceModeModel.Type.None) { - this._cachedModelMode = this._model.mode(); - var value = this._persistenceSetting.get(); - if (this._model.device()) { - value.device = this._model.device().title; - value.orientation = this._model.mode() ? this._model.mode().orientation : ""; - value.mode = this._model.mode() ? this._model.mode().title : ""; - } else { - value.device = ""; - value.orientation = ""; - value.mode = ""; - } - this._persistenceSetting.set(value); - } - }, - - restore: function() - { - for (var device of this._allDevices()) { - if (device.title === this._persistenceSetting.get().device) { - for (var mode of device.modes) { - if (mode.orientation === this._persistenceSetting.get().orientation && mode.title === this._persistenceSetting.get().mode) { - this._lastMode.set(device, mode); - this._emulateDevice(device); - return; - } - } - } - } - - this._model.emulate(WebInspector.DeviceModeModel.Type.Responsive, null, null); - } -} - -/** * @constructor * @extends {WebInspector.VBox} * @param {boolean} horizontal @@ -1012,97 +449,3 @@ __proto__: WebInspector.VBox.prototype } - - -/** - * @constructor - * @implements {WebInspector.ActionDelegate} - */ -WebInspector.DeviceModeView.ActionDelegate = function() -{ -} - -WebInspector.DeviceModeView.ActionDelegate.prototype = { - /** - * @override - * @param {!WebInspector.Context} context - * @param {string} actionId - * @return {boolean} - */ - handleAction: function(context, actionId) - { - if (WebInspector.DeviceModeView._wrapperInstance) { - if (actionId === "emulation.toggle-device-mode") { - WebInspector.DeviceModeView._wrapperInstance._toggleDeviceMode(); - return true; - } - if (actionId === "emulation.request-app-banner") { - WebInspector.DeviceModeView._wrapperInstance._requestAppBanner(); - return true; - } - } - return false; - } -} - - -/** - * @extends {WebInspector.VBox} - * @param {!WebInspector.InspectedPagePlaceholder} inspectedPagePlaceholder - * @constructor - */ -WebInspector.DeviceModeView.Wrapper = function(inspectedPagePlaceholder) -{ - WebInspector.VBox.call(this); - WebInspector.DeviceModeView._wrapperInstance = this; - this._inspectedPagePlaceholder = inspectedPagePlaceholder; - /** @type {?WebInspector.DeviceModeView} */ - this._deviceModeView = null; - this._toggleDeviceModeAction = WebInspector.actionRegistry.action("emulation.toggle-device-mode"); - this._showDeviceModeSetting = WebInspector.settings.createSetting("emulation.showDeviceMode", false); - this._showDeviceModeSetting.addChangeListener(this._update.bind(this, false)); - this._update(true); -} - -/** @type {!WebInspector.DeviceModeView.Wrapper} */ -WebInspector.DeviceModeView._wrapperInstance; - -WebInspector.DeviceModeView.Wrapper.prototype = { - _toggleDeviceMode: function() - { - this._showDeviceModeSetting.set(!this._showDeviceModeSetting.get()); - }, - - /** - * @param {boolean} force - */ - _update: function(force) - { - this._toggleDeviceModeAction.setToggled(this._showDeviceModeSetting.get()); - if (!force) { - var showing = this._deviceModeView && this._deviceModeView.isShowing(); - if (this._showDeviceModeSetting.get() === showing) - return; - } - - if (this._showDeviceModeSetting.get()) { - if (!this._deviceModeView) - this._deviceModeView = new WebInspector.DeviceModeView(); - this._deviceModeView.show(this.element); - this._inspectedPagePlaceholder.clearMinimumSizeAndMargins(); - this._inspectedPagePlaceholder.show(this._deviceModeView.element); - } else { - if (this._deviceModeView) - this._deviceModeView.detach(); - this._inspectedPagePlaceholder.restoreMinimumSizeAndMargins(); - this._inspectedPagePlaceholder.show(this.element); - } - }, - - _requestAppBanner: function() - { - this._deviceModeView._model.requestAppBanner(); - }, - - __proto__: WebInspector.VBox.prototype -}
diff --git a/third_party/WebKit/Source/devtools/front_end/emulation/DeviceModeWrapper.js b/third_party/WebKit/Source/devtools/front_end/emulation/DeviceModeWrapper.js new file mode 100644 index 0000000..51515cc --- /dev/null +++ b/third_party/WebKit/Source/devtools/front_end/emulation/DeviceModeWrapper.js
@@ -0,0 +1,92 @@ +// 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. + +/** + * @extends {WebInspector.VBox} + * @param {!WebInspector.InspectedPagePlaceholder} inspectedPagePlaceholder + * @constructor + */ +WebInspector.DeviceModeWrapper = function(inspectedPagePlaceholder) +{ + WebInspector.VBox.call(this); + WebInspector.DeviceModeView._wrapperInstance = this; + this._inspectedPagePlaceholder = inspectedPagePlaceholder; + /** @type {?WebInspector.DeviceModeView} */ + this._deviceModeView = null; + this._toggleDeviceModeAction = WebInspector.actionRegistry.action("emulation.toggle-device-mode"); + this._showDeviceModeSetting = WebInspector.settings.createSetting("emulation.showDeviceMode", false); + this._showDeviceModeSetting.addChangeListener(this._update.bind(this, false)); + this._update(true); +} + +/** @type {!WebInspector.DeviceModeWrapper} */ +WebInspector.DeviceModeView._wrapperInstance; + +WebInspector.DeviceModeWrapper.prototype = { + _toggleDeviceMode: function() + { + this._showDeviceModeSetting.set(!this._showDeviceModeSetting.get()); + }, + + /** + * @param {boolean} force + */ + _update: function(force) + { + this._toggleDeviceModeAction.setToggled(this._showDeviceModeSetting.get()); + if (!force) { + var showing = this._deviceModeView && this._deviceModeView.isShowing(); + if (this._showDeviceModeSetting.get() === showing) + return; + } + + if (this._showDeviceModeSetting.get()) { + if (!this._deviceModeView) + this._deviceModeView = new WebInspector.DeviceModeView(); + this._deviceModeView.show(this.element); + this._inspectedPagePlaceholder.clearMinimumSizeAndMargins(); + this._inspectedPagePlaceholder.show(this._deviceModeView.element); + } else { + if (this._deviceModeView) + this._deviceModeView.detach(); + this._inspectedPagePlaceholder.restoreMinimumSizeAndMargins(); + this._inspectedPagePlaceholder.show(this.element); + } + }, + + __proto__: WebInspector.VBox.prototype +} + +/** + * @constructor + * @implements {WebInspector.ActionDelegate} + */ +WebInspector.DeviceModeWrapper.ActionDelegate = function() +{ +} + +WebInspector.DeviceModeWrapper.ActionDelegate.prototype = { + /** + * @override + * @param {!WebInspector.Context} context + * @param {string} actionId + * @return {boolean} + */ + handleAction: function(context, actionId) + { + if (WebInspector.DeviceModeView._wrapperInstance) { + if (actionId === "emulation.toggle-device-mode") { + WebInspector.DeviceModeView._wrapperInstance._toggleDeviceMode(); + return true; + } + if (actionId === "emulation.request-app-banner") { + var target = WebInspector.targetManager.mainTarget(); + if (target && target.isPage()) + target.pageAgent().requestAppBanner(); + return true; + } + } + return false; + } +}
diff --git a/third_party/WebKit/Source/devtools/front_end/emulation/module.json b/third_party/WebKit/Source/devtools/front_end/emulation/module.json index 8e958ad3..2962b8a2 100644 --- a/third_party/WebKit/Source/devtools/front_end/emulation/module.json +++ b/third_party/WebKit/Source/devtools/front_end/emulation/module.json
@@ -3,7 +3,7 @@ { "type": "@WebInspector.ActionDelegate", "actionId": "emulation.toggle-device-mode", - "className": "WebInspector.DeviceModeView.ActionDelegate", + "className": "WebInspector.DeviceModeWrapper.ActionDelegate", "condition": "can_dock", "title": "Toggle device mode", "iconClass": "phone-toolbar-item", @@ -59,12 +59,13 @@ { "type": "@WebInspector.ActionDelegate", "actionId": "emulation.request-app-banner", - "className": "WebInspector.DeviceModeView.ActionDelegate", - "title": "Request app banner" + "className": "WebInspector.DeviceModeWrapper.ActionDelegate", + "title": "Request app banner\u2026" }, { "type": "context-menu-item", "location": "deviceModeMenu/tools", + "experiment": "appBanner", "order": 10, "actionId": "emulation.request-app-banner" } @@ -84,7 +85,9 @@ "MediaQueryInspector.js", "SensorsView.js", "DeviceModeModel.js", - "DeviceModeView.js" + "DeviceModeToolbar.js", + "DeviceModeView.js", + "DeviceModeWrapper.js" ], "resources": [ "devicesSettingsTab.css",
diff --git a/third_party/WebKit/Source/devtools/front_end/main/AdvancedApp.js b/third_party/WebKit/Source/devtools/front_end/main/AdvancedApp.js index 0d83416..58e9b54 100644 --- a/third_party/WebKit/Source/devtools/front_end/main/AdvancedApp.js +++ b/third_party/WebKit/Source/devtools/front_end/main/AdvancedApp.js
@@ -28,7 +28,7 @@ this._inspectedPagePlaceholder = new WebInspector.InspectedPagePlaceholder(); this._inspectedPagePlaceholder.addEventListener(WebInspector.InspectedPagePlaceholder.Events.Update, this._onSetInspectedPageBounds.bind(this), this); - this._deviceModeView = new WebInspector.DeviceModeView.Wrapper(this._inspectedPagePlaceholder); + this._deviceModeView = new WebInspector.DeviceModeWrapper(this._inspectedPagePlaceholder); WebInspector.dockController.addEventListener(WebInspector.DockController.Events.BeforeDockSideChanged, this._onBeforeDockSideChange, this); WebInspector.dockController.addEventListener(WebInspector.DockController.Events.DockSideChanged, this._onDockSideChange, this);
diff --git a/third_party/WebKit/Source/devtools/front_end/main/Main.js b/third_party/WebKit/Source/devtools/front_end/main/Main.js index ce3ec7c..d540e2e 100644 --- a/third_party/WebKit/Source/devtools/front_end/main/Main.js +++ b/third_party/WebKit/Source/devtools/front_end/main/Main.js
@@ -104,6 +104,7 @@ { Runtime.experiments.register("accessibilityInspection", "Accessibility Inspection"); Runtime.experiments.register("applyCustomStylesheet", "Allow custom UI themes"); + Runtime.experiments.register("appBanner", "App banner support", true); Runtime.experiments.register("blackboxJSFramesOnTimeline", "Blackbox JavaScript frames on Timeline", true); Runtime.experiments.register("colorContrastRatio", "Contrast ratio line in color picker", true); Runtime.experiments.register("cpuThrottling", "CPU throttling", true);
diff --git a/third_party/WebKit/Source/devtools/front_end/sass/SASSLiveSourceMap.js b/third_party/WebKit/Source/devtools/front_end/sass/SASSLiveSourceMap.js index 9cf0c45..6c49db3c 100644 --- a/third_party/WebKit/Source/devtools/front_end/sass/SASSLiveSourceMap.js +++ b/third_party/WebKit/Source/devtools/front_end/sass/SASSLiveSourceMap.js
@@ -5,10 +5,41 @@ WebInspector.SASSLiveSourceMap = {} /** - * @constructor + * @param {!WebInspector.SourceMapTracker} tracker + * @param {!WebInspector.CSSParser} cssParser + * @param {!WebInspector.TokenizerFactory} tokenizer + * @return {!Promise<?WebInspector.SASSLiveSourceMap.CSSToSASSMapping>} */ -WebInspector.SASSLiveSourceMap.CSSToSASSMapping = function() +WebInspector.SASSLiveSourceMap._loadMapping = function(tracker, cssParser, tokenizer) { + var sassModels = new Map(); + var cssAST = null; + var promises = []; + for (var url of tracker.sassURLs()) { + var sassPromise = tracker.content(url) + .then(text => WebInspector.SASSSupport.parseSCSS(url, text, tokenizer)) + .then(ast => sassModels.set(url, ast)); + promises.push(sassPromise); + } + var cssPromise = tracker.content(tracker.cssURL()) + .then(text => WebInspector.SASSSupport.parseCSS(cssParser, tracker.cssURL(), text)) + .then(ast => cssAST = ast); + promises.push(cssPromise); + + return Promise.all(promises) + .then(() => WebInspector.SASSLiveSourceMap.CSSToSASSMapping.fromSourceMap(tracker.sourceMap(), cssAST, sassModels)) + .catchException(/** @type {?WebInspector.SASSLiveSourceMap.CSSToSASSMapping} */(null)); +} + +/** + * @constructor + * @param {!WebInspector.SASSSupport.AST} cssAST + * @param {!Map<string, !WebInspector.SASSSupport.AST>} sassModels + */ +WebInspector.SASSLiveSourceMap.CSSToSASSMapping = function(cssAST, sassModels) +{ + this._cssAST = cssAST; + this._sassModels = sassModels; /** @type {!Map<!WebInspector.SASSSupport.TextNode, !WebInspector.SASSSupport.TextNode>} */ this._cssToSass = new Map(); /** @type {!Multimap<!WebInspector.SASSSupport.TextNode, !WebInspector.SASSSupport.TextNode>} */ @@ -23,7 +54,7 @@ */ WebInspector.SASSLiveSourceMap.CSSToSASSMapping.fromSourceMap = function(sourceMap, cssAST, sassModels) { - var mapping = new WebInspector.SASSLiveSourceMap.CSSToSASSMapping(); + var mapping = new WebInspector.SASSLiveSourceMap.CSSToSASSMapping(cssAST, sassModels); //FIXME: this works O(N^2). cssAST.visit(map); return mapping; @@ -49,6 +80,22 @@ WebInspector.SASSLiveSourceMap.CSSToSASSMapping.prototype = { /** + * @return {!WebInspector.SASSSupport.AST} + */ + cssAST: function() + { + return this._cssAST; + }, + + /** + * @return {!Map<string, !WebInspector.SASSSupport.AST>} + */ + sassModels: function() + { + return this._sassModels; + }, + + /** * @param {!WebInspector.SASSSupport.TextNode} css * @param {!WebInspector.SASSSupport.TextNode} sass */ @@ -112,7 +159,7 @@ */ rebaseForCSSDiff: function(cssDiff) { - var newMapping = new WebInspector.SASSLiveSourceMap.CSSToSASSMapping(); + var newMapping = new WebInspector.SASSLiveSourceMap.CSSToSASSMapping(cssDiff.newAST, this._sassModels); var cssNodes = this._cssToSass.keysArray(); for (var i = 0; i < cssNodes.length; ++i) { var cssNode = cssNodes[i]; @@ -130,7 +177,9 @@ */ rebaseForSASSDiff: function(sassDiff) { - var newMapping = new WebInspector.SASSLiveSourceMap.CSSToSASSMapping(); + var sassModels = new Map(this._sassModels); + sassModels.set(sassDiff.url, sassDiff.newAST); + var newMapping = new WebInspector.SASSLiveSourceMap.CSSToSASSMapping(this._cssAST, sassModels); var cssNodes = this._cssToSass.keysArray(); for (var i = 0; i < cssNodes.length; ++i) { var cssNode = cssNodes[i];
diff --git a/third_party/WebKit/Source/devtools/front_end/sass/SASSSupport.js b/third_party/WebKit/Source/devtools/front_end/sass/SASSSupport.js index c810de0..0ed1943 100644 --- a/third_party/WebKit/Source/devtools/front_end/sass/SASSSupport.js +++ b/third_party/WebKit/Source/devtools/front_end/sass/SASSSupport.js
@@ -594,14 +594,18 @@ /** * @constructor * @param {string} url + * @param {!WebInspector.SASSSupport.AST} oldAST + * @param {!WebInspector.SASSSupport.AST} newAST * @param {!Map<!WebInspector.SASSSupport.TextNode, !WebInspector.SASSSupport.TextNode>} mapping * @param {!Array<!WebInspector.SASSSupport.PropertyChange>} changes */ -WebInspector.SASSSupport.ASTDiff = function(url, mapping, changes) +WebInspector.SASSSupport.ASTDiff = function(url, oldAST, newAST, mapping, changes) { this.url = url; this.mapping = mapping; this.changes = changes; + this.oldAST = oldAST; + this.newAST = newAST; } /** @@ -622,7 +626,7 @@ var newRule = newAST.rules[i]; computeRuleDiff(mapping, oldRule, newRule); } - return new WebInspector.SASSSupport.ASTDiff(oldAST.document.url, mapping, changes); + return new WebInspector.SASSSupport.ASTDiff(oldAST.document.url, oldAST, newAST, mapping, changes); /** * @param {!WebInspector.SASSSupport.PropertyChangeType} type
diff --git a/third_party/WebKit/Source/devtools/front_end/sass/SASSWorkspaceAdapter.js b/third_party/WebKit/Source/devtools/front_end/sass/SASSWorkspaceAdapter.js new file mode 100644 index 0000000..5dc3292 --- /dev/null +++ b/third_party/WebKit/Source/devtools/front_end/sass/SASSWorkspaceAdapter.js
@@ -0,0 +1,461 @@ +// 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. + +/** + * @constructor + * @param {!WebInspector.CSSStyleModel} cssModel + * @param {!WebInspector.Workspace} workspace + * @param {!WebInspector.NetworkMapping} networkMapping + */ +WebInspector.SASSWorkspaceAdapter = function(cssModel, workspace, networkMapping) +{ + this._workspace = workspace; + this._networkMapping = networkMapping; + this._cssModel = cssModel; + + /** @type {!Map<string, number>} */ + this._versions = new Map(); + /** @type {!Map<string, !Promise<boolean>>} */ + this._awaitingPromises = new Map(); + /** @type {!Map<string, function(boolean)>} */ + this._awaitingFulfills = new Map(); + + /** @type {!Multimap<string, !WebInspector.SourceMapTracker>} */ + this._urlToTrackers = new Multimap(); + /** @type {!Set<string>} */ + this._cssURLs = new Set(); + + this._eventListeners = [ + this._workspace.addEventListener(WebInspector.Workspace.Events.UISourceCodeAdded, this._uiSourceCodeAdded, this), + this._workspace.addEventListener(WebInspector.Workspace.Events.UISourceCodeRemoved, this._uiSourceCodeRemoved, this), + this._workspace.addEventListener(WebInspector.Workspace.Events.WorkingCopyChanged, this._uiSourceCodeChanged, this), + this._workspace.addEventListener(WebInspector.Workspace.Events.WorkingCopyCommitted, this._uiSourceCodeChanged, this), + this._cssModel.addEventListener(WebInspector.CSSStyleModel.Events.StyleSheetAdded, this._styleSheetAdded, this), + this._cssModel.addEventListener(WebInspector.CSSStyleModel.Events.StyleSheetRemoved, this._styleSheetRemoved, this), + this._cssModel.addEventListener(WebInspector.CSSStyleModel.Events.StyleSheetChanged, this._styleSheetChanged, this) + ]; +} + +/** + * @constructor + * @param {string} url + * @param {number} version + * @param {string} text + */ +WebInspector.SASSWorkspaceAdapter.ContentResponse = function(url, version, text) +{ + this.url = url; + this.version = version; + this.text = text; +} + +WebInspector.SASSWorkspaceAdapter.prototype = { + /** + * @param {!WebInspector.SourceMap} sourceMap + * @return {!WebInspector.SourceMapTracker} + */ + trackSources: function(sourceMap) + { + var cssURL = sourceMap.compiledURL(); + this._cssURLs.add(cssURL); + + var allSources = new Set(sourceMap.sources().concat(cssURL)); + for (var sourceURL of allSources) { + if (this._versions.has(sourceURL)) + continue; + this._versions.set(sourceURL, 1); + var promise = new Promise(fulfill => this._awaitingFulfills.set(sourceURL, fulfill)); + this._awaitingPromises.set(sourceURL, promise); + var contentProvider = sourceURL === cssURL ? this._headersForURL(sourceURL).peekLast() : this._sassUISourceCode(sourceURL); + if (contentProvider) + this._contentProviderAdded(sourceURL); + } + + var tracker = new WebInspector.SourceMapTracker(this, sourceMap); + for (var sourceURL of tracker.allURLs()) + this._urlToTrackers.set(sourceURL, tracker); + return tracker; + }, + + /** + * @param {!WebInspector.SourceMapTracker} tracker + */ + _stopTrackSources: function(tracker) + { + for (var sourceURL of tracker.allURLs()) { + this._urlToTrackers.remove(sourceURL, tracker); + if (!this._urlToTrackers.has(sourceURL)) { + this._awaitingFulfills.get(sourceURL).call(null, false); + this._awaitingFulfills.delete(sourceURL); + this._awaitingPromises.delete(sourceURL); + this._versions.delete(sourceURL); + this._cssURLs.delete(sourceURL); + } + } + }, + + /** + * @param {string} url + * @return {?WebInspector.UISourceCode} + */ + _sassUISourceCode: function(url) + { + return this._networkMapping.uiSourceCodeForURLForAnyTarget(url); + }, + + /** + * @param {string} url + * @return {!Array<!WebInspector.CSSStyleSheetHeader>} + */ + _headersForURL: function(url) + { + return this._cssModel.styleSheetIdsForURL(url) + .map(styleSheetId => this._cssModel.styleSheetHeaderForId(styleSheetId)); + }, + + /** + * @param {string} url + */ + _contentProviderAdded: function(url) + { + this._awaitingFulfills.get(url).call(null, true); + }, + + /** + * @param {string} url + */ + _contentProviderRemoved: function(url) + { + var trackers = new Set(this._urlToTrackers.get(url)); + for (var tracker of trackers) + tracker.dispose(); + }, + + /** + * @param {string} url + * @return {boolean} + */ + _isSASSURL: function(url) + { + return this._versions.has(url) && !this._cssURLs.has(url); + }, + + /** + * @param {!WebInspector.Event} event + */ + _uiSourceCodeAdded: function(event) + { + var uiSourceCode = /** @type {!WebInspector.UISourceCode} */(event.data); + var url = this._networkMapping.networkURL(uiSourceCode); + if (!this._isSASSURL(url)) + return; + this._contentProviderAdded(url); + }, + + /** + * @param {!WebInspector.Event} event + */ + _uiSourceCodeRemoved: function(event) + { + var uiSourceCode = /** @type {!WebInspector.UISourceCode} */(event.data); + var url = this._networkMapping.networkURL(uiSourceCode); + if (!this._isSASSURL(url)) + return; + this._contentProviderRemoved(url); + }, + + /** + * @param {!WebInspector.Event} event + */ + _styleSheetAdded: function(event) + { + var styleSheetHeader = /** @type {!WebInspector.CSSStyleSheetHeader} */(event.data); + var url = styleSheetHeader.sourceURL; + if (!this._cssURLs.has(url)) + return; + this._contentProviderAdded(url); + }, + + /** + * @param {!WebInspector.Event} event + */ + _styleSheetRemoved: function(event) + { + var styleSheetHeader = /** @type {!WebInspector.CSSStyleSheetHeader} */(event.data); + var url = styleSheetHeader.sourceURL; + if (!this._cssURLs.has(url)) + return; + var headers = this._headersForURL(url); + if (headers.length) + return; + this._contentProviderRemoved(url); + }, + + /** + * @param {!WebInspector.Event} event + */ + _uiSourceCodeChanged: function(event) + { + var uiSourceCode = /** @type {!WebInspector.UISourceCode} */(event.data.uiSourceCode); + var url = this._networkMapping.networkURL(uiSourceCode); + if (!this._isSASSURL(url)) + return; + this._newContentAvailable(url); + }, + + /** + * @param {!WebInspector.Event} event + */ + _styleSheetChanged: function(event) + { + var styleSheetId = /** @type {!CSSAgent.StyleSheetId} */(event.data.styleSheetId); + var styleSheetHeader = this._cssModel.styleSheetHeaderForId(styleSheetId); + var url = styleSheetHeader.sourceURL; + if (!this._cssURLs.has(url)) + return; + this._newContentAvailable(url); + }, + + /** + * @param {string} url + */ + _newContentAvailable: function(url) + { + console.assert(this._versions.has(url), "The '" + url + "' is not tracked.") + var newVersion = this._versions.get(url) + 1; + this._versions.set(url, newVersion); + for (var tracker of this._urlToTrackers.get(url)) + tracker._newContentAvailable(url, newVersion); + }, + + /** + * @param {string} url + * @return {number} + */ + _urlVersion: function(url) + { + var version = this._versions.get(url); + console.assert(version, "The '" + url + "' is not tracked.") + return version || 0; + }, + + /** + * @param {string} url + * @return {!Promise<?WebInspector.SASSWorkspaceAdapter.ContentResponse>} + */ + _getContent: function(url) + { + console.assert(this._awaitingPromises.has(url), "The '" + url + "' is not tracked.") + return this._awaitingPromises.get(url) + .then(onContentProviderResolved.bind(this)); + + /** + * @param {boolean} success + * @return {!Promise<?WebInspector.SASSWorkspaceAdapter.ContentResponse>} + * @this {WebInspector.SASSWorkspaceAdapter} + */ + function onContentProviderResolved(success) + { + if (!success) + return Promise.resolve(/** @type {?WebInspector.SASSWorkspaceAdapter.ContentResponse} */(null)); + var contentProvider = this._cssURLs.has(url) ? this._headersForURL(url).peekLast() : this._sassUISourceCode(url); + if (!contentProvider) + return Promise.resolve(/** @type {?WebInspector.SASSWorkspaceAdapter.ContentResponse} */(null)); + return contentProvider.requestContent() + .then(text => new WebInspector.SASSWorkspaceAdapter.ContentResponse(url, /** @type {number} */(this._versions.get(url)), text || "")); + } + }, + + /** + * @param {string} url + * @param {string} text + * @return {?WebInspector.SASSWorkspaceAdapter.ContentResponse} + */ + _setSASSText: function(url, text) + { + console.assert(this._isSASSURL(url), "The url '" + url + "' should be a tracked SASS url"); + var uiSourceCode = this._sassUISourceCode(url); + if (!uiSourceCode) + return null; + setImmediate(() => uiSourceCode.addRevision(text)); + var futureVersion = this._versions.get(url) + 1; + return new WebInspector.SASSWorkspaceAdapter.ContentResponse(url, futureVersion, text); + }, + + /** + * @param {string} url + * @param {string} text + * @param {!Array<!WebInspector.SourceEdit>} cssEdits + * @return {?WebInspector.SASSWorkspaceAdapter.ContentResponse} + */ + _setCSSText: function(url, text, cssEdits) + { + console.assert(this._cssURLs.has(url), "The url '" + url + "' should be a tracked CSS url"); + var headers = this._headersForURL(url); + if (!headers.length) + return null; + for (var i = 0; i < headers.length; ++i) + this._cssModel.setStyleSheetText(headers[i].id, text, true); + for (var i = cssEdits.length - 1; i >= 0; --i) { + var edit = cssEdits[i]; + var oldRange = edit.oldRange; + var newRange = edit.newRange(); + for (var j = 0; j < headers.length; ++j) { + this._cssModel.dispatchEventToListeners(WebInspector.CSSStyleModel.Events.ExternalRangeEdit, { + styleSheetId: headers[j].id, + oldRange: oldRange, + newRange: newRange + }); + } + } + var futureVersion = this._versions.get(url) + headers.length; + return new WebInspector.SASSWorkspaceAdapter.ContentResponse(url, futureVersion, text); + } +} + +/** + * @constructor + * @extends {WebInspector.Object} + * @param {!WebInspector.SASSWorkspaceAdapter} adapter + * @param {!WebInspector.SourceMap} sourceMap + */ +WebInspector.SourceMapTracker = function(adapter, sourceMap) +{ + WebInspector.Object.call(this); + this._adapter = adapter; + this._sourceMap = sourceMap; + this._cssURL = sourceMap.compiledURL(); + this._sassURLs = sourceMap.sources().slice(); + this._allURLs = this._sassURLs.concat(this._cssURL); + this._terminated = false; + this._versions = new Map(); + for (var url of this._allURLs) + this._versions.set(url, adapter._urlVersion(url)); +} + +/** @enum {string} */ +WebInspector.SourceMapTracker.Events = { + SourceChanged: "SourceChanged", + TrackingStopped: "TrackingStopped" +} + +WebInspector.SourceMapTracker.prototype = { + /** + * @return {!WebInspector.SourceMap} + */ + sourceMap: function() + { + return this._sourceMap; + }, + + /** + * @return {!Array<string>} + */ + allURLs: function() + { + return this._allURLs; + }, + + /** + * @return {string} + */ + cssURL: function() + { + return this._cssURL; + }, + + /** + * @return {!Array<string>} + */ + sassURLs: function() + { + return this._sassURLs; + }, + + /** + * @return {boolean} + */ + isOutdated: function() + { + if (this._terminated) + return true; + for (var url of this._allURLs) { + if (this._adapter._urlVersion(url) > this._versions.get(url)) + return true; + } + return false; + }, + + /** + * @param {string} text + * @param {!Array<!WebInspector.SourceEdit>} edits + * @return {boolean} + */ + setCSSText: function(text, edits) + { + if (this._terminated || this.isOutdated()) + return false; + var result = this._adapter._setCSSText(this._cssURL, text, edits); + this._handleContentResponse(result); + return !!result; + }, + + /** + * @param {string} url + * @param {string} text + * @return {boolean} + */ + setSASSText: function(url, text) + { + if (this._terminated || this.isOutdated()) + return false; + var result = this._adapter._setSASSText(url, text); + this._handleContentResponse(result); + return !!result; + }, + + /** + * @param {?WebInspector.SASSWorkspaceAdapter.ContentResponse} contentResponse + * @return {?string} + */ + _handleContentResponse: function(contentResponse) + { + if (!contentResponse) + return null; + this._versions.set(contentResponse.url, contentResponse.version); + return contentResponse.text; + }, + + /** + * @param {string} url + * @return {!Promise<string>} + */ + content: function(url) + { + return this._adapter._getContent(url) + .then(this._handleContentResponse.bind(this)) + .then(text => text || ""); + }, + + dispose: function() + { + if (this._terminated) + return; + this._terminated = true; + this._adapter._stopTrackSources(this); + this.dispatchEventToListeners(WebInspector.SourceMapTracker.Events.TrackingStopped); + }, + + /** + * @param {string} url + * @param {number} newVersion + */ + _newContentAvailable: function(url, newVersion) + { + if (this._versions.get(url) < newVersion) + this.dispatchEventToListeners(WebInspector.SourceMapTracker.Events.SourceChanged, url); + }, + + __proto__: WebInspector.Object.prototype +}
diff --git a/third_party/WebKit/Source/devtools/front_end/sass/module.json b/third_party/WebKit/Source/devtools/front_end/sass/module.json index 7547bc71..d4704ba5 100644 --- a/third_party/WebKit/Source/devtools/front_end/sass/module.json +++ b/third_party/WebKit/Source/devtools/front_end/sass/module.json
@@ -1,7 +1,8 @@ { - "dependencies": ["platform", "common", "diff", "sdk"], + "dependencies": ["platform", "common", "diff", "sdk", "workspace", "bindings"], "scripts": [ "SASSSupport.js", + "SASSWorkspaceAdapter.js", "SASSLiveSourceMap.js" ] }
diff --git a/third_party/WebKit/Source/devtools/front_end/screencast/module.json b/third_party/WebKit/Source/devtools/front_end/screencast/module.json index ed353043..0f9edda2 100644 --- a/third_party/WebKit/Source/devtools/front_end/screencast/module.json +++ b/third_party/WebKit/Source/devtools/front_end/screencast/module.json
@@ -15,12 +15,13 @@ "type": "@WebInspector.ActionDelegate", "actionId": "screencast.request-app-banner", "className": "WebInspector.ScreencastApp.ActionDelegate", - "title": "Request app banner" + "title": "Request app banner\u2026" }, { "type": "context-menu-item", "condition": "remoteFrontend", "location": "mainMenu/tools", + "experiment": "appBanner", "order": 10, "actionId": "screencast.request-app-banner" }
diff --git a/third_party/WebKit/Source/devtools/front_end/sdk/CSSStyleModel.js b/third_party/WebKit/Source/devtools/front_end/sdk/CSSStyleModel.js index 32df7ceb..82577f0 100644 --- a/third_party/WebKit/Source/devtools/front_end/sdk/CSSStyleModel.js +++ b/third_party/WebKit/Source/devtools/front_end/sdk/CSSStyleModel.js
@@ -70,7 +70,8 @@ PseudoStateForced: "PseudoStateForced", StyleSheetAdded: "StyleSheetAdded", StyleSheetChanged: "StyleSheetChanged", - StyleSheetRemoved: "StyleSheetRemoved" + StyleSheetRemoved: "StyleSheetRemoved", + ExternalRangeEdit: "ExternalRangeEdit" } WebInspector.CSSStyleModel.MediaTypes = ["all", "braille", "embossed", "handheld", "print", "projection", "screen", "speech", "tty", "tv"]; @@ -562,7 +563,6 @@ { if (error) return error; - if (majorChange) this._domModel.markUndoableState(); this._fireStyleSheetChanged(styleSheetId); @@ -1970,17 +1970,6 @@ }, /** - * @param {string} newText - * @param {function(?Protocol.Error)} callback - */ - setContent: function(newText, callback) - { - this._setContentPromise(newText) - .catchException(null) - .then(callback); - }, - - /** * @return {boolean} */ isViaInspector: function()
diff --git a/third_party/WebKit/Source/devtools/front_end/sdk/SourceMap.js b/third_party/WebKit/Source/devtools/front_end/sdk/SourceMap.js index 6c4fae3..71b7fc5 100644 --- a/third_party/WebKit/Source/devtools/front_end/sdk/SourceMap.js +++ b/third_party/WebKit/Source/devtools/front_end/sdk/SourceMap.js
@@ -114,7 +114,7 @@ var baseURL = sourceMapURL.startsWith("data:") ? compiledURL : sourceMapURL; callback(new WebInspector.SourceMap(compiledURL, baseURL, payload)); } catch(e) { - console.error(e.message); + console.error(e); WebInspector.console.error("Failed to parse SourceMap: " + sourceMapURL); callback(null); } @@ -125,6 +125,14 @@ /** * @return {string} */ + compiledURL: function() + { + return this._compiledURL; + }, + + /** + * @return {string} + */ url: function() { return this._sourceMappingURL;
diff --git a/third_party/WebKit/Source/devtools/front_end/sources/NavigatorView.js b/third_party/WebKit/Source/devtools/front_end/sources/NavigatorView.js index 1a00642..de77d77c 100644 --- a/third_party/WebKit/Source/devtools/front_end/sources/NavigatorView.js +++ b/third_party/WebKit/Source/devtools/front_end/sources/NavigatorView.js
@@ -445,7 +445,9 @@ while (node) { parentNode = node.parent; - if (!parentNode || !node.isEmpty() || !(node instanceof WebInspector.NavigatorFolderTreeNode)) + if (!parentNode || !node.isEmpty()) + break; + if (!(node instanceof WebInspector.NavigatorGroupTreeNode || node instanceof WebInspector.NavigatorFolderTreeNode)) break; var folderId = this._folderNodeId(project, target, frame, uiSourceCode.origin(), node._folderPath);
diff --git a/third_party/WebKit/Source/devtools/front_end/ui/infobar.css b/third_party/WebKit/Source/devtools/front_end/ui/infobar.css index bc1992f9..c18e76bc 100644 --- a/third_party/WebKit/Source/devtools/front_end/ui/infobar.css +++ b/third_party/WebKit/Source/devtools/front_end/ui/infobar.css
@@ -11,6 +11,7 @@ border-bottom: 1px solid rgb(171, 171, 171); flex-direction: column; align-items: stretch; + position: relative; } .infobar-warning {
diff --git a/third_party/WebKit/Source/devtools/scripts/compile_frontend.py b/third_party/WebKit/Source/devtools/scripts/compile_frontend.py index bc40483..fab1a5c 100755 --- a/third_party/WebKit/Source/devtools/scripts/compile_frontend.py +++ b/third_party/WebKit/Source/devtools/scripts/compile_frontend.py
@@ -76,7 +76,7 @@ patched_es6_externs_file = to_platform_path(path.join(devtools_frontend_path, 'es6.js')) global_externs_file = to_platform_path(path.join(devtools_frontend_path, 'externs.js')) protocol_externs_file = path.join(devtools_frontend_path, 'protocol_externs.js') -injected_script_source_name = path.join(inspector_path, 'InjectedScriptSource.js') +injected_script_source_name = path.join(inspector_path, 'v8/InjectedScriptSource.js') injected_script_externs_file = path.join(inspector_path, 'injected_script_externs.js') jsmodule_name_prefix = 'jsmodule_'
diff --git a/third_party/WebKit/Source/modules/mediastream/MediaConstraintsImpl.cpp b/third_party/WebKit/Source/modules/mediastream/MediaConstraintsImpl.cpp index ee8148fb..74b5f0a 100644 --- a/third_party/WebKit/Source/modules/mediastream/MediaConstraintsImpl.cpp +++ b/third_party/WebKit/Source/modules/mediastream/MediaConstraintsImpl.cpp
@@ -34,6 +34,7 @@ #include "bindings/core/v8/Dictionary.h" #include "bindings/core/v8/ExceptionState.h" #include "core/dom/ExceptionCode.h" +#include "core/frame/UseCounter.h" #include "modules/mediastream/MediaTrackConstraintSet.h" #include "platform/Logging.h" #include "platform/RuntimeEnabledFeatures.h" @@ -385,7 +386,7 @@ } // Deprecated. -WebMediaConstraints create(const Dictionary& constraintsDictionary, MediaErrorState& errorState) +WebMediaConstraints create(const ExecutionContext* context, const Dictionary& constraintsDictionary, MediaErrorState& errorState) { WebVector<WebMediaConstraint> optional; WebVector<WebMediaConstraint> mandatory; @@ -393,6 +394,7 @@ errorState.throwTypeError("Malformed constraints object."); return WebMediaConstraints(); } + UseCounter::count(context, UseCounter::MediaStreamConstraintsFromDictionary); return createFromNamedConstraints(mandatory, optional, errorState); } @@ -491,7 +493,7 @@ } } -WebMediaConstraints create(const MediaTrackConstraintSet& constraintsIn, MediaErrorState& errorState) +WebMediaConstraints create(const ExecutionContext* context, const MediaTrackConstraintSet& constraintsIn, MediaErrorState& errorState) { WebMediaConstraints constraints; WebMediaTrackConstraintSet constraintBuffer; @@ -510,8 +512,10 @@ errorState.throwTypeError("Malformed constraints object."); return WebMediaConstraints(); } + UseCounter::count(context, UseCounter::MediaStreamConstraintsNameValue); return createFromNamedConstraints(mandatory, optional, errorState); } + UseCounter::count(context, UseCounter::MediaStreamConstraintsConformant); constraints.initialize(constraintBuffer, advancedBuffer); return constraints; }
diff --git a/third_party/WebKit/Source/modules/mediastream/MediaConstraintsImpl.h b/third_party/WebKit/Source/modules/mediastream/MediaConstraintsImpl.h index a97e272..14e3828 100644 --- a/third_party/WebKit/Source/modules/mediastream/MediaConstraintsImpl.h +++ b/third_party/WebKit/Source/modules/mediastream/MediaConstraintsImpl.h
@@ -44,8 +44,8 @@ namespace MediaConstraintsImpl { WebMediaConstraints create(); -WebMediaConstraints create(const Dictionary&, MediaErrorState&); -WebMediaConstraints create(const MediaTrackConstraintSet&, MediaErrorState&); +WebMediaConstraints create(const ExecutionContext*, const Dictionary&, MediaErrorState&); +WebMediaConstraints create(const ExecutionContext*, const MediaTrackConstraintSet&, MediaErrorState&); }
diff --git a/third_party/WebKit/Source/modules/mediastream/MediaConstraintsTest.cpp b/third_party/WebKit/Source/modules/mediastream/MediaConstraintsTest.cpp index 1ac69d0..43dcac1 100644 --- a/third_party/WebKit/Source/modules/mediastream/MediaConstraintsTest.cpp +++ b/third_party/WebKit/Source/modules/mediastream/MediaConstraintsTest.cpp
@@ -72,3 +72,21 @@ blink::BooleanConstraint boolConstraint(theName); EXPECT_EQ(theName, boolConstraint.name()); } + +TEST(MediaTrackConstraintsTest, MandatoryChecks) +{ + blink::WebMediaTrackConstraintSet theSet; + std::string foundName; + EXPECT_FALSE(theSet.hasMandatory()); + EXPECT_FALSE(theSet.hasMandatoryOutsideSet({ "width" }, foundName)); + EXPECT_FALSE(theSet.width.hasMandatory()); + theSet.width.setMax(240); + EXPECT_TRUE(theSet.width.hasMandatory()); + EXPECT_TRUE(theSet.hasMandatory()); + EXPECT_FALSE(theSet.hasMandatoryOutsideSet({ "width" }, foundName)); + EXPECT_TRUE(theSet.hasMandatoryOutsideSet({ "height" }, foundName)); + EXPECT_EQ("width", foundName); + theSet.googPayloadPadding.setExact(true); + EXPECT_TRUE(theSet.hasMandatoryOutsideSet({ "width" }, foundName)); + EXPECT_EQ("googPayloadPadding", foundName); +}
diff --git a/third_party/WebKit/Source/modules/mediastream/RTCDataChannel.cpp b/third_party/WebKit/Source/modules/mediastream/RTCDataChannel.cpp index ad474ad..1114ae6 100644 --- a/third_party/WebKit/Source/modules/mediastream/RTCDataChannel.cpp +++ b/third_party/WebKit/Source/modules/mediastream/RTCDataChannel.cpp
@@ -51,28 +51,30 @@ exceptionState.throwDOMException(NotSupportedError, "Blob support not implemented yet"); } -RTCDataChannel* RTCDataChannel::create(ExecutionContext* context, PassOwnPtr<WebRTCDataChannelHandler> handler) +RTCDataChannel* RTCDataChannel::create(ExecutionContext* context, RTCPeerConnection* connection, PassOwnPtr<WebRTCDataChannelHandler> handler) { ASSERT(handler); - return new RTCDataChannel(context, handler); + return new RTCDataChannel(context, connection, handler); } -RTCDataChannel* RTCDataChannel::create(ExecutionContext* context, WebRTCPeerConnectionHandler* peerConnectionHandler, const String& label, const WebRTCDataChannelInit& init, ExceptionState& exceptionState) +RTCDataChannel* RTCDataChannel::create(ExecutionContext* context, RTCPeerConnection* connection, WebRTCPeerConnectionHandler* peerConnectionHandler, const String& label, const WebRTCDataChannelInit& init, ExceptionState& exceptionState) { OwnPtr<WebRTCDataChannelHandler> handler = adoptPtr(peerConnectionHandler->createDataChannel(label, init)); if (!handler) { exceptionState.throwDOMException(NotSupportedError, "RTCDataChannel is not supported"); return nullptr; } - return new RTCDataChannel(context, handler.release()); + return new RTCDataChannel(context, connection, handler.release()); } -RTCDataChannel::RTCDataChannel(ExecutionContext* context, PassOwnPtr<WebRTCDataChannelHandler> handler) +RTCDataChannel::RTCDataChannel(ExecutionContext* context, RTCPeerConnection* connection, PassOwnPtr<WebRTCDataChannelHandler> handler) : m_executionContext(context) , m_handler(handler) + , m_stopped(false) , m_readyState(ReadyStateConnecting) , m_binaryType(BinaryTypeArrayBuffer) , m_scheduledEventTimer(this, &RTCDataChannel::scheduledEventTimerFired) + , m_connection(connection) , m_bufferedAmountLowThreshold(0U) { m_handler->setClient(this); @@ -80,8 +82,11 @@ RTCDataChannel::~RTCDataChannel() { - // Notify the client that the channel is gone. - m_handler->setClient(0); + // If the peer connection and the data channel die in the same + // GC cycle stop has not been called and we need to notify the + // client that the channel is gone. + if (!m_stopped) + m_handler->setClient(0); } RTCDataChannel::ReadyState RTCDataChannel::getHandlerState() const @@ -230,12 +235,15 @@ void RTCDataChannel::close() { + if (m_stopped) + return; + m_handler->close(); } void RTCDataChannel::didChangeReadyState(WebRTCDataChannelHandlerClient::ReadyState newState) { - if (m_readyState == ReadyStateClosed) + if (m_stopped || m_readyState == ReadyStateClosed) return; m_readyState = newState; @@ -262,11 +270,17 @@ void RTCDataChannel::didReceiveStringData(const WebString& text) { + if (m_stopped) + return; + scheduleDispatchEvent(MessageEvent::create(text)); } void RTCDataChannel::didReceiveRawData(const char* data, size_t dataLength) { + if (m_stopped) + return; + if (m_binaryType == BinaryTypeBlob) { // FIXME: Implement. return; @@ -281,6 +295,9 @@ void RTCDataChannel::didDetectError() { + if (m_stopped) + return; + scheduleDispatchEvent(Event::create(EventTypeNames::error)); } @@ -294,6 +311,14 @@ return m_executionContext; } +void RTCDataChannel::stop() +{ + m_stopped = true; + m_readyState = ReadyStateClosed; + m_handler->setClient(0); + m_executionContext = 0; +} + void RTCDataChannel::scheduleDispatchEvent(PassRefPtrWillBeRawPtr<Event> event) { m_scheduledEvents.append(event); @@ -304,6 +329,9 @@ void RTCDataChannel::scheduledEventTimerFired(Timer<RTCDataChannel>*) { + if (m_stopped) + return; + WillBeHeapVector<RefPtrWillBeMember<Event>> events; events.swap(m_scheduledEvents); @@ -314,10 +342,19 @@ events.clear(); } +void RTCDataChannel::clearWeakMembers(Visitor* visitor) +{ + if (Heap::isHeapObjectAlive(m_connection)) + return; + stop(); + m_connection = nullptr; +} + DEFINE_TRACE(RTCDataChannel) { visitor->trace(m_executionContext); visitor->trace(m_scheduledEvents); + visitor->template registerWeakMembers<RTCDataChannel, &RTCDataChannel::clearWeakMembers>(this); RefCountedGarbageCollectedEventTargetWithInlineData<RTCDataChannel>::trace(visitor); }
diff --git a/third_party/WebKit/Source/modules/mediastream/RTCDataChannel.h b/third_party/WebKit/Source/modules/mediastream/RTCDataChannel.h index fdda686..f2a3a901 100644 --- a/third_party/WebKit/Source/modules/mediastream/RTCDataChannel.h +++ b/third_party/WebKit/Source/modules/mediastream/RTCDataChannel.h
@@ -49,8 +49,8 @@ REFCOUNTED_GARBAGE_COLLECTED_EVENT_TARGET(RTCDataChannel); DEFINE_WRAPPERTYPEINFO(); public: - static RTCDataChannel* create(ExecutionContext*, PassOwnPtr<WebRTCDataChannelHandler>); - static RTCDataChannel* create(ExecutionContext*, WebRTCPeerConnectionHandler*, const String& label, const WebRTCDataChannelInit&, ExceptionState&); + static RTCDataChannel* create(ExecutionContext*, RTCPeerConnection*, PassOwnPtr<WebRTCDataChannelHandler>); + static RTCDataChannel* create(ExecutionContext*, RTCPeerConnection*, WebRTCPeerConnectionHandler*, const String& label, const WebRTCDataChannelInit&, ExceptionState&); ~RTCDataChannel() override; ReadyState getHandlerState() const; @@ -88,10 +88,14 @@ DEFINE_ATTRIBUTE_EVENT_LISTENER(close); DEFINE_ATTRIBUTE_EVENT_LISTENER(message); + void stop(); + // EventTarget const AtomicString& interfaceName() const override; ExecutionContext* executionContext() const override; + void clearWeakMembers(Visitor*); + // Oilpan: need to eagerly finalize m_handler EAGERLY_FINALIZE(); DECLARE_VIRTUAL_TRACE(); @@ -104,7 +108,7 @@ void didDetectError() override; private: - RTCDataChannel(ExecutionContext*, PassOwnPtr<WebRTCDataChannelHandler>); + RTCDataChannel(ExecutionContext*, RTCPeerConnection*, PassOwnPtr<WebRTCDataChannelHandler>); void scheduleDispatchEvent(PassRefPtrWillBeRawPtr<Event>); void scheduledEventTimerFired(Timer<RTCDataChannel>*); @@ -113,6 +117,8 @@ OwnPtr<WebRTCDataChannelHandler> m_handler; + bool m_stopped; + WebRTCDataChannelHandlerClient::ReadyState m_readyState; enum BinaryType { @@ -124,6 +130,8 @@ Timer<RTCDataChannel> m_scheduledEventTimer; WillBeHeapVector<RefPtrWillBeMember<Event>> m_scheduledEvents; + WeakMember<RTCPeerConnection> m_connection; + unsigned m_bufferedAmountLowThreshold; FRIEND_TEST_ALL_PREFIXES(RTCDataChannelTest, BufferedAmountLow);
diff --git a/third_party/WebKit/Source/modules/mediastream/RTCDataChannelTest.cpp b/third_party/WebKit/Source/modules/mediastream/RTCDataChannelTest.cpp index 771124dd..ce83320 100644 --- a/third_party/WebKit/Source/modules/mediastream/RTCDataChannelTest.cpp +++ b/third_party/WebKit/Source/modules/mediastream/RTCDataChannelTest.cpp
@@ -79,7 +79,7 @@ TEST(RTCDataChannelTest, BufferedAmount) { MockHandler* handler = new MockHandler(); - RTCDataChannel* channel = RTCDataChannel::create(0, adoptPtr(handler)); + RTCDataChannel* channel = RTCDataChannel::create(0, 0, adoptPtr(handler)); handler->changeState(WebRTCDataChannelHandlerClient::ReadyStateOpen); String message(std::string(100, 'A').c_str()); @@ -90,7 +90,7 @@ TEST(RTCDataChannelTest, BufferedAmountLow) { MockHandler* handler = new MockHandler(); - RTCDataChannel* channel = RTCDataChannel::create(0, adoptPtr(handler)); + RTCDataChannel* channel = RTCDataChannel::create(0, 0, adoptPtr(handler)); // Add and drain 100 bytes handler->changeState(WebRTCDataChannelHandlerClient::ReadyStateOpen);
diff --git a/third_party/WebKit/Source/modules/mediastream/RTCPeerConnection.cpp b/third_party/WebKit/Source/modules/mediastream/RTCPeerConnection.cpp index 805d30b2..59d3bbda 100644 --- a/third_party/WebKit/Source/modules/mediastream/RTCPeerConnection.cpp +++ b/third_party/WebKit/Source/modules/mediastream/RTCPeerConnection.cpp
@@ -331,7 +331,7 @@ return 0; MediaErrorState mediaErrorState; - WebMediaConstraints constraints = MediaConstraintsImpl::create(mediaConstraints, mediaErrorState); + WebMediaConstraints constraints = MediaConstraintsImpl::create(context, mediaConstraints, mediaErrorState); if (mediaErrorState.hadException()) { mediaErrorState.raiseException(exceptionState); return 0; @@ -417,7 +417,7 @@ m_peerHandler->createOffer(request, offerOptions); } else { MediaErrorState mediaErrorState; - WebMediaConstraints constraints = MediaConstraintsImpl::create(rtcOfferOptions, mediaErrorState); + WebMediaConstraints constraints = MediaConstraintsImpl::create(context, rtcOfferOptions, mediaErrorState); if (mediaErrorState.hadException()) { mediaErrorState.raiseException(exceptionState); return; @@ -450,7 +450,7 @@ ASSERT(successCallback); MediaErrorState mediaErrorState; - WebMediaConstraints constraints = MediaConstraintsImpl::create(mediaConstraints, mediaErrorState); + WebMediaConstraints constraints = MediaConstraintsImpl::create(context, mediaConstraints, mediaErrorState); if (mediaErrorState.hadException()) { mediaErrorState.raiseException(exceptionState); return; @@ -518,7 +518,7 @@ return RTCSessionDescription::create(webSessionDescription); } -void RTCPeerConnection::updateIce(const Dictionary& rtcConfiguration, const Dictionary& mediaConstraints, ExceptionState& exceptionState) +void RTCPeerConnection::updateIce(ExecutionContext* context, const Dictionary& rtcConfiguration, const Dictionary& mediaConstraints, ExceptionState& exceptionState) { if (throwExceptionIfSignalingStateClosed(m_signalingState, exceptionState)) return; @@ -528,7 +528,7 @@ return; MediaErrorState mediaErrorState; - WebMediaConstraints constraints = MediaConstraintsImpl::create(mediaConstraints, mediaErrorState); + WebMediaConstraints constraints = MediaConstraintsImpl::create(context, mediaConstraints, mediaErrorState); if (mediaErrorState.hadException()) { mediaErrorState.raiseException(exceptionState); return; @@ -696,7 +696,7 @@ return String(); } -void RTCPeerConnection::addStream(MediaStream* stream, const Dictionary& mediaConstraints, ExceptionState& exceptionState) +void RTCPeerConnection::addStream(ExecutionContext* context, MediaStream* stream, const Dictionary& mediaConstraints, ExceptionState& exceptionState) { if (throwExceptionIfSignalingStateClosed(m_signalingState, exceptionState)) return; @@ -710,7 +710,7 @@ return; MediaErrorState mediaErrorState; - WebMediaConstraints constraints = MediaConstraintsImpl::create(mediaConstraints, mediaErrorState); + WebMediaConstraints constraints = MediaConstraintsImpl::create(context, mediaConstraints, mediaErrorState); if (mediaErrorState.hadException()) { mediaErrorState.raiseException(exceptionState); return; @@ -796,9 +796,10 @@ DictionaryHelper::get(options, "protocol", protocolString); init.protocol = protocolString; - RTCDataChannel* channel = RTCDataChannel::create(executionContext(), m_peerHandler.get(), label, init, exceptionState); + RTCDataChannel* channel = RTCDataChannel::create(executionContext(), this, m_peerHandler.get(), label, init, exceptionState); if (exceptionState.hadException()) return nullptr; + m_dataChannels.append(channel); RTCDataChannel::ReadyState handlerState = channel->getHandlerState(); if (handlerState != RTCDataChannel::ReadyStateConnecting) { // There was an early state transition. Don't miss it! @@ -924,7 +925,9 @@ if (m_signalingState == SignalingStateClosed) return; - RTCDataChannel* channel = RTCDataChannel::create(executionContext(), adoptPtr(handler)); + RTCDataChannel* channel = RTCDataChannel::create(executionContext(), this, adoptPtr(handler)); + m_dataChannels.append(channel); + scheduleDispatchEvent(RTCDataChannelEvent::create(EventTypeNames::datachannel, false, false, channel)); } @@ -968,6 +971,11 @@ m_iceConnectionState = ICEConnectionStateClosed; m_signalingState = SignalingStateClosed; + HeapVector<Member<RTCDataChannel>>::iterator i = m_dataChannels.begin(); + for (; i != m_dataChannels.end(); ++i) + (*i)->stop(); + m_dataChannels.clear(); + m_dispatchScheduledEventRunner->stop(); m_peerHandler.clear(); @@ -1049,6 +1057,7 @@ { visitor->trace(m_localStreams); visitor->trace(m_remoteStreams); + visitor->trace(m_dataChannels); visitor->trace(m_dispatchScheduledEventRunner); visitor->trace(m_scheduledEvents); RefCountedGarbageCollectedEventTargetWithInlineData<RTCPeerConnection>::trace(visitor);
diff --git a/third_party/WebKit/Source/modules/mediastream/RTCPeerConnection.h b/third_party/WebKit/Source/modules/mediastream/RTCPeerConnection.h index 1d3e908..8ce1f5d 100644 --- a/third_party/WebKit/Source/modules/mediastream/RTCPeerConnection.h +++ b/third_party/WebKit/Source/modules/mediastream/RTCPeerConnection.h
@@ -80,7 +80,7 @@ String signalingState() const; - void updateIce(const Dictionary& rtcConfiguration, const Dictionary& mediaConstraints, ExceptionState&); + void updateIce(ExecutionContext*, const Dictionary& rtcConfiguration, const Dictionary& mediaConstraints, ExceptionState&); // Certificate management // http://w3c.github.io/webrtc-pc/#sec.cert-mgmt @@ -101,7 +101,7 @@ MediaStream* getStreamById(const String& streamId); - void addStream(MediaStream*, const Dictionary& mediaConstraints, ExceptionState&); + void addStream(ExecutionContext*, MediaStream*, const Dictionary& mediaConstraints, ExceptionState&); void removeStream(MediaStream*, ExceptionState&); @@ -199,6 +199,8 @@ MediaStreamVector m_localStreams; MediaStreamVector m_remoteStreams; + HeapVector<Member<RTCDataChannel>> m_dataChannels; + OwnPtr<WebRTCPeerConnectionHandler> m_peerHandler; Member<AsyncMethodRunner<RTCPeerConnection>> m_dispatchScheduledEventRunner;
diff --git a/third_party/WebKit/Source/modules/mediastream/RTCPeerConnection.idl b/third_party/WebKit/Source/modules/mediastream/RTCPeerConnection.idl index be7d91ad..c9d1435a 100644 --- a/third_party/WebKit/Source/modules/mediastream/RTCPeerConnection.idl +++ b/third_party/WebKit/Source/modules/mediastream/RTCPeerConnection.idl
@@ -121,11 +121,11 @@ attribute EventHandler ondatachannel; // Non-standard or removed from the spec: - [RaisesException] void updateIce(optional Dictionary configuration, optional Dictionary mediaConstraints); + [CallWith=ExecutionContext, RaisesException] void updateIce(optional Dictionary configuration, optional Dictionary mediaConstraints); sequence<MediaStream> getLocalStreams(); sequence<MediaStream> getRemoteStreams(); MediaStream getStreamById(DOMString streamId); - [RaisesException] void addStream(MediaStream? stream, optional Dictionary mediaConstraints); + [CallWith=ExecutionContext, RaisesException] void addStream(MediaStream? stream, optional Dictionary mediaConstraints); [RaisesException] void removeStream(MediaStream? stream); [RaisesException] RTCDTMFSender createDTMFSender(MediaStreamTrack track); attribute EventHandler onaddstream;
diff --git a/third_party/WebKit/Source/modules/mediastream/UserMediaRequest.cpp b/third_party/WebKit/Source/modules/mediastream/UserMediaRequest.cpp index d8419394..4312927 100644 --- a/third_party/WebKit/Source/modules/mediastream/UserMediaRequest.cpp +++ b/third_party/WebKit/Source/modules/mediastream/UserMediaRequest.cpp
@@ -48,7 +48,7 @@ namespace blink { -static WebMediaConstraints parseOptions(const BooleanOrMediaTrackConstraintSet& options, MediaErrorState& errorState) +static WebMediaConstraints parseOptions(ExecutionContext* context, const BooleanOrMediaTrackConstraintSet& options, MediaErrorState& errorState) { WebMediaConstraints constraints; @@ -56,7 +56,7 @@ if (options.isNull()) { // Do nothing. } else if (options.isMediaTrackConstraintSet()) { - constraints = MediaConstraintsImpl::create(options.getAsMediaTrackConstraintSet(), errorState); + constraints = MediaConstraintsImpl::create(context, options.getAsMediaTrackConstraintSet(), errorState); } else { ASSERT(options.isBoolean()); if (options.getAsBoolean()) { @@ -69,11 +69,11 @@ UserMediaRequest* UserMediaRequest::create(ExecutionContext* context, UserMediaController* controller, const MediaStreamConstraints& options, NavigatorUserMediaSuccessCallback* successCallback, NavigatorUserMediaErrorCallback* errorCallback, MediaErrorState& errorState) { - WebMediaConstraints audio = parseOptions(options.audio(), errorState); + WebMediaConstraints audio = parseOptions(context, options.audio(), errorState); if (errorState.hadException()) return nullptr; - WebMediaConstraints video = parseOptions(options.video(), errorState); + WebMediaConstraints video = parseOptions(context, options.video(), errorState); if (errorState.hadException()) return nullptr;
diff --git a/third_party/WebKit/Source/modules/webmidi/MIDIAccessInitializer.cpp b/third_party/WebKit/Source/modules/webmidi/MIDIAccessInitializer.cpp index 343c9bae..9483d948a 100644 --- a/third_party/WebKit/Source/modules/webmidi/MIDIAccessInitializer.cpp +++ b/third_party/WebKit/Source/modules/webmidi/MIDIAccessInitializer.cpp
@@ -21,12 +21,10 @@ MIDIAccessInitializer::MIDIAccessInitializer(ScriptState* scriptState, const MIDIOptions& options) : ScriptPromiseResolver(scriptState) - , m_requestSysex(false) + , m_options(options) , m_hasBeenDisposed(false) - , m_sysexPermissionResolved(false) + , m_permissionResolved(false) { - if (options.hasSysex()) - m_requestSysex = options.sysex(); } MIDIAccessInitializer::~MIDIAccessInitializer() @@ -48,12 +46,12 @@ if (!executionContext()) return; - if (!m_sysexPermissionResolved) { + if (!m_permissionResolved) { Document* document = toDocument(executionContext()); ASSERT(document); if (MIDIController* controller = MIDIController::from(document->frame())) - controller->cancelSysexPermissionRequest(this); - m_sysexPermissionResolved = true; + controller->cancelPermissionRequest(this); + m_permissionResolved = true; } m_hasBeenDisposed = true; @@ -64,14 +62,10 @@ ScriptPromise promise = this->promise(); m_accessor = MIDIAccessor::create(this); - if (!m_requestSysex) { - m_accessor->startSession(); - return promise; - } Document* document = toDocument(executionContext()); ASSERT(document); if (MIDIController* controller = MIDIController::from(document->frame())) - controller->requestSysexPermission(this); + controller->requestPermission(this, m_options); else reject(DOMException::create(SecurityError)); @@ -108,7 +102,7 @@ { ASSERT(m_accessor); if (success) { - resolve(MIDIAccess::create(m_accessor.release(), m_requestSysex, m_portDescriptors, executionContext())); + resolve(MIDIAccess::create(m_accessor.release(), m_options.hasSysex(), m_portDescriptors, executionContext())); } else { // The spec says the name is one of // - SecurityError @@ -131,9 +125,9 @@ } } -void MIDIAccessInitializer::resolveSysexPermission(bool allowed) +void MIDIAccessInitializer::resolvePermission(bool allowed) { - m_sysexPermissionResolved = true; + m_permissionResolved = true; if (allowed) m_accessor->startSession(); else
diff --git a/third_party/WebKit/Source/modules/webmidi/MIDIAccessInitializer.h b/third_party/WebKit/Source/modules/webmidi/MIDIAccessInitializer.h index 668d994..dd0cc7c 100644 --- a/third_party/WebKit/Source/modules/webmidi/MIDIAccessInitializer.h +++ b/third_party/WebKit/Source/modules/webmidi/MIDIAccessInitializer.h
@@ -10,13 +10,13 @@ #include "modules/ModulesExport.h" #include "modules/webmidi/MIDIAccessor.h" #include "modules/webmidi/MIDIAccessorClient.h" +#include "modules/webmidi/MIDIOptions.h" #include "modules/webmidi/MIDIPort.h" #include "wtf/OwnPtr.h" #include "wtf/Vector.h" namespace blink { -class MIDIOptions; class ScriptState; class MODULES_EXPORT MIDIAccessInitializer : public ScriptPromiseResolver, public MIDIAccessorClient { @@ -61,7 +61,7 @@ void didStartSession(bool success, const String& error, const String& message) override; void didReceiveMIDIData(unsigned portIndex, const unsigned char* data, size_t length, double timeStamp) override { } - void resolveSysexPermission(bool allowed); + void resolvePermission(bool allowed); SecurityOrigin* securityOrigin() const; private: @@ -75,9 +75,9 @@ OwnPtr<MIDIAccessor> m_accessor; Vector<PortDescriptor> m_portDescriptors; - bool m_requestSysex; + MIDIOptions m_options; bool m_hasBeenDisposed; - bool m_sysexPermissionResolved; + bool m_permissionResolved; }; } // namespace blink
diff --git a/third_party/WebKit/Source/modules/webmidi/MIDIClient.h b/third_party/WebKit/Source/modules/webmidi/MIDIClient.h index 25a20a6..f260923e 100644 --- a/third_party/WebKit/Source/modules/webmidi/MIDIClient.h +++ b/third_party/WebKit/Source/modules/webmidi/MIDIClient.h
@@ -38,11 +38,12 @@ class LocalFrame; class MIDIAccessInitializer; +class MIDIOptions; class MODULES_EXPORT MIDIClient { public: - virtual void requestSysexPermission(MIDIAccessInitializer*) = 0; - virtual void cancelSysexPermissionRequest(MIDIAccessInitializer*) = 0; + virtual void requestPermission(MIDIAccessInitializer*, const MIDIOptions&) = 0; + virtual void cancelPermissionRequest(MIDIAccessInitializer*) = 0; virtual ~MIDIClient() { } };
diff --git a/third_party/WebKit/Source/modules/webmidi/MIDIController.cpp b/third_party/WebKit/Source/modules/webmidi/MIDIController.cpp index d8f8d0ae..09b3054 100644 --- a/third_party/WebKit/Source/modules/webmidi/MIDIController.cpp +++ b/third_party/WebKit/Source/modules/webmidi/MIDIController.cpp
@@ -55,14 +55,14 @@ return adoptPtrWillBeNoop(new MIDIController(client)); } -void MIDIController::requestSysexPermission(MIDIAccessInitializer* initializer) +void MIDIController::requestPermission(MIDIAccessInitializer* initializer, const MIDIOptions& options) { - m_client->requestSysexPermission(initializer); + m_client->requestPermission(initializer, options); } -void MIDIController::cancelSysexPermissionRequest(MIDIAccessInitializer* initializer) +void MIDIController::cancelPermissionRequest(MIDIAccessInitializer* initializer) { - m_client->cancelSysexPermissionRequest(initializer); + m_client->cancelPermissionRequest(initializer); } void provideMIDITo(LocalFrame& frame, PassOwnPtr<MIDIClient> client)
diff --git a/third_party/WebKit/Source/modules/webmidi/MIDIController.h b/third_party/WebKit/Source/modules/webmidi/MIDIController.h index 1157eb5..14ba3a0 100644 --- a/third_party/WebKit/Source/modules/webmidi/MIDIController.h +++ b/third_party/WebKit/Source/modules/webmidi/MIDIController.h
@@ -38,6 +38,7 @@ class MIDIAccessInitializer; class MIDIClient; +class MIDIOptions; class MIDIController final : public NoBaseWillBeGarbageCollectedFinalized<MIDIController>, public WillBeHeapSupplement<LocalFrame> { WILL_BE_USING_GARBAGE_COLLECTED_MIXIN(MIDIController); @@ -45,8 +46,8 @@ public: virtual ~MIDIController(); - void requestSysexPermission(MIDIAccessInitializer*); - void cancelSysexPermissionRequest(MIDIAccessInitializer*); + void requestPermission(MIDIAccessInitializer*, const MIDIOptions&); + void cancelPermissionRequest(MIDIAccessInitializer*); static PassOwnPtrWillBeRawPtr<MIDIController> create(PassOwnPtr<MIDIClient>); static const char* supplementName();
diff --git a/third_party/WebKit/Source/modules/webmidi/MIDIOptions.idl b/third_party/WebKit/Source/modules/webmidi/MIDIOptions.idl index 4be1426..9df8a96 100644 --- a/third_party/WebKit/Source/modules/webmidi/MIDIOptions.idl +++ b/third_party/WebKit/Source/modules/webmidi/MIDIOptions.idl
@@ -6,4 +6,5 @@ dictionary MIDIOptions { boolean sysex; + // TODO(crbug.com/502127): Add bool software to follow the latest spec. };
diff --git a/third_party/WebKit/Source/platform/BUILD.gn b/third_party/WebKit/Source/platform/BUILD.gn index f16ea6a..023849d 100644 --- a/third_party/WebKit/Source/platform/BUILD.gn +++ b/third_party/WebKit/Source/platform/BUILD.gn
@@ -139,38 +139,6 @@ ] } -action("character_data") { - script = "../build/scripts/gperf.py" - deps = [ - ":character_data_generator($host_toolchain)", - ] - output_file = "$blink_platform_output_dir/CharacterData.cpp" - outputs = [ - output_file, - ] - - # Find character_data_generator, which is generated in a different directory - # when cross-compile. - generator = "./" + rebase_path( - get_label_info(":character_data_generator($host_toolchain)", - "root_out_dir") + "/character_data_generator", - root_build_dir) - args = [ - generator, - rebase_path(output_file, root_build_dir), - ] -} - -executable("character_data_generator") { - sources = [ - "fonts/CharacterDataGenerator.cpp", - ] - configs += [ "//third_party/WebKit/Source:config" ] - deps = [ - "//third_party/icu", - ] -} - # This isn't strictly necessary since we can just add the deps to "platform", # but it helps to have the targets match the GYP build. group("make_platform_generated") { @@ -178,7 +146,6 @@ visibility = [ "//third_party/WebKit/Source/*" ] public_deps = [ ":blink_common", - ":character_data", ":color_data", ":font_family_names", ":http_names", @@ -198,11 +165,10 @@ sources -= blink_platform_sse_files # Add in the generated files. - sources += - get_target_outputs(":font_family_names") + - get_target_outputs(":http_names") + - get_target_outputs(":runtime_enabled_features") + - get_target_outputs(":color_data") + get_target_outputs(":character_data") + sources += get_target_outputs(":font_family_names") + + get_target_outputs(":http_names") + + get_target_outputs(":runtime_enabled_features") + + get_target_outputs(":color_data") configs += [ # TODO(jschuh): crbug.com/167187 fix size_t to int truncations.
diff --git a/third_party/WebKit/Source/platform/RuntimeEnabledFeatures.in b/third_party/WebKit/Source/platform/RuntimeEnabledFeatures.in index 57971c9..22e0809 100644 --- a/third_party/WebKit/Source/platform/RuntimeEnabledFeatures.in +++ b/third_party/WebKit/Source/platform/RuntimeEnabledFeatures.in
@@ -108,7 +108,7 @@ KeyboardEventKey status=experimental LangAttributeAwareFormControlUI LinkPreconnect status=stable -LinkPreload status=experimental +LinkPreload status=stable LinkHeader status=stable FractionalScrollOffsets status=experimental Media status=stable
diff --git a/third_party/WebKit/Source/platform/blink_platform.gyp b/third_party/WebKit/Source/platform/blink_platform.gyp index de4f969..54d762e 100644 --- a/third_party/WebKit/Source/platform/blink_platform.gyp +++ b/third_party/WebKit/Source/platform/blink_platform.gyp
@@ -177,7 +177,6 @@ '<@(platform_heap_files)', # Additional .cpp files from platform_generated.gyp:make_platform_generated actions. - '<(blink_platform_output_dir)/CharacterData.cpp', '<(blink_platform_output_dir)/ColorData.cpp', '<(blink_platform_output_dir)/FontFamilyNames.cpp', '<(blink_platform_output_dir)/HTTPNames.cpp',
diff --git a/third_party/WebKit/Source/platform/exported/WebMediaConstraints.cpp b/third_party/WebKit/Source/platform/exported/WebMediaConstraints.cpp index 84125da4..079fb3c 100644 --- a/third_party/WebKit/Source/platform/exported/WebMediaConstraints.cpp +++ b/third_party/WebKit/Source/platform/exported/WebMediaConstraints.cpp
@@ -186,6 +186,11 @@ return !m_hasMin && !m_hasMax && !m_hasExact && !m_hasIdeal; } +bool LongConstraint::hasMandatory() const +{ + return m_hasMin || m_hasMax || m_hasExact; +} + const double DoubleConstraint::kConstraintEpsilon = 0.00001; DoubleConstraint::DoubleConstraint(const char* name) @@ -220,6 +225,11 @@ return !m_hasMin && !m_hasMax && !m_hasExact && !m_hasIdeal; } +bool DoubleConstraint::hasMandatory() const +{ + return m_hasMin || m_hasMax || m_hasExact; +} + StringConstraint::StringConstraint(const char* name) : BaseConstraint(name) , m_exact() @@ -245,6 +255,11 @@ return m_exact.isEmpty() && m_ideal.isEmpty(); } +bool StringConstraint::hasMandatory() const +{ + return !m_exact.isEmpty(); +} + const WebVector<WebString>& StringConstraint::exact() const { return m_exact; @@ -277,6 +292,11 @@ return !m_hasIdeal && !m_hasExact; } +bool BooleanConstraint::hasMandatory() const +{ + return m_hasExact; +} + WebMediaTrackConstraintSet::WebMediaTrackConstraintSet() : width("width") , height("height") @@ -332,24 +352,59 @@ { } +std::vector<const BaseConstraint*> WebMediaTrackConstraintSet::allConstraints() const +{ + const BaseConstraint* temp[] = { + &width, &height, &aspectRatio, &frameRate, &facingMode, &volume, + &sampleRate, &sampleSize, &echoCancellation, &latency, &channelCount, + &deviceId, &groupId, &mediaStreamSource, &renderToAssociatedSink, + &hotwordEnabled, &googEchoCancellation, + &googExperimentalEchoCancellation, &googAutoGainControl, + &googExperimentalAutoGainControl, &googNoiseSuppression, + &googHighpassFilter, &googTypingNoiseDetection, + &googExperimentalNoiseSuppression, &googBeamforming, + &googArrayGeometry, &googAudioMirroring, &googDAEchoCancellation, + &googAecDump, &googNoiseReduction, &offerToReceiveAudio, + &offerToReceiveVideo, &voiceActivityDetection, &iceRestart, + &googUseRtpMux, &enableDtlsSrtp, &enableRtpDataChannels, + &enableDscp, &enableIPv6, &googEnableVideoSuspendBelowMinBitrate, + &googNumUnsignalledRecvStreams, &googCombinedAudioVideoBwe, + &googScreencastMinBitrate, &googCpuOveruseDetection, + &googCpuUnderuseThreshold, &googCpuOveruseThreshold, + &googCpuUnderuseEncodeRsdThreshold, &googCpuOveruseEncodeRsdThreshold, + &googCpuOveruseEncodeUsage, &googHighStartBitrate, &googPayloadPadding + }; + const int elementCount = sizeof(temp) / sizeof(temp[0]); + return std::vector<const BaseConstraint*>(&temp[0], &temp[elementCount]); +} + bool WebMediaTrackConstraintSet::isEmpty() const { - return width.isEmpty() && height.isEmpty() && aspectRatio.isEmpty() - && frameRate.isEmpty() && facingMode.isEmpty() && volume.isEmpty() - && sampleRate.isEmpty() && sampleSize.isEmpty() - && echoCancellation.isEmpty() && latency.isEmpty() - && channelCount.isEmpty() && deviceId.isEmpty() && groupId.isEmpty() - && mediaStreamSource.isEmpty() && renderToAssociatedSink.isEmpty() - && hotwordEnabled.isEmpty() && googEchoCancellation.isEmpty() - && googExperimentalEchoCancellation.isEmpty() - && googAutoGainControl.isEmpty() - && googExperimentalAutoGainControl.isEmpty() - && googNoiseSuppression.isEmpty() - && googHighpassFilter.isEmpty() - && googTypingNoiseDetection.isEmpty() - && googExperimentalNoiseSuppression.isEmpty() - && googBeamforming.isEmpty() && googArrayGeometry.isEmpty() - && googAudioMirroring.isEmpty(); + for (const auto& constraint : allConstraints()) { + if (!constraint->isEmpty()) + return false; + } + return true; +} + +bool WebMediaTrackConstraintSet::hasMandatoryOutsideSet(const std::vector<std::string>& goodNames, std::string& foundName) const +{ + for (const auto& constraint : allConstraints()) { + if (constraint->hasMandatory()) { + if (std::find(goodNames.begin(), goodNames.end(), constraint->name()) + == goodNames.end()) { + foundName = constraint->name(); + return true; + } + } + } + return false; +} + +bool WebMediaTrackConstraintSet::hasMandatory() const +{ + std::string dummyString; + return hasMandatoryOutsideSet(std::vector<std::string>(), dummyString); } // WebMediaConstraints
diff --git a/third_party/WebKit/Source/platform/fonts/Character.cpp b/third_party/WebKit/Source/platform/fonts/Character.cpp index fed39eb..7678358 100644 --- a/third_party/WebKit/Source/platform/fonts/Character.cpp +++ b/third_party/WebKit/Source/platform/fonts/Character.cpp
@@ -33,40 +33,33 @@ #include "wtf/StdLibExtras.h" #include "wtf/text/StringBuilder.h" #include <algorithm> -#include <unicode/uobject.h> #include <unicode/uscript.h> -#define MUTEX_H // Prevent compile failure of utrie2.h on Windows -#include <utrie2.h> using namespace WTF; using namespace Unicode; namespace blink { -// Freezed trie tree, see CharacterDataGenerator.cpp. -extern int32_t serializedCharacterDataSize; -extern uint8_t serializedCharacterData[]; - -static UTrie2* createTrie() -{ - // Create a Trie from the value array. - UErrorCode error = U_ZERO_ERROR; - UTrie2* trie = utrie2_openFromSerialized( - UTrie2ValueBits::UTRIE2_16_VALUE_BITS, - serializedCharacterData, serializedCharacterDataSize, - nullptr, &error); - ASSERT(error == U_ZERO_ERROR); - return trie; -} - -bool Character::hasProperty(UChar32 c, CharacterProperty property) -{ - static UTrie2* trie = nullptr; - if (!trie) - trie = createTrie(); - return UTRIE2_GET16(trie, c) - & static_cast<CharacterPropertyType>(property); -} +static const UChar32 cjkIsolatedSymbolsArray[] = { + // 0x2C7 Caron, Mandarin Chinese 3rd Tone + 0x2C7, + // 0x2CA Modifier Letter Acute Accent, Mandarin Chinese 2nd Tone + 0x2CA, + // 0x2CB Modifier Letter Grave Access, Mandarin Chinese 4th Tone + 0x2CB, + // 0x2D9 Dot Above, Mandarin Chinese 5th Tone + 0x2D9, + 0x2020, 0x2021, 0x2030, 0x203B, 0x203C, 0x2042, 0x2047, 0x2048, 0x2049, 0x2051, + 0x20DD, 0x20DE, 0x2100, 0x2103, 0x2105, 0x2109, 0x210A, 0x2113, 0x2116, 0x2121, + 0x212B, 0x213B, 0x2150, 0x2151, 0x2152, 0x217F, 0x2189, 0x2307, 0x2312, 0x23CE, + 0x2423, 0x25A0, 0x25A1, 0x25A2, 0x25AA, 0x25AB, 0x25B1, 0x25B2, 0x25B3, 0x25B6, + 0x25B7, 0x25BC, 0x25BD, 0x25C0, 0x25C1, 0x25C6, 0x25C7, 0x25C9, 0x25CB, 0x25CC, + 0x25EF, 0x2605, 0x2606, 0x260E, 0x2616, 0x2617, 0x2640, 0x2642, 0x26A0, 0x26BD, + 0x26BE, 0x2713, 0x271A, 0x273F, 0x2740, 0x2756, 0x2B1A, 0xFE10, 0xFE11, 0xFE12, + 0xFE19, 0xFF1D, + // Emoji. + 0x1F100 +}; // Takes a flattened list of closed intervals template <class T, size_t size> @@ -184,7 +177,163 @@ bool Character::isUprightInMixedVertical(UChar32 character) { - return hasProperty(character, CharacterProperty::isUprightInMixedVertical); + // Fast path for common non-CJK + if (character < 0x000A7) + return false; + + // Fast path for common CJK + if (isInRange(character, 0x02E80, 0x0A4CF)) + return true; + + if (isInRange(character, 0x0FF01, 0x0FFE7)) { + if (character <= 0x0FF0C || isInRange(character, 0x0FF0E, 0x0FF1B) + || isInRange(character, 0x0FF1F, 0x0FF60) || character >= 0x0FFE0) + return true; + return false; + } + + // Fast path for medium-common non-CJK + if (character == 0x000A7 || character == 0x000A9 || character == 0x000AE) + return true; + if (character == 0x000B1 || character == 0x000BC || character == 0x000BD || character == 0x000BE) + return true; + if (character == 0x000D7 || character == 0x000F7) + return true; + if (character < 0x002EA) + return false; + + static const UChar32 uprightRanges[] = { + // Spacing Modifier Letters (Part of) + 0x002EA, 0x002EB, + // Hangul Jamo + 0x01100, 0x011FF, + // Unified Canadian Aboriginal Syllabics + 0x01401, 0x0167F, + // Unified Canadian Aboriginal Syllabics Extended + 0x018B0, 0x018FF, + // General Punctuation (Part of) + 0x02016, 0x02016, + 0x02020, 0x02021, + 0x02030, 0x02031, + 0x0203B, 0x0203C, + 0x02042, 0x02042, + 0x02047, 0x02049, + 0x02051, 0x02051, + 0x02065, 0x02069, + // Combining Diacritical Marks for Symbols (Part of) + 0x020DD, 0x020E0, + 0x020E2, 0x020E4, + // Letterlike Symbols (Part of)/Number Forms + 0x02100, 0x02101, + 0x02103, 0x02109, + 0x0210F, 0x0210F, + 0x02113, 0x02114, + 0x02116, 0x02117, + 0x0211E, 0x02123, + 0x02125, 0x02125, + 0x02127, 0x02127, + 0x02129, 0x02129, + 0x0212E, 0x0212E, + 0x02135, 0x0213F, + 0x02145, 0x0214A, + 0x0214C, 0x0214D, + 0x0214F, 0x0218F, + // Mathematical Operators (Part of) + 0x0221E, 0x0221E, + 0x02234, 0x02235, + // Miscellaneous Technical (Part of) + 0x02300, 0x02307, + 0x0230C, 0x0231F, + 0x02324, 0x0232B, + 0x0237D, 0x0239A, + 0x023BE, 0x023CD, + 0x023CF, 0x023CF, + 0x023D1, 0x023DB, + 0x023E2, 0x02422, + // Control Pictures (Part of)/Optical Character Recognition/Enclosed Alphanumerics + 0x02424, 0x024FF, + // Geometric Shapes/Miscellaneous Symbols (Part of) + 0x025A0, 0x02619, + 0x02620, 0x02767, + 0x02776, 0x02793, + // Miscellaneous Symbols and Arrows (Part of) + 0x02B12, 0x02B2F, + 0x02B50, 0x02B59, + 0x02BB8, 0x02BFF, + // Hangul Jamo Extended-A + 0x0A960, 0x0A97F, + // Hangul Syllables/Hangul Jamo Extended-B + 0x0AC00, 0x0D7FF, + // Private Use Area/CJK Compatibility Ideographs + 0x0E000, 0x0FAFF, + // Vertical Forms + 0x0FE10, 0x0FE1F, + // CJK Compatibility Forms (Part of) + 0x0FE30, 0x0FE48, + // Small Form Variants (Part of) + 0x0FE50, 0x0FE57, + 0x0FE59, 0x0FE62, + 0x0FE67, 0x0FE6F, + // Specials (Part of) + 0x0FFF0, 0x0FFF8, + 0x0FFFC, 0x0FFFD, + // Meroitic Hieroglyphs + 0x10980, 0x1099F, + // Siddham + 0x11580, 0x115FF, + // Egyptian Hieroglyphs + 0x13000, 0x1342F, + // Kana Supplement + 0x1B000, 0x1B0FF, + // Byzantine Musical Symbols/Musical Symbols + 0x1D000, 0x1D1FF, + // Tai Xuan Jing Symbols/Counting Rod Numerals + 0x1D300, 0x1D37F, + // Mahjong Tiles/Domino Tiles/Playing Cards/Enclosed Alphanumeric Supplement + // Enclosed Ideographic Supplement/Enclosed Ideographic Supplement + // Emoticons/Ornamental Dingbats/Transport and Map Symbols/Alchemical Symbols + // Alchemical Symbols + 0x1F000, 0x1F7FF, + // CJK Unified Ideographs Extension B/C/D + // CJK Compatibility Ideographs Supplement + 0x20000, 0x2FFFD, + 0x30000, 0x3FFFD, + // Supplementary Private Use Area-A + 0xF0000, 0xFFFFD, + // Supplementary Private Use Area-B + 0x100000, 0x10FFFD, + }; + return valueInIntervalList(uprightRanges, character); +} + +bool Character::isCJKIdeograph(UChar32 c) +{ + static const UChar32 cjkIdeographRanges[] = { + // CJK Radicals Supplement and Kangxi Radicals. + 0x2E80, 0x2FDF, + // CJK Strokes. + 0x31C0, 0x31EF, + // CJK Unified Ideographs Extension A. + 0x3400, 0x4DBF, + // The basic CJK Unified Ideographs block. + 0x4E00, 0x9FFF, + // CJK Compatibility Ideographs. + 0xF900, 0xFAFF, + // CJK Unified Ideographs Extension B. + 0x20000, 0x2A6DF, + // CJK Unified Ideographs Extension C. + // CJK Unified Ideographs Extension D. + 0x2A700, 0x2B81F, + // CJK Compatibility Ideographs Supplement. + 0x2F800, 0x2FA1F + }; + static size_t cjkIdeographRangesCount = WTF_ARRAY_LENGTH(cjkIdeographRanges); + + // Early out + if (c < cjkIdeographRanges[0] || c > cjkIdeographRanges[cjkIdeographRangesCount - 1]) + return false; + + return valueInIntervalList(cjkIdeographRanges, c); } bool Character::isCJKIdeographOrSymbol(UChar32 c) @@ -193,7 +342,69 @@ if (c < 0x2C7) return false; - return hasProperty(c, CharacterProperty::isCJKIdeographOrSymbol); + if (isCJKIdeograph(c)) + return true; + + static const UChar32 cjkSymbolRanges[] = { + 0x2156, 0x215A, + 0x2160, 0x216B, + 0x2170, 0x217B, + 0x23BE, 0x23CC, + 0x2460, 0x2492, + 0x249C, 0x24FF, + 0x25CE, 0x25D3, + 0x25E2, 0x25E6, + 0x2600, 0x2603, + 0x2660, 0x266F, + 0x2672, 0x267D, + // Emoji HEAVY HEART EXCLAMATION MARK ORNAMENT..HEAVY BLACK HEART + // Needed in order not to break Emoji heart-kiss sequences in + // CachingWordShapeIterator. + // cmp. http://www.unicode.org/emoji/charts/emoji-zwj-sequences.html + 0x2763, 0x2764, + 0x2776, 0x277F, + // Ideographic Description Characters, with CJK Symbols and Punctuation, excluding 0x3030. + // Then Hiragana 0x3040 .. 0x309F, Katakana 0x30A0 .. 0x30FF, Bopomofo 0x3100 .. 0x312F + 0x2FF0, 0x302F, + 0x3031, 0x312F, + // More Bopomofo and Bopomofo Extended 0x31A0 .. 0x31BF + 0x3190, 0x31BF, + // Enclosed CJK Letters and Months (0x3200 .. 0x32FF). + // CJK Compatibility (0x3300 .. 0x33FF). + 0x3200, 0x33FF, + 0xF860, 0xF862, + // CJK Compatibility Forms. + 0xFE30, 0xFE4F, + // Halfwidth and Fullwidth Forms + // Usually only used in CJK + 0xFF00, 0xFF0C, + 0xFF0E, 0xFF1A, + 0xFF1F, 0xFFEF, + // Emoji. + 0x1F110, 0x1F129, + 0x1F130, 0x1F149, + 0x1F150, 0x1F169, + 0x1F170, 0x1F189, + 0x1F200, 0x1F6FF + }; + + if (c >= cjkSymbolRanges[0] + && c <= cjkSymbolRanges[WTF_ARRAY_LENGTH(cjkSymbolRanges) - 1] + && valueInIntervalList(cjkSymbolRanges, c)) { + return true; + } + + if (c < 0x2020 && c > 0x2D9) + return false; + + // Hash lookup for isolated symbols (those not part of a contiguous range) + static HashSet<UChar32>* cjkIsolatedSymbols = 0; + if (!cjkIsolatedSymbols) { + cjkIsolatedSymbols = new HashSet<UChar32>(); + for (size_t i = 0; i < WTF_ARRAY_LENGTH(cjkIsolatedSymbolsArray); ++i) + cjkIsolatedSymbols->add(cjkIsolatedSymbolsArray[i]); + } + return cjkIsolatedSymbols->contains(c); } unsigned Character::expansionOpportunityCount(const LChar* characters, size_t length, TextDirection direction, bool& isAfterExpansion, const TextJustify textJustify)
diff --git a/third_party/WebKit/Source/platform/fonts/Character.h b/third_party/WebKit/Source/platform/fonts/Character.h index 091d8851..6b4477d 100644 --- a/third_party/WebKit/Source/platform/fonts/Character.h +++ b/third_party/WebKit/Source/platform/fonts/Character.h
@@ -32,7 +32,6 @@ #define Character_h #include "platform/PlatformExport.h" -#include "platform/fonts/CharacterProperty.h" #include "platform/text/TextDirection.h" #include "platform/text/TextPath.h" #include "platform/text/TextRun.h" @@ -62,6 +61,7 @@ || isInRange(character, 0xE0100, 0xE01EF); // VARIATION SELECTOR-17 to 256 } + static bool isCJKIdeograph(UChar32); static bool isCJKIdeographOrSymbol(UChar32); static unsigned expansionOpportunityCount(const LChar*, size_t length, TextDirection, bool& isAfterExpansion, const TextJustify); @@ -132,8 +132,6 @@ static bool isCommonOrInheritedScript(UChar32); -private: - static bool hasProperty(UChar32, CharacterProperty); }; } // namespace blink
diff --git a/third_party/WebKit/Source/platform/fonts/CharacterData.cpp b/third_party/WebKit/Source/platform/fonts/CharacterData.cpp deleted file mode 100644 index 0dca947c..0000000 --- a/third_party/WebKit/Source/platform/fonts/CharacterData.cpp +++ /dev/null
@@ -1,634 +0,0 @@ -#include <cstdint> - -namespace blink { - -int32_t serializedCharacterDataSize = 10000; -uint8_t serializedCharacterData[] = { - 0x32, 0x69, 0x72, 0x54, 0x00, 0x00, 0x14, 0x0C, 0xDB, 0x01, 0x40, 0x00, 0x14, 0x0C, 0x20, 0x02, - 0x05, 0x03, 0x0D, 0x03, 0x15, 0x03, 0x1D, 0x03, 0x2C, 0x03, 0x34, 0x03, 0x3C, 0x03, 0x44, 0x03, - 0x05, 0x03, 0x0D, 0x03, 0x05, 0x03, 0x0D, 0x03, 0x05, 0x03, 0x0D, 0x03, 0x05, 0x03, 0x0D, 0x03, - 0x05, 0x03, 0x0D, 0x03, 0x05, 0x03, 0x0D, 0x03, 0x05, 0x03, 0x0D, 0x03, 0x4B, 0x03, 0x53, 0x03, - 0x05, 0x03, 0x0D, 0x03, 0x05, 0x03, 0x0D, 0x03, 0x05, 0x03, 0x0D, 0x03, 0x05, 0x03, 0x0D, 0x03, - 0x05, 0x03, 0x0D, 0x03, 0x05, 0x03, 0x0D, 0x03, 0x05, 0x03, 0x0D, 0x03, 0x05, 0x03, 0x0D, 0x03, - 0x05, 0x03, 0x0D, 0x03, 0x05, 0x03, 0x0D, 0x03, 0x05, 0x03, 0x0D, 0x03, 0x05, 0x03, 0x0D, 0x03, - 0x05, 0x03, 0x0D, 0x03, 0x05, 0x03, 0x0D, 0x03, 0x05, 0x03, 0x0D, 0x03, 0x05, 0x03, 0x0D, 0x03, - 0x05, 0x03, 0x0D, 0x03, 0x05, 0x03, 0x0D, 0x03, 0x05, 0x03, 0x0D, 0x03, 0x05, 0x03, 0x0D, 0x03, - 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, - 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, - 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, - 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, - 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, - 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, - 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, - 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, - 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, - 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, - 0x63, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, - 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, - 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x57, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, - 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, - 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, - 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, - 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, - 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, - 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, - 0x6B, 0x03, 0x73, 0x03, 0x7B, 0x03, 0x82, 0x03, 0x05, 0x03, 0x05, 0x03, 0x85, 0x03, 0x8D, 0x03, - 0x95, 0x03, 0x9D, 0x03, 0xA5, 0x03, 0xAD, 0x03, 0xB5, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, - 0xB9, 0x03, 0xC1, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, - 0xC9, 0x03, 0xD1, 0x03, 0x05, 0x03, 0xD4, 0x03, 0xDC, 0x03, 0xE3, 0x03, 0xEB, 0x03, 0xF3, 0x03, - 0x5B, 0x03, 0xFB, 0x03, 0x5B, 0x03, 0x03, 0x04, 0x07, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x0F, 0x04, 0x16, 0x04, 0x1E, 0x04, - 0x26, 0x04, 0x5B, 0x03, 0x2E, 0x04, 0x36, 0x04, 0x5B, 0x03, 0x3E, 0x04, 0x5B, 0x03, 0x5B, 0x03, - 0x46, 0x04, 0x4D, 0x04, 0x55, 0x04, 0x5D, 0x04, 0x66, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, - 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, - 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, - 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, - 0x65, 0x04, 0x67, 0x03, 0x6D, 0x04, 0x05, 0x03, 0x05, 0x03, 0x74, 0x04, 0x5B, 0x03, 0x5B, 0x03, - 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, - 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, - 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0xFF, 0x03, - 0x03, 0x04, 0x7C, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x81, 0x04, 0x5B, 0x03, 0x5B, 0x03, 0xFF, 0x03, 0x03, 0x04, 0x03, 0x04, 0x81, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x5B, 0x03, 0x5B, 0x03, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x67, 0x03, 0x05, 0x03, - 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, - 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, - 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, - 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, - 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x5B, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, - 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, - 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, - 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, - 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, - 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, - 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, - 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, - 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, - 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x89, 0x04, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, - 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, - 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, - 0x91, 0x04, 0x99, 0x04, 0x9F, 0x04, 0xA7, 0x04, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, - 0xAF, 0x04, 0x03, 0x04, 0x03, 0x04, 0xB7, 0x04, 0xB8, 0x04, 0xB8, 0x04, 0xB8, 0x04, 0xC0, 0x04, - 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, - 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, - 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, - 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, - 0x94, 0x0C, 0x94, 0x0C, 0xB0, 0x0C, 0xF0, 0x0C, 0x14, 0x0C, 0x14, 0x0C, 0x14, 0x0C, 0x14, 0x0C, - 0x14, 0x0C, 0x14, 0x0C, 0x14, 0x0C, 0x2C, 0x0D, 0x14, 0x0C, 0x14, 0x0C, 0x14, 0x0C, 0x14, 0x0C, - 0x14, 0x0C, 0x14, 0x0C, 0x14, 0x0C, 0x14, 0x0C, 0x14, 0x0C, 0x14, 0x0C, 0x14, 0x0C, 0x14, 0x0C, - 0x14, 0x0C, 0x14, 0x0C, 0x14, 0x0C, 0x14, 0x0C, 0x14, 0x0C, 0x14, 0x0C, 0x14, 0x0C, 0x14, 0x0C, - 0x40, 0x00, 0x40, 0x0A, 0x54, 0x0A, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x05, 0x05, 0x40, 0x00, - 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, - 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0xB8, 0x06, 0x40, 0x00, - 0x40, 0x00, 0x40, 0x00, 0x94, 0x0A, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0xD4, 0x0A, 0x40, 0x00, - 0x90, 0x01, 0x90, 0x01, 0x90, 0x01, 0x90, 0x01, 0x90, 0x01, 0x90, 0x01, 0x90, 0x01, 0x90, 0x01, - 0x90, 0x01, 0x90, 0x01, 0x90, 0x01, 0x90, 0x01, 0x90, 0x01, 0x90, 0x01, 0x90, 0x01, 0x90, 0x01, - 0x90, 0x01, 0x90, 0x01, 0x90, 0x01, 0x90, 0x01, 0x14, 0x0B, 0x90, 0x01, 0x90, 0x01, 0x53, 0x0B, - 0x60, 0x05, 0x60, 0x05, 0x60, 0x05, 0x60, 0x05, 0x60, 0x05, 0x60, 0x05, 0x60, 0x05, 0x93, 0x0B, - 0x60, 0x05, 0x60, 0x05, 0x60, 0x05, 0x60, 0x05, 0x60, 0x05, 0x60, 0x05, 0x60, 0x05, 0x60, 0x05, - 0x60, 0x05, 0x60, 0x05, 0x60, 0x05, 0x60, 0x05, 0x60, 0x05, 0x60, 0x05, 0x60, 0x05, 0x60, 0x05, - 0x60, 0x05, 0x60, 0x05, 0x60, 0x05, 0x60, 0x05, 0x60, 0x05, 0x60, 0x05, 0x60, 0x05, 0x60, 0x05, - 0x60, 0x05, 0x60, 0x05, 0x60, 0x05, 0x60, 0x05, 0x60, 0x05, 0x60, 0x05, 0x60, 0x05, 0xD3, 0x0B, - 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, - 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, - 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, - 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, - 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, - 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, - 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, - 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, - 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, - 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, - 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, - 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, - 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, - 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, - 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, - 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, - 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, - 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, - 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, - 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, - 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, - 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, - 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, - 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, - 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, - 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, - 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, - 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, - 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, - 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, - 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, - 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, - 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, - 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, - 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, - 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, - 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, - 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, - 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, - 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, - 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, - 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, - 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, - 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, 0x40, 0x00, - 0x60, 0x05, 0x60, 0x05, 0x60, 0x05, 0x60, 0x05, 0x60, 0x05, 0x60, 0x05, 0x60, 0x05, 0x60, 0x05, - 0x60, 0x05, 0x60, 0x05, 0x60, 0x05, 0x60, 0x05, 0x60, 0x05, 0x60, 0x05, 0x60, 0x05, 0x60, 0x05, - 0x60, 0x05, 0x60, 0x05, 0x60, 0x05, 0x60, 0x05, 0x60, 0x05, 0x60, 0x05, 0x60, 0x05, 0x60, 0x05, - 0x60, 0x05, 0x60, 0x05, 0x60, 0x05, 0x60, 0x05, 0x60, 0x05, 0x60, 0x05, 0x60, 0x05, 0xD3, 0x0B, - 0x60, 0x05, 0x60, 0x05, 0x60, 0x05, 0x60, 0x05, 0x60, 0x05, 0x60, 0x05, 0x60, 0x05, 0x60, 0x05, - 0x60, 0x05, 0x60, 0x05, 0x60, 0x05, 0x60, 0x05, 0x60, 0x05, 0x60, 0x05, 0x60, 0x05, 0x60, 0x05, - 0x60, 0x05, 0x60, 0x05, 0x60, 0x05, 0x60, 0x05, 0x60, 0x05, 0x60, 0x05, 0x60, 0x05, 0x60, 0x05, - 0x60, 0x05, 0x60, 0x05, 0x60, 0x05, 0x60, 0x05, 0x60, 0x05, 0x60, 0x05, 0x60, 0x05, 0xD3, 0x0B, - 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, - 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x5B, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, - 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, - 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, - 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, - 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, - 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, - 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, - 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, - 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, - 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, - 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, - 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, - 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, - 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x05, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0xC8, 0x04, 0xCE, 0x04, 0xCE, 0x04, 0xCE, 0x04, - 0xD4, 0x04, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x5B, 0x03, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, - 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x03, 0x04, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0xD7, 0x04, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, 0x5B, 0x03, - 0x5B, 0x03, 0x5B, 0x03, 0xD7, 0x04, 0x04, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, - 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, - 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x01, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x03, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, - 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x01, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, - 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, - 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, - 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, - 0x03, 0x00, 0x02, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x01, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, - 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, - 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, - 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, - 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, - 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x03, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, - 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x03, 0x00, - 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x03, 0x00, - 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, - 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x03, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, - 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, - 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, - 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, - 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, - 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, - 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, - 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, - 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, - 0x02, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, - 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, - 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, - 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, - 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, - 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, - 0x03, 0x00, 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, - 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, - 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, - 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, - 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, - 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, - 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, - 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, - 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, - 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, 0x03, 0x00, - 0x03, 0x00, 0x03, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, 0x02, 0x00, - 0x02, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, -}; - -} // namespace blink
diff --git a/third_party/WebKit/Source/platform/fonts/CharacterDataGenerator.cpp b/third_party/WebKit/Source/platform/fonts/CharacterDataGenerator.cpp deleted file mode 100644 index a1c54018..0000000 --- a/third_party/WebKit/Source/platform/fonts/CharacterDataGenerator.cpp +++ /dev/null
@@ -1,337 +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. - -#include "CharacterProperty.h" - -#include <cassert> -#include <cstring> -#include <stdio.h> -#include <unicode/uobject.h> -#define MUTEX_H // Prevent compile failure of utrie2.h on Windows -#include <utrie2.h> - -const UChar32 kMaxCodepoint = 0x10FFFF; -using CharacterProperty = blink::CharacterProperty; -#define ARRAY_LENGTH(a) (sizeof(a) / sizeof((a)[0])) - -static const UChar32 cjkIsolatedSymbolsArray[] = { - // 0x2C7 Caron, Mandarin Chinese 3rd Tone - 0x2C7, - // 0x2CA Modifier Letter Acute Accent, Mandarin Chinese 2nd Tone - 0x2CA, - // 0x2CB Modifier Letter Grave Access, Mandarin Chinese 4th Tone - 0x2CB, - // 0x2D9 Dot Above, Mandarin Chinese 5th Tone - 0x2D9, - 0x2020, 0x2021, 0x2030, 0x203B, 0x203C, 0x2042, 0x2047, 0x2048, 0x2049, 0x2051, - 0x20DD, 0x20DE, 0x2100, 0x2103, 0x2105, 0x2109, 0x210A, 0x2113, 0x2116, 0x2121, - 0x212B, 0x213B, 0x2150, 0x2151, 0x2152, 0x217F, 0x2189, 0x2307, 0x2312, 0x23CE, - 0x2423, 0x25A0, 0x25A1, 0x25A2, 0x25AA, 0x25AB, 0x25B1, 0x25B2, 0x25B3, 0x25B6, - 0x25B7, 0x25BC, 0x25BD, 0x25C0, 0x25C1, 0x25C6, 0x25C7, 0x25C9, 0x25CB, 0x25CC, - 0x25EF, 0x2605, 0x2606, 0x260E, 0x2616, 0x2617, 0x2640, 0x2642, 0x26A0, 0x26BD, - 0x26BE, 0x2713, 0x271A, 0x273F, 0x2740, 0x2756, 0x2B1A, 0xFE10, 0xFE11, 0xFE12, - 0xFE19, 0xFF1D, - // Emoji. - 0x1F100 -}; - -static const UChar32 cjkIdeographRanges[] = { - // CJK Radicals Supplement and Kangxi Radicals. - 0x2E80, 0x2FDF, - // CJK Strokes. - 0x31C0, 0x31EF, - // CJK Unified Ideographs Extension A. - 0x3400, 0x4DBF, - // The basic CJK Unified Ideographs block. - 0x4E00, 0x9FFF, - // CJK Compatibility Ideographs. - 0xF900, 0xFAFF, - // CJK Unified Ideographs Extension B. - 0x20000, 0x2A6DF, - // CJK Unified Ideographs Extension C. - // CJK Unified Ideographs Extension D. - 0x2A700, 0x2B81F, - // CJK Compatibility Ideographs Supplement. - 0x2F800, 0x2FA1F -}; - -static const UChar32 cjkSymbolRanges[] = { - 0x2156, 0x215A, - 0x2160, 0x216B, - 0x2170, 0x217B, - 0x23BE, 0x23CC, - 0x2460, 0x2492, - 0x249C, 0x24FF, - 0x25CE, 0x25D3, - 0x25E2, 0x25E6, - 0x2600, 0x2603, - 0x2660, 0x266F, - // Emoji HEAVY HEART EXCLAMATION MARK ORNAMENT..HEAVY BLACK HEART - // Needed in order not to break Emoji heart-kiss sequences in - // CachingWordShapeIterator. - // cmp. http://www.unicode.org/emoji/charts/emoji-zwj-sequences.html - 0x2763, 0x2764, - 0x2672, 0x267D, - 0x2776, 0x277F, - // Ideographic Description Characters, with CJK Symbols and Punctuation, - // excluding 0x3030. - // Then Hiragana 0x3040 .. 0x309F, Katakana 0x30A0 .. 0x30FF, Bopomofo - // 0x3100 .. 0x312F - 0x2FF0, 0x302F, - 0x3031, 0x312F, - // More Bopomofo and Bopomofo Extended 0x31A0 .. 0x31BF - 0x3190, 0x31BF, - // Enclosed CJK Letters and Months (0x3200 .. 0x32FF). - // CJK Compatibility (0x3300 .. 0x33FF). - 0x3200, 0x33FF, - 0xF860, 0xF862, - // CJK Compatibility Forms. - 0xFE30, 0xFE4F, - // Halfwidth and Fullwidth Forms - // Usually only used in CJK - 0xFF00, 0xFF0C, - 0xFF0E, 0xFF1A, - 0xFF1F, 0xFFEF, - // Emoji. - 0x1F110, 0x1F129, - 0x1F130, 0x1F149, - 0x1F150, 0x1F169, - 0x1F170, 0x1F189, - 0x1F200, 0x1F6FF -}; - -// Individual codepoints needed for Unicode vertical text layout according to -// http://www.unicode.org/reports/tr50/ -// Taken from the corresponding data file: -// http://www.unicode.org/Public/vertical/revision-13/VerticalOrientation-13.txt -static const UChar32 isUprightInMixedVerticalArray[] = { - 0x000A7, - 0x000A9, - 0x000AE, - 0x000B1, - 0x000D7, - 0x000F7 -}; - -static const UChar32 isUprightInMixedVerticalRanges[] = { - 0x000BC, 0x000BE, - // Spacing Modifier Letters (Part of) - 0x002EA, 0x002EB, - // Hangul Jamo - 0x01100, 0x011FF, - // Unified Canadian Aboriginal Syllabics - 0x01401, 0x0167F, - // Unified Canadian Aboriginal Syllabics Extended - 0x018B0, 0x018FF, - // General Punctuation (Part of) - 0x02016, 0x02016, - 0x02020, 0x02021, - 0x02030, 0x02031, - 0x0203B, 0x0203C, - 0x02042, 0x02042, - 0x02047, 0x02049, - 0x02051, 0x02051, - 0x02065, 0x02069, - // Combining Diacritical Marks for Symbols (Part of) - 0x020DD, 0x020E0, - 0x020E2, 0x020E4, - // Letterlike Symbols (Part of)/Number Forms - 0x02100, 0x02101, - 0x02103, 0x02109, - 0x0210F, 0x0210F, - 0x02113, 0x02114, - 0x02116, 0x02117, - 0x0211E, 0x02123, - 0x02125, 0x02125, - 0x02127, 0x02127, - 0x02129, 0x02129, - 0x0212E, 0x0212E, - 0x02135, 0x0213F, - 0x02145, 0x0214A, - 0x0214C, 0x0214D, - 0x0214F, 0x0218F, - // Mathematical Operators (Part of) - 0x0221E, 0x0221E, - 0x02234, 0x02235, - // Miscellaneous Technical (Part of) - 0x02300, 0x02307, - 0x0230C, 0x0231F, - 0x02324, 0x0232B, - 0x0237D, 0x0239A, - 0x023BE, 0x023CD, - 0x023CF, 0x023CF, - 0x023D1, 0x023DB, - 0x023E2, 0x02422, - // Control Pictures (Part of)/Optical Character Recognition/Enclosed - // Alphanumerics - 0x02424, 0x024FF, - // Geometric Shapes/Miscellaneous Symbols (Part of) - 0x025A0, 0x02619, - 0x02620, 0x02767, - 0x02776, 0x02793, - // Miscellaneous Symbols and Arrows (Part of) - 0x02B12, 0x02B2F, - 0x02B50, 0x02B59, - 0x02BB8, 0x02BFF, - // Common CJK - 0x02E80, 0x0A4CF, - // Hangul Jamo Extended-A - 0x0A960, 0x0A97F, - // Hangul Syllables/Hangul Jamo Extended-B - 0x0AC00, 0x0D7FF, - // Private Use Area/CJK Compatibility Ideographs - 0x0E000, 0x0FAFF, - // Vertical Forms - 0x0FE10, 0x0FE1F, - // CJK Compatibility Forms (Part of) - 0x0FE30, 0x0FE48, - // Small Form Variants (Part of) - 0x0FE50, 0x0FE57, - 0x0FE59, 0x0FE62, - 0x0FE67, 0x0FE6F, - // Halfwidth and Fullwidth Forms - 0x0FF01, 0x0FF0C, - 0x0FF0E, 0x0FF1B, - 0x0FF1F, 0x0FF60, - 0x0FFE0, 0x0FFE7, - // Specials (Part of) - 0x0FFF0, 0x0FFF8, - 0x0FFFC, 0x0FFFD, - // Meroitic Hieroglyphs - 0x10980, 0x1099F, - // Siddham - 0x11580, 0x115FF, - // Egyptian Hieroglyphs - 0x13000, 0x1342F, - // Kana Supplement - 0x1B000, 0x1B0FF, - // Byzantine Musical Symbols/Musical Symbols - 0x1D000, 0x1D1FF, - // Tai Xuan Jing Symbols/Counting Rod Numerals - 0x1D300, 0x1D37F, - // Mahjong Tiles/Domino Tiles/Playing Cards/Enclosed Alphanumeric Supplement - // Enclosed Ideographic Supplement/Enclosed Ideographic Supplement - // Emoticons/Ornamental Dingbats/Transport and Map Symbols/Alchemical - // Symbols Alchemical Symbols - 0x1F000, 0x1F7FF, - // CJK Unified Ideographs Extension B/C/D - // CJK Compatibility Ideographs Supplement - 0x20000, 0x2FFFD, - 0x30000, 0x3FFFD, - // Supplementary Private Use Area-A - 0xF0000, 0xFFFFD, - // Supplementary Private Use Area-B - 0x100000, 0x10FFFD, -}; - -static void setRanges(CharacterProperty* values, - const UChar32* ranges, size_t length, - CharacterProperty value) -{ - assert(length % 2 == 0); - const UChar32* end = ranges + length; - for (; ranges != end; ranges += 2) { - assert(ranges[0] <= ranges[1] - && ranges[1] <= kMaxCodepoint); - for (UChar32 c = ranges[0]; c <= ranges[1]; c++) - values[c] |= value; - } -} - -static void setValues(CharacterProperty* values, - const UChar32* begin, size_t length, - CharacterProperty value) -{ - const UChar32* end = begin + length; - for (; begin != end; begin++) { - assert(*begin <= kMaxCodepoint); - values[*begin] |= value; - } -} - -static void generate(FILE* fp, int32_t size, uint8_t* array) -{ - fprintf(fp, - "#include <cstdint>\n\n" - "namespace blink {\n\n" - "int32_t serializedCharacterDataSize = %d;\n" - "uint8_t serializedCharacterData[] = {", size); - for (int32_t i = 0; i < size; ) { - fprintf(fp, "\n "); - for (int col = 0; col < 16 && i < size; col++, i++) - fprintf(fp, " 0x%02X,", array[i]); - } - fprintf(fp, - "\n};\n\n" - "} // namespace blink\n"); -} - -int main(int argc, char** argv) -{ - // Create a value array of all possible code points. - const UChar32 size = kMaxCodepoint + 1; - CharacterProperty* values = new CharacterProperty[size]; - memset(values, 0, sizeof(CharacterProperty) * size); - - setRanges(values, - cjkIdeographRanges, ARRAY_LENGTH(cjkIdeographRanges), - CharacterProperty::isCJKIdeographOrSymbol); - setRanges(values, - cjkSymbolRanges, ARRAY_LENGTH(cjkSymbolRanges), - CharacterProperty::isCJKIdeographOrSymbol); - setValues(values, - cjkIsolatedSymbolsArray, ARRAY_LENGTH(cjkIsolatedSymbolsArray), - CharacterProperty::isCJKIdeographOrSymbol); - - setRanges(values, - isUprightInMixedVerticalRanges, - ARRAY_LENGTH(isUprightInMixedVerticalRanges), - CharacterProperty::isUprightInMixedVertical); - setValues(values, - isUprightInMixedVerticalArray, - ARRAY_LENGTH(isUprightInMixedVerticalArray), - CharacterProperty::isUprightInMixedVertical); - - // Create a trie from the value array. - UErrorCode error = U_ZERO_ERROR; - UTrie2* trie = utrie2_open(0, 0, &error); - assert(error == U_ZERO_ERROR); - UChar32 start = 0; - CharacterProperty value = values[0]; - for (UChar32 c = 1;; c++) { - if (c < size && values[c] == value) - continue; - if (static_cast<uint32_t>(value)) { - utrie2_setRange32(trie, start, c - 1, - static_cast<uint32_t>(value), TRUE, &error); - assert(error == U_ZERO_ERROR); - } - if (c >= size) - break; - start = c; - value = values[start]; - } - - // Freeze and serialize the trie to a byte array. - utrie2_freeze(trie, UTrie2ValueBits::UTRIE2_16_VALUE_BITS, &error); - assert(error == U_ZERO_ERROR); - int32_t serializedSize = utrie2_serialize(trie, nullptr, 0, &error); - error = U_ZERO_ERROR; - uint8_t* serialized = new uint8_t[serializedSize]; - serializedSize = utrie2_serialize(trie, serialized, serializedSize, &error); - assert(error == U_ZERO_ERROR); - - // Write the serialized array to the source file. - if (argc <= 1) { - generate(stdout, serializedSize, serialized); - } else { - FILE* fp = fopen(argv[1], "wb"); - generate(fp, serializedSize, serialized); - fclose(fp); - } - - utrie2_close(trie); - - return 0; -}
diff --git a/third_party/WebKit/Source/platform/fonts/CharacterProperty.h b/third_party/WebKit/Source/platform/fonts/CharacterProperty.h deleted file mode 100644 index 7b37a98..0000000 --- a/third_party/WebKit/Source/platform/fonts/CharacterProperty.h +++ /dev/null
@@ -1,39 +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. - -#include <cstdint> - -namespace blink { - -using CharacterPropertyType = uint8_t; - -enum class CharacterProperty : CharacterPropertyType { - isCJKIdeographOrSymbol = 0x0001, - isUprightInMixedVertical = 0x0002, -}; - -inline CharacterProperty operator | ( - CharacterProperty a, CharacterProperty b) -{ - return static_cast<CharacterProperty>( - static_cast<CharacterPropertyType>(a) - | static_cast<CharacterPropertyType>(b)); -} - -inline CharacterProperty operator & ( - CharacterProperty a, CharacterProperty b) -{ - return static_cast<CharacterProperty>( - static_cast<CharacterPropertyType>(a) - & static_cast<CharacterPropertyType>(b)); -} - -inline CharacterProperty operator |= ( - CharacterProperty& a, CharacterProperty b) -{ - a = a | b; - return a; -} - -} // namespace blink
diff --git a/third_party/WebKit/Source/platform/fonts/CharacterTest.cpp b/third_party/WebKit/Source/platform/fonts/CharacterTest.cpp index 9cfc872..d285d3d 100644 --- a/third_party/WebKit/Source/platform/fonts/CharacterTest.cpp +++ b/third_party/WebKit/Source/platform/fonts/CharacterTest.cpp
@@ -143,17 +143,13 @@ EXPECT_EQ(ComplexPath, Character::characterRangeCodePath(c6, 3)); } -static void TestSpecificUChar32RangeIdeograph(UChar32 rangeStart, - UChar32 rangeEnd, - bool before = true) +static void TestSpecificUChar32RangeIdeograph(UChar32 rangeStart, UChar32 rangeEnd) { - if (before) - EXPECT_FALSE(Character::isCJKIdeographOrSymbol(rangeStart - 1)); - EXPECT_TRUE(Character::isCJKIdeographOrSymbol(rangeStart)); - EXPECT_TRUE(Character::isCJKIdeographOrSymbol( - (UChar32)((uint64_t)rangeStart + (uint64_t)rangeEnd) / 2)); - EXPECT_TRUE(Character::isCJKIdeographOrSymbol(rangeEnd)); - EXPECT_FALSE(Character::isCJKIdeographOrSymbol(rangeEnd + 1)); + EXPECT_FALSE(Character::isCJKIdeograph(rangeStart - 1)); + EXPECT_TRUE(Character::isCJKIdeograph(rangeStart)); + EXPECT_TRUE(Character::isCJKIdeograph((UChar32)((uint64_t)rangeStart + (uint64_t)rangeEnd) / 2)); + EXPECT_TRUE(Character::isCJKIdeograph(rangeEnd)); + EXPECT_FALSE(Character::isCJKIdeograph(rangeEnd + 1)); } TEST(CharacterTest, TestIsCJKIdeograph) @@ -161,11 +157,11 @@ // The basic CJK Unified Ideographs block. TestSpecificUChar32RangeIdeograph(0x4E00, 0x9FFF); // CJK Unified Ideographs Extension A. - TestSpecificUChar32RangeIdeograph(0x3400, 0x4DBF, false); + TestSpecificUChar32RangeIdeograph(0x3400, 0x4DBF); // CJK Unified Ideographs Extension A and Kangxi Radicals. TestSpecificUChar32RangeIdeograph(0x2E80, 0x2FDF); // CJK Strokes. - TestSpecificUChar32RangeIdeograph(0x31C0, 0x31EF, false); + TestSpecificUChar32RangeIdeograph(0x31C0, 0x31EF); // CJK Compatibility Ideographs. TestSpecificUChar32RangeIdeograph(0xF900, 0xFAFF); // CJK Unified Ideographs Extension B.
diff --git a/third_party/WebKit/Source/platform/platform_generated.gyp b/third_party/WebKit/Source/platform/platform_generated.gyp index ac23035..ff85818 100644 --- a/third_party/WebKit/Source/platform/platform_generated.gyp +++ b/third_party/WebKit/Source/platform/platform_generated.gyp
@@ -34,31 +34,12 @@ '../build/scripts/scripts.gypi', 'platform_generated.gypi', ], - 'variables': { - 'conditions': [ - # TODO(kojii): The character_data_generator fails when cross-compile, so - # we use a pre-generated copy in the tree until we fix or until we move - # to gn. See crbug.com/581555 - ['OS=="android" or chromeos==1 or (target_arch!="ia32" and target_arch!="x64")', { - 'generate_character_data%': 0, - }, { - 'generate_character_data%': 1, - }], - ], - }, 'targets': [ { 'target_name': 'make_platform_generated', 'type': 'none', 'hard_dependency': 1, - 'conditions': [ - ['generate_character_data==1', { - 'dependencies': [ - 'character_data_generator#host', - ], - }] - ], 'actions': [ { 'action_name': 'FontFamilyNames', @@ -133,41 +114,7 @@ '--output-file=<(blink_platform_output_dir)/ColorData.cpp', ], }, - { - 'action_name': 'CharacterData', - 'inputs': [ - 'fonts/CharacterDataGenerator.cpp', - ], - 'outputs': [ - '<(blink_platform_output_dir)/CharacterData.cpp', - ], - 'conditions': [ - ['generate_character_data==1', { - 'action': [ - '<(PRODUCT_DIR)/character_data_generator', - '<(blink_platform_output_dir)/CharacterData.cpp', - ], - }, { - 'action': [ - 'cp', - 'fonts/CharacterData.cpp', - '<(blink_platform_output_dir)/CharacterData.cpp', - ], - }] - ], - }, ] }, - { - 'target_name': 'character_data_generator', - 'type': 'executable', - 'toolsets': ['host'], - 'sources': [ - 'fonts/CharacterDataGenerator.cpp', - ], - 'dependencies': [ - '<(DEPTH)/third_party/icu/icu.gyp:icuuc#host', - ], - }, ], }
diff --git a/third_party/WebKit/Source/platform/text/CompressibleString.cpp b/third_party/WebKit/Source/platform/text/CompressibleString.cpp index 1b8ce41..38e6c09 100644 --- a/third_party/WebKit/Source/platform/text/CompressibleString.cpp +++ b/third_party/WebKit/Source/platform/text/CompressibleString.cpp
@@ -70,18 +70,11 @@ static const unsigned CompressibleStringImplSizeThrehold = 100000; -bool CompressibleStringImpl::s_isPageBackground = false; - void CompressibleStringImpl::compressAll() { compressibleStringTable().compressAll(); } -void CompressibleStringImpl::setPageBackground(bool isPageBackground) -{ - s_isPageBackground = isPageBackground; -} - CompressibleStringImpl::CompressibleStringImpl(PassRefPtr<StringImpl> impl) : m_string(impl) , m_isCompressed(false) @@ -98,9 +91,8 @@ enum CompressibleStringCountType { StringWasCompressedInBackgroundTab, - StringWasDecompressedInBackgroundTab, - StringWasDecompressedInForegroundTab, - CompressibleStringCountTypeMax = StringWasDecompressedInForegroundTab, + StringWasDecompressed, + CompressibleStringCountTypeMax = StringWasDecompressed, }; static void recordCompressibleStringCount(CompressibleStringCountType type) @@ -112,7 +104,6 @@ // TODO(hajimehoshi): Implement this. void CompressibleStringImpl::compressString() { - ASSERT(s_isPageBackground); recordCompressibleStringCount(StringWasCompressedInBackgroundTab); ASSERT(!isCompressed()); m_isCompressed = true; @@ -122,11 +113,14 @@ // TODO(hajimehoshi): Implement this. void CompressibleStringImpl::decompressString() { - if (s_isPageBackground) - recordCompressibleStringCount(StringWasDecompressedInBackgroundTab); - else - recordCompressibleStringCount(StringWasDecompressedInForegroundTab); - + // TODO(hajimehoshi): We wanted to tell whether decompressing in a + // background tab or a foreground tab, but this was impossible. For example, + // one renderer process of a new tab page is used for multiple tabs. + // Another example is that reloading a page will re-use the process with a + // new Page object and updating a static variable along with reloading will + // be complex. See also crbug/581266. We will revisit when the situation + // changes. + recordCompressibleStringCount(StringWasDecompressed); ASSERT(isCompressed()); m_isCompressed = false; }
diff --git a/third_party/WebKit/Source/platform/text/CompressibleString.h b/third_party/WebKit/Source/platform/text/CompressibleString.h index 03668f6..b7b3548 100644 --- a/third_party/WebKit/Source/platform/text/CompressibleString.h +++ b/third_party/WebKit/Source/platform/text/CompressibleString.h
@@ -18,7 +18,6 @@ WTF_MAKE_NONCOPYABLE(CompressibleStringImpl); public: static void compressAll(); - static void setPageBackground(bool); CompressibleStringImpl() : m_string() @@ -69,8 +68,6 @@ void decompressString(); private: - static bool s_isPageBackground; - String m_string; bool m_isCompressed; };
diff --git a/third_party/WebKit/Source/web/MIDIClientProxy.cpp b/third_party/WebKit/Source/web/MIDIClientProxy.cpp index 9b994fd..00aaedf 100644 --- a/third_party/WebKit/Source/web/MIDIClientProxy.cpp +++ b/third_party/WebKit/Source/web/MIDIClientProxy.cpp
@@ -32,6 +32,7 @@ #include "modules/webmidi/MIDIAccessInitializer.h" #include "public/web/modules/webmidi/WebMIDIClient.h" +#include "public/web/modules/webmidi/WebMIDIOptions.h" #include "public/web/modules/webmidi/WebMIDIPermissionRequest.h" namespace blink { @@ -41,18 +42,21 @@ { } -void MIDIClientProxy::requestSysexPermission(MIDIAccessInitializer* initializer) +void MIDIClientProxy::requestPermission(MIDIAccessInitializer* initializer, const MIDIOptions& options) { - if (m_client) - m_client->requestSysexPermission(WebMIDIPermissionRequest(initializer)); - else - initializer->resolveSysexPermission(false); + if (m_client) { + m_client->requestPermission( + WebMIDIPermissionRequest(initializer), + WebMIDIOptions(options.hasSysex() ? WebMIDIOptions::SysexPermission::WithSysex : WebMIDIOptions::SysexPermission::WithoutSysex)); + } else { + initializer->resolvePermission(false); + } } -void MIDIClientProxy::cancelSysexPermissionRequest(MIDIAccessInitializer* initializer) +void MIDIClientProxy::cancelPermissionRequest(MIDIAccessInitializer* initializer) { if (m_client) - m_client->cancelSysexPermissionRequest(WebMIDIPermissionRequest(initializer)); + m_client->cancelPermissionRequest(WebMIDIPermissionRequest(initializer)); } } // namespace blink
diff --git a/third_party/WebKit/Source/web/MIDIClientProxy.h b/third_party/WebKit/Source/web/MIDIClientProxy.h index 163802e..05395e8d 100644 --- a/third_party/WebKit/Source/web/MIDIClientProxy.h +++ b/third_party/WebKit/Source/web/MIDIClientProxy.h
@@ -37,6 +37,7 @@ namespace blink { class MIDIAccessInitializer; +class MIDIOptions; class WebMIDIClient; class MIDIClientProxy final : public MIDIClient { @@ -47,8 +48,8 @@ } // MIDIClient - void requestSysexPermission(MIDIAccessInitializer*) override; - void cancelSysexPermissionRequest(MIDIAccessInitializer*) override; + void requestPermission(MIDIAccessInitializer*, const MIDIOptions&) override; + void cancelPermissionRequest(MIDIAccessInitializer*) override; private: explicit MIDIClientProxy(WebMIDIClient*);
diff --git a/third_party/WebKit/Source/web/WebDevToolsAgentImpl.cpp b/third_party/WebKit/Source/web/WebDevToolsAgentImpl.cpp index 94980775..5813e737 100644 --- a/third_party/WebKit/Source/web/WebDevToolsAgentImpl.cpp +++ b/third_party/WebKit/Source/web/WebDevToolsAgentImpl.cpp
@@ -39,8 +39,6 @@ #include "core/frame/LocalFrame.h" #include "core/frame/Settings.h" #include "core/inspector/IdentifiersFactory.h" -#include "core/inspector/InjectedScriptHost.h" -#include "core/inspector/InjectedScriptManager.h" #include "core/inspector/InspectedFrames.h" #include "core/inspector/InspectorAnimationAgent.h" #include "core/inspector/InspectorApplicationCacheAgent.h" @@ -68,6 +66,8 @@ #include "core/inspector/PageConsoleAgent.h" #include "core/inspector/PageDebuggerAgent.h" #include "core/inspector/PageRuntimeAgent.h" +#include "core/inspector/v8/InjectedScriptHost.h" +#include "core/inspector/v8/InjectedScriptManager.h" #include "core/layout/LayoutView.h" #include "core/page/FocusController.h" #include "core/page/Page.h"
diff --git a/third_party/WebKit/Source/web/WebMIDIPermissionRequest.cpp b/third_party/WebKit/Source/web/WebMIDIPermissionRequest.cpp index f0c6857a..504275c 100644 --- a/third_party/WebKit/Source/web/WebMIDIPermissionRequest.cpp +++ b/third_party/WebKit/Source/web/WebMIDIPermissionRequest.cpp
@@ -63,7 +63,7 @@ void WebMIDIPermissionRequest::setIsAllowed(bool allowed) { - m_private->resolveSysexPermission(allowed); + m_private->resolvePermission(allowed); } } // namespace blink
diff --git a/third_party/WebKit/Source/web/WebPagePopupImpl.cpp b/third_party/WebKit/Source/web/WebPagePopupImpl.cpp index 541a2787..f457c23 100644 --- a/third_party/WebKit/Source/web/WebPagePopupImpl.cpp +++ b/third_party/WebKit/Source/web/WebPagePopupImpl.cpp
@@ -259,6 +259,8 @@ frame->setPagePopupOwner(m_popupClient->ownerElement()); frame->setView(FrameView::create(frame.get())); frame->init(); + frame->view()->setParentVisible(true); + frame->view()->setSelfVisible(true); frame->view()->setTransparent(false); if (AXObjectCache* cache = m_popupClient->ownerElement().document().existingAXObjectCache()) cache->childrenChanged(&m_popupClient->ownerElement());
diff --git a/third_party/WebKit/Source/web/tests/WebDocumentTest.cpp b/third_party/WebKit/Source/web/tests/WebDocumentTest.cpp index 5d7f74d2..1453aea 100644 --- a/third_party/WebKit/Source/web/tests/WebDocumentTest.cpp +++ b/third_party/WebKit/Source/web/tests/WebDocumentTest.cpp
@@ -67,11 +67,13 @@ WebDocument webDoc = topWebDocument(); Document* coreDoc = topDocument(); + unsigned startCount = coreDoc->styleEngine().styleForElementCount(); + webDoc.insertStyleSheet("body { color: green }"); // Check insertStyleSheet did not cause a synchronous style recalc. - unsigned accessCount = coreDoc->styleEngine().resolverAccessCount(); - ASSERT_EQ(0U, accessCount); + unsigned elementCount = coreDoc->styleEngine().styleForElementCount() - startCount; + ASSERT_EQ(0U, elementCount); HTMLElement* bodyElement = coreDoc->body(); ASSERT(bodyElement);
diff --git a/third_party/WebKit/public/blink_headers.gypi b/third_party/WebKit/public/blink_headers.gypi index 1fff69c..b830671c 100644 --- a/third_party/WebKit/public/blink_headers.gypi +++ b/third_party/WebKit/public/blink_headers.gypi
@@ -524,6 +524,7 @@ "web/modules/serviceworker/WebServiceWorkerContextProxy.h", "web/modules/serviceworker/WebServiceWorkerNetworkProvider.h", "web/modules/webmidi/WebMIDIClient.h", + "web/modules/webmidi/WebMIDIOptions.h", "web/modules/webmidi/WebMIDIPermissionRequest.h", "web/win/WebFontRendering.h", ],
diff --git a/third_party/WebKit/public/blink_resources.grd b/third_party/WebKit/public/blink_resources.grd index 00c87af0..0a651fb 100644 --- a/third_party/WebKit/public/blink_resources.grd +++ b/third_party/WebKit/public/blink_resources.grd
@@ -34,8 +34,8 @@ <include name="IDR_UASTYLE_VIEWPORT_ANDROID_CSS" file="../Source/core/css/viewportAndroid.css" type="BINDATA"/> <include name="IDR_INSPECTOR_OVERLAY_PAGE_HTML" file="../Source/core/inspector/InspectorOverlayPage.html" type="BINDATA"/> - <include name="IDR_INSPECTOR_INJECTED_SCRIPT_SOURCE_JS" file="../Source/core/inspector/InjectedScriptSource.js" type="BINDATA"/> - <include name="IDR_INSPECTOR_DEBUGGER_SCRIPT_SOURCE_JS" file="../Source/core/inspector/DebuggerScript.js" type="BINDATA"/> + <include name="IDR_INSPECTOR_INJECTED_SCRIPT_SOURCE_JS" file="../Source/core/inspector/v8/InjectedScriptSource.js" type="BINDATA"/> + <include name="IDR_INSPECTOR_DEBUGGER_SCRIPT_SOURCE_JS" file="../Source/core/inspector/v8/DebuggerScript.js" type="BINDATA"/> <include name="IDR_PRIVATE_SCRIPT_DOCUMENTEXECCOMMAND_JS" file="../Source/core/editing/js/DocumentExecCommand.js" type="BINDATA"/> <include name="IDR_PRIVATE_SCRIPT_DOCUMENTXMLTREEVIEWER_CSS" file="../Source/core/xml/DocumentXMLTreeViewer.css" type="BINDATA"/> <include name="IDR_PRIVATE_SCRIPT_DOCUMENTXMLTREEVIEWER_JS" file="../Source/core/xml/DocumentXMLTreeViewer.js" type="BINDATA"/>
diff --git a/third_party/WebKit/public/platform/WebMediaConstraints.h b/third_party/WebKit/public/platform/WebMediaConstraints.h index 9ad9fe7..b0ef2b96 100644 --- a/third_party/WebKit/public/platform/WebMediaConstraints.h +++ b/third_party/WebKit/public/platform/WebMediaConstraints.h
@@ -37,6 +37,8 @@ #include "WebString.h" #include "WebVector.h" +#include <vector> + namespace blink { class WebMediaConstraintsPrivate; @@ -46,7 +48,8 @@ explicit BaseConstraint(const char* name); virtual ~BaseConstraint(); virtual bool isEmpty() const = 0; - const char* name() + virtual bool hasMandatory() const = 0; + const char* name() const { return m_name; } @@ -84,6 +87,11 @@ bool matches(long value) const; bool isEmpty() const override; + bool hasMandatory() const override; + bool hasMin() const { return m_hasMin; } + long min() const { return m_min; } + bool hasMax() const { return m_hasMax; } + long max() const { return m_max; } private: long m_min; @@ -131,6 +139,11 @@ bool matches(double value) const; bool isEmpty() const override; + bool hasMandatory() const override; + bool hasMin() const { return m_hasMin; } + double min() const { return m_min; } + bool hasMax() const { return m_hasMax; } + double max() const { return m_max; } private: double m_min; @@ -167,6 +180,7 @@ bool matches(WebString value) const; bool isEmpty() const override; + bool hasMandatory() const override; const WebVector<WebString>& exact() const; const WebVector<WebString>& ideal() const; @@ -193,6 +207,7 @@ bool matches(bool value) const; bool isEmpty() const override; + bool hasMandatory() const override; private: unsigned m_ideal : 1; @@ -260,6 +275,11 @@ BooleanConstraint googPayloadPadding; BLINK_PLATFORM_EXPORT bool isEmpty() const; + BLINK_PLATFORM_EXPORT bool hasMandatory() const; + BLINK_PLATFORM_EXPORT bool hasMandatoryOutsideSet(const std::vector<std::string>&, std::string&) const; + +private: + std::vector<const BaseConstraint*> allConstraints() const; }; // Old type/value form of constraint. Will be deprecated.
diff --git a/third_party/WebKit/public/web/modules/webmidi/WebMIDIClient.h b/third_party/WebKit/public/web/modules/webmidi/WebMIDIClient.h index 7ae72aef..2412860a 100644 --- a/third_party/WebKit/public/web/modules/webmidi/WebMIDIClient.h +++ b/third_party/WebKit/public/web/modules/webmidi/WebMIDIClient.h
@@ -33,23 +33,24 @@ namespace blink { +struct WebMIDIOptions; class WebMIDIPermissionRequest; class WebMIDIClient { public: virtual ~WebMIDIClient() { } - // Request a permission to use system exclusive messages. Called when - // MIDIOptions.sysex is true. + // Request a permission to use MIDI system. Called when requestMIDIAccess() + // is called with any option. // Once the request is done, any WebMIDIPermissionRequest instances equal to // |request| must not be accessed after that. - virtual void requestSysexPermission(const WebMIDIPermissionRequest& /* request */) = 0; + virtual void requestPermission(const WebMIDIPermissionRequest& /* request */, const WebMIDIOptions& /* options */) = 0; // Cancel the request since the requesting frame may be moving to // a new page. // Once canceled, any WebMIDIPermissionRequest instances equal to // |request| must not be accessed after that. - virtual void cancelSysexPermissionRequest(const WebMIDIPermissionRequest& /* request */) = 0; + virtual void cancelPermissionRequest(const WebMIDIPermissionRequest& /* request */) = 0; }; } // namespace blink
diff --git a/third_party/WebKit/public/web/modules/webmidi/WebMIDIOptions.h b/third_party/WebKit/public/web/modules/webmidi/WebMIDIOptions.h new file mode 100644 index 0000000..6fce925 --- /dev/null +++ b/third_party/WebKit/public/web/modules/webmidi/WebMIDIOptions.h
@@ -0,0 +1,24 @@ +// 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. + +#ifndef WebMIDIOptions_h +#define WebMIDIOptions_h + +namespace blink { + +struct WebMIDIOptions { + enum class SysexPermission { WithSysex, WithoutSysex }; + + explicit WebMIDIOptions(SysexPermission sysex) + : sysex(sysex) + { + } + + const SysexPermission sysex; + // TODO(crbug.com/502127): Add bool software to follow the latest spec. +}; + +} // namespace blink + +#endif // WebMIDIOptions_h
diff --git a/third_party/android_swipe_refresh/README.chromium b/third_party/android_swipe_refresh/README.chromium index 9f016b2..165240e 100644 --- a/third_party/android_swipe_refresh/README.chromium +++ b/third_party/android_swipe_refresh/README.chromium
@@ -19,3 +19,5 @@ * Target View semantics have been removed, allowing it to operate on a parent View rather than a child View. * All ViewCompat and MotionEventCompat dependencies removed. + * Added OnResetListener interface to notify SwipeRefreshHandler to detach + this view.
diff --git a/third_party/android_swipe_refresh/java/src/org/chromium/third_party/android/swiperefresh/SwipeRefreshLayout.java b/third_party/android_swipe_refresh/java/src/org/chromium/third_party/android/swiperefresh/SwipeRefreshLayout.java index b5b68915..abca452 100644 --- a/third_party/android_swipe_refresh/java/src/org/chromium/third_party/android/swiperefresh/SwipeRefreshLayout.java +++ b/third_party/android_swipe_refresh/java/src/org/chromium/third_party/android/swiperefresh/SwipeRefreshLayout.java
@@ -88,6 +88,7 @@ private static final int DEFAULT_CIRCLE_TARGET = 64; private OnRefreshListener mListener; + private OnResetListener mResetListener; private boolean mRefreshing = false; private float mTotalDragDistance = -1; private int mMediumAnimationDuration; @@ -315,6 +316,13 @@ } /** + * Set the reset listener to be notified when a reset is triggered. + */ + public void setOnResetListener(OnResetListener listener) { + mResetListener = listener; + } + + /** * Pre API 11, alpha is used to make the progress circle appear instead of scale. */ private boolean isAlphaUsedForScale() { @@ -692,6 +700,9 @@ true /* requires update */); } mCurrentTargetOffsetTop = mCircleView.getTop(); + if (mResetListener != null) { + mResetListener.onReset(); + } } private void animateOffsetToCorrectPosition(int from, AnimationListener listener) { @@ -796,4 +807,12 @@ public interface OnRefreshListener { public void onRefresh(); } + + /** + * Classes that wish to be notified when a reset is triggered should + * implement this interface. + */ + public interface OnResetListener { + public void onReset(); + } }
diff --git a/third_party/libjingle/README.chromium b/third_party/libjingle/README.chromium index 2e63942..ad330a0 100644 --- a/third_party/libjingle/README.chromium +++ b/third_party/libjingle/README.chromium
@@ -1,7 +1,7 @@ Name: libjingle URL: http://www.webrtc.org Version: unknown -Revision: 11358 +Revision: 11412 License: BSD License File: source/talk/COPYING Security Critical: yes
diff --git a/tools/android/loading/content_classification_lens.py b/tools/android/loading/content_classification_lens.py index 2e8f0bd..b12b9af 100644 --- a/tools/android/loading/content_classification_lens.py +++ b/tools/android/loading/content_classification_lens.py
@@ -4,8 +4,8 @@ """Labels requests according to the type of content they represent.""" -import adblockparser # Available on PyPI, through pip. import collections +import logging import os import loading_trace @@ -93,10 +93,23 @@ no_whitelist: (bool) Whether the whitelisting rules should be ignored. """ self._rules = self._FilterRules(rules, no_whitelist) - self._matcher = adblockparser.AdblockRules(self._rules) + if self._rules: + try: + import adblockparser + self._matcher = adblockparser.AdblockRules(self._rules) + except ImportError: + logging.critical('Likely you need to install adblockparser. Try:\n' + ' pip install --user adblockparser\n' + 'For 10-100x better performance, also try:\n' + " pip install --user 're2 >= 0.2.21'") + raise + else: + self._matcher = None def Matches(self, request): """Returns whether a request matches one of the rules.""" + if self._matcher is None: + return False url = request.url return self._matcher.should_block(url, self._GetOptions(request))
diff --git a/tools/android/loading/content_classification_lens_unittest.py b/tools/android/loading/content_classification_lens_unittest.py index cca7d52b..b4f5ad1 100644 --- a/tools/android/loading/content_classification_lens_unittest.py +++ b/tools/android/loading/content_classification_lens_unittest.py
@@ -25,6 +25,13 @@ 'frame_id': '123.13', 'parent_frame_id': _MAIN_FRAME_ID}] _RULES = ['bla.com'] + def testNoRules(self): + trace = test_utils.LoadingTraceFromEvents( + [self._REQUEST], self._PAGE_EVENTS) + lens = ContentClassificationLens(trace, [], []) + self.assertFalse(lens.IsAdRequest(self._REQUEST)) + self.assertFalse(lens.IsTrackingRequest(self._REQUEST)) + def testAdRequest(self): trace = test_utils.LoadingTraceFromEvents( [self._REQUEST], self._PAGE_EVENTS)
diff --git a/tools/android/loading/loading_model.py b/tools/android/loading/loading_model.py index b6aeca6..e46b705 100644 --- a/tools/android/loading/loading_model.py +++ b/tools/android/loading/loading_model.py
@@ -202,7 +202,8 @@ Returns: True if the node is not ad-related. """ - return not self._IsAdUrl(self._node_info[node.Index()].Url()) + node_info = self._node_info[node.Index()] + return not (node_info.IsAd() or node_info.IsTracking()) def MakeGraphviz(self, output, highlight=None): """Output a graphviz representation of our DAG. @@ -504,8 +505,9 @@ node = dag.Node(next_index) node_info = self._NodeInfo(node, request) if self._content_lens: - node.SetRequestContent(self._content_lens.IsAdRequest(request), - self._content_lens.IsTrackingRequest(request)) + node_info.SetRequestContent( + self._content_lens.IsAdRequest(request), + self._content_lens.IsTrackingRequest(request)) self._nodes.append(node) self._node_info.append(node_info) @@ -641,82 +643,6 @@ node_info.EndTime() - node_info.StartTime(), ','.join(styles), color, shape)) - @classmethod - def _IsAdUrl(cls, url): - """Return true if the url is an ad. - - We group content that doesn't seem to be specific to the website along with - ads, eg staticxx.facebook.com, as well as analytics like googletagmanager (? - is this correct?). - - Args: - url: The full string url to examine. - - Returns: - True iff the url appears to be an ad. - - """ - # See below for how these patterns are defined. - AD_PATTERNS = ['2mdn.net', - 'admarvel.com', - 'adnxs.com', - 'adobedtm.com', - 'adsrvr.org', - 'adsafeprotected.com', - 'adsymptotic.com', - 'adtech.de', - 'adtechus.com', - 'advertising.com', - 'atwola.com', # brand protection from cscglobal.com? - 'bounceexchange.com', - 'betrad.com', - 'casalemedia.com', - 'cloudfront.net//test.png', - 'cloudfront.net//atrk.js', - 'contextweb.com', - 'crwdcntrl.net', - 'doubleclick.net', - 'dynamicyield.com', - 'krxd.net', - 'facebook.com//ping', - 'fastclick.net', - 'google.com//-ads.js', - 'cse.google.com', # Custom search engine. - 'googleadservices.com', - 'googlesyndication.com', - 'googletagmanager.com', - 'lightboxcdn.com', - 'mediaplex.com', - 'meltdsp.com', - 'mobile.nytimes.com//ads-success', - 'mookie1.com', - 'newrelic.com', - 'nr-data.net', # Apparently part of newrelic. - 'optnmnstr.com', - 'pubmatic.com', - 'quantcast.com', - 'quantserve.com', - 'rubiconproject.com', - 'scorecardresearch.com', - 'sekindo.com', - 'serving-sys.com', - 'sharethrough.com', - 'staticxx.facebook.com', # ? - 'syndication.twimg.com', - 'tapad.com', - 'yieldmo.com', - ] - parts = urlparse.urlparse(url) - for pattern in AD_PATTERNS: - if '//' in pattern: - domain, path = pattern.split('//') - else: - domain, path = (pattern, None) - if parts.netloc.endswith(domain): - if not path or path in parts.path: - return True - return False - def _ExtractImages(self): """Return interesting image resources.
diff --git a/tools/android/loading/loading_model_unittest.py b/tools/android/loading/loading_model_unittest.py index b866136..88a62d9d 100644 --- a/tools/android/loading/loading_model_unittest.py +++ b/tools/android/loading/loading_model_unittest.py
@@ -192,18 +192,6 @@ self.assertEqual(self.SuccessorIndicies(graph._nodes[5]), []) self.assertEqual(self.SortedIndicies(graph), [0, 1, 2, 3, 4, 5]) - def test_AdUrl(self): - self.assertTrue(loading_model.ResourceGraph._IsAdUrl( - 'http://afae61024b33032ef.profile.sfo20.cloudfront.net/test.png')) - self.assertFalse(loading_model.ResourceGraph._IsAdUrl( - 'http://afae61024b33032ef.profile.sfo20.cloudfront.net/tst.png')) - - self.assertTrue(loading_model.ResourceGraph._IsAdUrl( - 'http://ums.adtechus.com/mapuser?providerid=1003;' - 'userid=RUmecco4z3o====')) - self.assertTrue(loading_model.ResourceGraph._IsAdUrl( - 'http://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js')) - if __name__ == '__main__': unittest.main()
diff --git a/tools/android/loading/run_sandwich.py b/tools/android/loading/run_sandwich.py new file mode 100755 index 0000000..647e18e --- /dev/null +++ b/tools/android/loading/run_sandwich.py
@@ -0,0 +1,115 @@ +#! /usr/bin/env python +# 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. + +"""Instructs Chrome to load series of web pages and reports results. + +When running Chrome is sandwiched between preprocessed disk caches and +WepPageReplay serving all connections. + +TODO(pasko): implement cache preparation and WPR. +""" + +import argparse +import logging +import os +import sys + +_SRC_DIR = os.path.abspath(os.path.join( + os.path.dirname(__file__), '..', '..', '..')) + +sys.path.append(os.path.join(_SRC_DIR, 'third_party', 'catapult', 'devil')) +from devil.android import device_utils + +sys.path.append(os.path.join(_SRC_DIR, 'build', 'android')) +import devil_chromium + +import device_setup +import devtools_monitor +import json +import page_track +import tracing + + +_JOB_SEARCH_PATH = 'sandwich_jobs' + + +def _ReadUrlsFromJobDescription(job_name): + """Retrieves the list of URLs associated with the job name.""" + try: + # Extra sugar: attempt to load from a relative path. + json_file_name = os.path.join(os.path.dirname(__file__), _JOB_SEARCH_PATH, + job_name) + with open(json_file_name) as f: + json_data = json.load(f) + except IOError: + # Attempt to read by regular file name. + with open(job_name) as f: + json_data = json.load(f) + + key = 'urls' + if json_data and key in json_data: + url_list = json_data[key] + if isinstance(url_list, list) and len(url_list) > 0: + return url_list + raise Exception('Job description does not define a list named "urls"') + + +def _SaveChromeTrace(events, directory, subdirectory): + """Saves the trace events, ignores IO errors. + + Args: + events: a dict as returned by TracingTrack.ToJsonDict() + directory: directory name contining all traces + subdirectory: directory name to create this particular trace in + """ + target_directory = os.path.join(directory, subdirectory) + file_name = os.path.join(target_directory, 'trace.json') + try: + os.makedirs(target_directory) + with open(file_name, 'w') as f: + json.dump({'traceEvents': events['events'], 'metadata': {}}, f) + except IOError: + logging.warning('Could not save a trace: %s' % file_name) + # Swallow the exception. + + +def main(): + logging.basicConfig(level=logging.INFO) + devil_chromium.Initialize() + + parser = argparse.ArgumentParser() + parser.add_argument('--job', required=True, + help='JSON file with job description.') + parser.add_argument('--output', required=True, + help='Name of output directory to create.') + parser.add_argument('--repeat', default=1, type=int, + help='How many times to run the job') + args = parser.parse_args() + + try: + os.makedirs(args.output) + except OSError: + logging.error('Cannot create directory for results: %s' % args.output) + raise + + job_urls = _ReadUrlsFromJobDescription(args.job) + device = device_utils.DeviceUtils.HealthyDevices()[0] + pages_loaded = 0 + for _ in xrange(args.repeat): + for url in job_urls: + with device_setup.DeviceConnection(device) as connection: + page_track.PageTrack(connection) + tracing_track = tracing.TracingTrack(connection, + categories='blink,cc,netlog,renderer.scheduler,toplevel,v8') + connection.SetUpMonitoring() + connection.SendAndIgnoreResponse('Page.navigate', {'url': url}) + connection.StartMonitoring() + pages_loaded += 1 + _SaveChromeTrace(tracing_track.ToJsonDict(), args.output, + str(pages_loaded)) + + +if __name__ == '__main__': + sys.exit(main())
diff --git a/tools/android/loading/sandwich_jobs/wikipedia.json b/tools/android/loading/sandwich_jobs/wikipedia.json new file mode 100644 index 0000000..84e91d80 --- /dev/null +++ b/tools/android/loading/sandwich_jobs/wikipedia.json
@@ -0,0 +1,5 @@ +{ + "urls": [ + "https://en.m.wikipedia.org/wiki/Science" + ] +}
diff --git a/tools/battor_agent/battor_connection_impl.cc b/tools/battor_agent/battor_connection_impl.cc index 37accf8..406eab7 100644 --- a/tools/battor_agent/battor_connection_impl.cc +++ b/tools/battor_agent/battor_connection_impl.cc
@@ -156,7 +156,8 @@ base::Bind(&BattOrConnectionImpl::OnBytesRead, AsWeakPtr()); io_handler_->Read(make_scoped_ptr(new device::ReceiveBuffer( - pending_read_buffer_, max_bytes_to_read, on_receive_buffer_filled))); + pending_read_buffer_, static_cast<uint32_t>(max_bytes_to_read), + on_receive_buffer_filled))); } void BattOrConnectionImpl::OnBytesRead(int bytes_read,
diff --git a/tools/clang/blink_gc_plugin/BlinkGCPluginConsumer.cpp b/tools/clang/blink_gc_plugin/BlinkGCPluginConsumer.cpp index c90510e..6c52c77 100644 --- a/tools/clang/blink_gc_plugin/BlinkGCPluginConsumer.cpp +++ b/tools/clang/blink_gc_plugin/BlinkGCPluginConsumer.cpp
@@ -973,19 +973,23 @@ diag_class_requires_trace_method_) << info->record(); - for (RecordInfo::Bases::iterator it = info->GetBases().begin(); - it != info->GetBases().end(); - ++it) { - if (it->second.NeedsTracing().IsNeeded()) - NoteBaseRequiresTracing(&it->second); + // Use an intermediate map to sort the notes by source location. + std::map<clang::SourceLocation, BasePoint*> BaseNotes; + for (auto& pair : info->GetBases()) { + if (pair.second.NeedsTracing().IsNeeded()) + BaseNotes.insert(std::make_pair(pair.first->getLocStart(), &pair.second)); } + for (auto& pair : BaseNotes) + NoteBaseRequiresTracing(pair.second); - for (RecordInfo::Fields::iterator it = info->GetFields().begin(); - it != info->GetFields().end(); - ++it) { - if (!it->second.IsProperlyTraced()) - NoteFieldRequiresTracing(info, it->first); + // Use an intermediate map to sort the notes by source location. + std::map<clang::SourceLocation, clang::FieldDecl*> FieldNotes; + for (auto& pair : info->GetFields()) { + if (!pair.second.IsProperlyTraced()) + FieldNotes.insert(std::make_pair(pair.first->getLocStart(), pair.first)); } + for (auto& pair : FieldNotes) + NoteFieldRequiresTracing(info, pair.second); } void BlinkGCPluginConsumer::ReportBaseRequiresTracing(
diff --git a/tools/mb/mb_config.pyl b/tools/mb/mb_config.pyl index 91fc1762..a70c0d6d 100644 --- a/tools/mb/mb_config.pyl +++ b/tools/mb/mb_config.pyl
@@ -12,13 +12,15 @@ 'android_cast_gyp_debug_static_bot': ['android', 'cast', 'gyp', 'debug_static_bot'], 'android_clang_asan_gyp_debug_bot': ['android', 'clang', 'asan', 'gyp', 'debug_bot'],\ 'android_gn_debug_bot': ['android', 'gn', 'debug_bot'], + 'android_gn_debug_static_bot': ['android', 'gn', 'debug_static_bot'], + 'android_gn_debug_static_bot_arm64': ['android', 'gn', 'debug_static_bot', 'arm64'], + 'android_gn_debug_static_bot_mipsel': ['android', 'gn', 'debug_static_bot', 'mipsel'], + 'android_gn_debug_static_bot_x64': ['android', 'gn', 'debug_static_bot', 'x64'], + 'android_gn_debug_static_bot_x86': ['android', 'gn', 'debug_static_bot', 'x86'], 'android_gn_release_bot': ['android', 'gn', 'release_bot'], 'android_gn_release_trybot': ['android', 'gn', 'release_trybot'], 'android_gyp_debug_static_bot': ['android', 'gyp', 'debug_static_bot'], 'android_gyp_debug_static_bot_arm64': ['android', 'gyp', 'debug_static_bot', 'arm64'], - 'android_gyp_debug_static_bot_mipsel': ['android', 'gyp', 'debug_static_bot', 'mipsel'], - 'android_gyp_debug_static_bot_x64': ['android', 'gyp', 'debug_static_bot', 'x64'], - 'android_gyp_debug_static_bot_x86': ['android', 'gyp', 'debug_static_bot', 'x86'], 'android_gyp_release_bot': ['android', 'gyp', 'release_bot'], 'android_gyp_release_bot_minimal_symbols': ['android', 'gyp', 'release_bot', 'minimal_symbols'], 'cast_gn_release_bot': ['cast', 'gn', 'release_bot'], @@ -70,6 +72,8 @@ 'libfuzzer_upload_bot': ['gn', 'release', 'libfuzzer', 'asan', 'proprietary_codecs'], 'libfuzzer_upload_bot_asan': ['gn', 'release', 'libfuzzer', 'asan', 'proprietary_codecs'], 'libfuzzer_upload_bot_msan': ['gn', 'release', 'libfuzzer', 'msan', 'proprietary_codecs'], + 'drfuzz_upload_bot_win32': ['gn', 'release', 'drmemory', 'drfuzz', 'x86', 'proprietary_codecs'], + 'drfuzz_upload_bot_win64': ['gn', 'release', 'drmemory', 'drfuzz', 'x64', 'proprietary_codecs'], # This is just for completeness; any bot that uses this config # should never actually run MB. @@ -80,7 +84,7 @@ 'noswarming_gyp_release_bot_mac_strip': ['noswarming', 'gyp', 'release_bot', 'mac_strip'], 'noswarming_gyp_release_bot_x86': ['noswarming', 'gyp', 'release_bot', 'x86'], - 'swarming_android_gyp_release_bot_minimal_symbols': ['swarming', 'android', 'gyp', 'release_bot', 'minimal_symbols'], + 'swarming_android_gn_release_bot_minimal_symbols': ['swarming', 'android', 'gn', 'release_bot', 'minimal_symbols'], 'swarming_asan_lsan_gyp_release_trybot': ['swarming', 'asan', 'lsan', 'release_trybot'], 'swarming_msan_gyp_release_trybot': ['swarming', 'chromeos', 'msan', 'gyp', 'release_trybot'], 'swarming_deterministic_gyp_release_bot': ['swarming', 'deterministic', 'gyp', 'release_bot'], @@ -405,6 +409,13 @@ 'gn_args': 'target_cpu="x86"', 'gyp_defines': 'target_arch=ia32', }, + + 'drfuzz': { 'gn_args': 'use_drfuzz=true' }, + + 'drmemory': { + 'gn_args': 'is_component_build=true enable_iterator_debugging=false', + 'gyp_defines': 'component=shared_library build_for_tool=drmemory', + } }, # This is a map of buildbot master names -> buildbot builder names -> @@ -430,20 +441,20 @@ }, 'chromium.android': { 'Android GN Builder (dbg)': 'android_gn_debug_bot', - 'Android MIPS Builder (dbg)': 'android_gyp_debug_static_bot_mipsel', - 'Android arm Builder (dbg)': 'android_gyp_debug_static_bot', - 'Android arm64 Builder (dbg)': 'android_gyp_debug_static_bot_arm64', - 'Android x64 Builder (dbg)': 'android_gyp_debug_static_bot_x64', - 'Android x86 Builder (dbg)': 'android_gyp_debug_static_bot_x86', - 'Jelly Bean Tester': 'android_gyp_debug_static_bot', - 'KitKat Tablet Tester': 'android_gyp_debug_static_bot', - 'Lollipop Consumer Tester': 'android_gyp_debug_static_bot_arm64', - 'Lollipop Low-end Tester': 'android_gyp_debug_static_bot', - 'Lollipop Phone Tester': 'android_gyp_debug_static_bot', - 'Lollipop Tablet Tester': 'android_gyp_debug_static_bot', - 'Marshmallow 64 bit Tester': 'android_gyp_debug_static_bot_arm64', - 'Marshmallow Tablet Tester': 'android_gyp_debug_static_bot', - 'Android Swarm Builder': 'swarming_android_gyp_release_bot_minimal_symbols', + 'Android MIPS Builder (dbg)': 'android_gn_debug_static_bot_mipsel', + 'Android arm Builder (dbg)': 'android_gn_debug_static_bot', + 'Android arm64 Builder (dbg)': 'android_gn_debug_static_bot_arm64', + 'Android x64 Builder (dbg)': 'android_gn_debug_static_bot_x64', + 'Android x86 Builder (dbg)': 'android_gn_debug_static_bot_x86', + 'Jelly Bean Tester': 'android_gn_debug_static_bot', + 'KitKat Tablet Tester': 'android_gn_debug_static_bot', + 'Lollipop Consumer Tester': 'android_gn_debug_static_bot_arm64', + 'Lollipop Low-end Tester': 'android_gn_debug_static_bot', + 'Lollipop Phone Tester': 'android_gn_debug_static_bot', + 'Lollipop Tablet Tester': 'android_gn_debug_static_bot', + 'Marshmallow 64 bit Tester': 'android_gn_debug_static_bot_arm64', + 'Marshmallow Tablet Tester': 'android_gn_debug_static_bot', + 'Android Swarm Builder': 'swarming_android_gn_release_bot_minimal_symbols', }, 'chromium.chrome': { 'Google Chrome Win': 'gyp_official_goma_minimal_symbols_x86', @@ -544,6 +555,8 @@ 'CFI Linux': 'gn_cfi_release_bot', 'CFI Linux ToT': 'gn_cfi_release_bot', 'CrWinClang64(dbg)': 'win_clang_debug_bot', + 'Win LKGR (DrM)': 'drfuzz_upload_bot_win32', + 'Win LKGR (DrM 64)': 'drfuzz_upload_bot_win64', 'Libfuzzer Upload Linux': 'libfuzzer_upload_bot', 'Libfuzzer Upload Linux ASan': 'libfuzzer_upload_bot_asan', 'Libfuzzer Upload Linux MSan': 'libfuzzer_upload_bot_msan',
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml index 6ef1418e..9abcaaa 100644 --- a/tools/metrics/histograms/histograms.xml +++ b/tools/metrics/histograms/histograms.xml
@@ -2516,6 +2516,9 @@ </histogram> <histogram name="Autofill.PayloadCompressionRatio" units="%"> + <obsolete> + Deprecated as of 1/2016, autofill payload compression was removed. + </obsolete> <owner>mathp@chromium.org</owner> <summary> Compression ratio of the query and upload payload that are sent to the @@ -3121,7 +3124,17 @@ enum="RevalidationPolicy"> <owner>hiroshige@chromium.org</owner> <summary> - RevalidationPolicy used for each resource type. https://crbug.com/579496 + RevalidationPolicy used for non-preloading requests for each resource type. + https://crbug.com/579496 + </summary> +</histogram> + +<histogram name="Blink.MemoryCache.RevalidationPolicy.Preload" + enum="RevalidationPolicy"> + <owner>hiroshige@chromium.org</owner> + <summary> + RevalidationPolicy of used for preloading requests for each resource type. + https://crbug.com/579496 </summary> </histogram> @@ -40768,6 +40781,15 @@ </summary> </histogram> +<histogram name="SafeBrowsing.UnverifiedDownloads.AlternateExtensionCount"> + <owner>asanka@chromium.org</owner> + <summary> + Count of alternate extensions that were supplied when attempting to download + a file without verifying their content nor their source URLs with Safe + Browsing. + </summary> +</histogram> + <histogram name="SafeBrowsing.UnverifiedDownloads.Blocked" enum="SBClientDownloadExtensions"> <owner>asanka@chromium.org</owner> @@ -54729,6 +54751,15 @@ </summary> </histogram> +<histogram name="WebFont.FontDisplayValue" enum="FontDisplayValue"> + <owner>kenjibaheux@chromium.org</owner> + <owner>ksakamoto@chromium.org</owner> + <summary> + The value of font-display @font-face descriptor. Counted only when + explicitly specified in the @font-face rule. + </summary> +</histogram> + <histogram name="WebFont.HadBlankText" enum="BooleanHadBlankText"> <owner>kenjibaheux@chromium.org</owner> <owner>ksakamoto@chromium.org</owner> @@ -59184,8 +59215,7 @@ <enum name="CompressibleStringCountType" type="int"> <int value="0" label="Compressed in a background tab"/> - <int value="1" label="Decompressed in a background tab"/> - <int value="2" label="Decompressed in a foreground tab"/> + <int value="1" label="Decompressed in a background or a foreground tab"/> </enum> <enum name="ComputeCurrentSigninStatus" type="int"> @@ -65829,6 +65859,9 @@ <int value="1147" label="NotificationAPIInsecureOriginIframe"/> <int value="1148" label="NotificationAPISecureOriginIframe"/> <int value="1149" label="WebSocket"/> + <int value="1150" label="MediaStreamConstraintsNameValue"/> + <int value="1151" label="MediaStreamConstraintsFromDictionary"/> + <int value="1152" label="MediaStreamConstraintsConformant"/> </enum> <enum name="FetchRequestMode" type="int"> @@ -66734,6 +66767,14 @@ </int> </enum> +<enum name="FontDisplayValue" type="int"> + <int value="0" label="auto"/> + <int value="1" label="block"/> + <int value="2" label="swap"/> + <int value="3" label="fallback"/> + <int value="4" label="optional"/> +</enum> + <enum name="FormDataDeserializationStatus" type="int"> <int value="0" label="Login database success"/> <int value="1" label="Login database failure"/>
diff --git a/tools/perf/benchmarks/page_cycler.py b/tools/perf/benchmarks/page_cycler.py index 4feaf5d..5ac46a6b 100644 --- a/tools/perf/benchmarks/page_cycler.py +++ b/tools/perf/benchmarks/page_cycler.py
@@ -107,7 +107,7 @@ value, is_first_result) and value.name != filtered_name) -@benchmark.Disabled('xp', 'android') # crbug.com/434366, crbug.com/506903 +@benchmark.Disabled('xp') # crbug.com/434366 class PageCyclerIntlKoThVi(_PageCycler): """Page load time for a variety of pages in Korean, Thai and Vietnamese.
diff --git a/tools/valgrind/memcheck/suppressions.txt b/tools/valgrind/memcheck/suppressions.txt index b3ced04f..48366c8 100644 --- a/tools/valgrind/memcheck/suppressions.txt +++ b/tools/valgrind/memcheck/suppressions.txt
@@ -3485,3 +3485,16 @@ fun:_ZN5blink14LocalDOMWindow18installNewDocumentERKN3WTF6StringERKNS_12DocumentInitEb fun:_ZN5blink14DocumentLoader15createWriterForEPKNS_* } +{ + bug_581959 + Memcheck:Leak + fun:_Znw* + fun:_ZN9__gnu_cxx13new_allocatorIPN10disk_cache20SimpleEntryOperationEE8allocateEmPKv + fun:_ZNSt11_Deque_baseIN10disk_cache20SimpleEntryOperationESaIS1_EE15_M_allocate_mapEm + fun:_ZNSt11_Deque_baseIN10disk_cache20SimpleEntryOperationESaIS1_EE17_M_initialize_mapEm + fun:_ZNSt11_Deque_baseIN10disk_cache20SimpleEntryOperationESaIS1_EEC2Ev + fun:_ZNSt5dequeIN10disk_cache20SimpleEntryOperationESaIS1_EEC2Ev + fun:_ZN10disk_cache15SimpleEntryImplC1EN3net9CacheTypeERKN4base8FilePathEmNS0_14OperationsModeEPNS_17SimpleBackendImplEPNS1_6NetLogE + fun:_ZN10disk_cache17SimpleBackendImpl23CreateOrFindActiveEntryEmRKSs + fun:_ZN10disk_cache17SimpleBackendImpl11CreateEntryERKSsPPNS_5EntryERKN4base8CallbackIFviEEE +}
diff --git a/ui/accelerated_widget_mac/display_link_mac.cc b/ui/accelerated_widget_mac/display_link_mac.cc index d9cc468..72470f64 100644 --- a/ui/accelerated_widget_mac/display_link_mac.cc +++ b/ui/accelerated_widget_mac/display_link_mac.cc
@@ -25,6 +25,20 @@ } // namespace base +namespace { + +// Empty callback set during tear down. +CVReturn VoidDisplayLinkCallback(CVDisplayLinkRef display_link, + const CVTimeStamp* now, + const CVTimeStamp* output_time, + CVOptionFlags flags_in, + CVOptionFlags* flags_out, + void* context) { + return kCVReturnSuccess; +} + +} // namespace + namespace ui { // static @@ -86,6 +100,14 @@ DisplayLinkMac::~DisplayLinkMac() { StopDisplayLink(); + // Usually |display_link_| holds the last reference to CVDisplayLinkRef, but + // that's not guaranteed, so it might not free all resources after the + // destructor completes. Ensure the callback is cleared out regardless to + // avoid possible crashes (see http://crbug.com/564780). + CVReturn ret = CVDisplayLinkSetOutputCallback( + display_link_, VoidDisplayLinkCallback, nullptr); + DCHECK_EQ(kCGErrorSuccess, ret); + DisplayMap::iterator found = display_map_.Get().find(display_id_); DCHECK(found != display_map_.Get().end()); DCHECK(found->second == this);
diff --git a/ui/accessibility/platform/atk_util_auralinux.cc b/ui/accessibility/platform/atk_util_auralinux.cc index 0256319..46ad3be 100644 --- a/ui/accessibility/platform/atk_util_auralinux.cc +++ b/ui/accessibility/platform/atk_util_auralinux.cc
@@ -8,7 +8,9 @@ #endif #include <glib-2.0/gmodule.h> +#include "base/bind.h" #include "base/files/file_path.h" +#include "base/location.h" #include "base/logging.h" #include "base/memory/singleton.h" #include "ui/accessibility/platform/atk_util_auralinux.h" @@ -16,41 +18,42 @@ namespace { +typedef void (*gnome_accessibility_module_init)(); + +const char kAtkBridgePath[] = "gtk-2.0/modules/libatk-bridge.so"; +const char kAtkBridgeSymbolName[] = "gnome_accessibility_module_init"; + +gnome_accessibility_module_init g_accessibility_module_init = nullptr; + +bool AccessibilityModuleInitOnFileThread() { + // Try to load libatk-bridge.so. + base::FilePath atk_bridge_path(ATK_LIB_DIR); + atk_bridge_path = atk_bridge_path.Append(kAtkBridgePath); + GModule* bridge = g_module_open(atk_bridge_path.value().c_str(), + static_cast<GModuleFlags>(0)); + if (!bridge) { + VLOG(1) << "Unable to open module " << atk_bridge_path.value(); + return false; + } + + if (!g_module_symbol(bridge, kAtkBridgeSymbolName, + (gpointer *)&g_accessibility_module_init)) { + VLOG(1) << "Unable to get symbol pointer from " << atk_bridge_path.value(); + // Just to make sure it's null; + g_accessibility_module_init = nullptr; + return false; + } + + return true; +} + #if defined(USE_GCONF) +const char kAccessibilityEnabled[] = "ACCESSIBILITY_ENABLED"; const char kGnomeAccessibilityEnabledKey[] = "/desktop/gnome/interface/accessibility"; -bool ShouldEnableAccessibility() { - GConfClient* client = gconf_client_get_default(); - if (!client) { - LOG(ERROR) << "gconf_client_get_default failed"; - return false; - } - - GError* error = nullptr; - gboolean value = gconf_client_get_bool(client, - kGnomeAccessibilityEnabledKey, - &error); - if (error) { - VLOG(1) << "gconf_client_get_bool failed"; - g_error_free(error); - g_object_unref(client); - return false; - } - - g_object_unref(client); - return value; -} - -#else // !defined(USE_GCONF) - -bool ShouldEnableAccessibility() { - // TODO(k.czech): implement this for non-GNOME desktops. - return false; -} - -#endif // defined(USE_GCONF) +#endif } // namespace @@ -139,44 +142,88 @@ return base::Singleton<AtkUtilAuraLinux>::get(); } +#if defined(USE_GCONF) + +AtkUtilAuraLinux::AtkUtilAuraLinux() + : is_enabled_(false) { +} + +#else + AtkUtilAuraLinux::AtkUtilAuraLinux() { } +#endif // defined(USE_GCONF) + void AtkUtilAuraLinux::Initialize( - scoped_refptr<base::TaskRunner> /* init_task_runner */) { - // TODO(k.czech): use |init_task_runner| to post a task to do the - // initialization rather than doing it on this thread. - // http://crbug.com/468112 + scoped_refptr<base::TaskRunner> init_task_runner) { // Register our util class. g_type_class_unref(g_type_class_ref(ATK_UTIL_AURALINUX_TYPE)); - if (!ShouldEnableAccessibility()) { - VLOG(1) << "Will not enable ATK accessibility support."; - return; - } - - VLOG(1) << "Enabling ATK accessibility support."; - - // Try to load libatk-bridge.so. - base::FilePath atk_bridge_path(ATK_LIB_DIR); - atk_bridge_path = atk_bridge_path.Append("gtk-2.0/modules/libatk-bridge.so"); - GModule* bridge = g_module_open(atk_bridge_path.value().c_str(), - static_cast<GModuleFlags>(0)); - if (!bridge) { - VLOG(1) << "Unable to open module " << atk_bridge_path.value(); - return; - } - - // Try to call gnome_accessibility_module_init from libatk-bridge.so. - void (*gnome_accessibility_module_init)(); - if (g_module_symbol(bridge, "gnome_accessibility_module_init", - (gpointer *)&gnome_accessibility_module_init)) { - (*gnome_accessibility_module_init)(); - } + init_task_runner->PostTaskAndReply( + FROM_HERE, + base::Bind( + &AtkUtilAuraLinux::CheckIfAccessibilityIsEnabledOnFileThread, + base::Unretained(this)), + base::Bind( + &AtkUtilAuraLinux::FinishAccessibilityInitOnUIThread, + base::Unretained(this))); } AtkUtilAuraLinux::~AtkUtilAuraLinux() { } +#if defined(USE_GCONF) + +void AtkUtilAuraLinux::CheckIfAccessibilityIsEnabledOnFileThread() { + char* enable_accessibility = getenv(kAccessibilityEnabled); + if ((enable_accessibility && atoi(enable_accessibility) == 1) || + CheckPlatformAccessibilitySupportOnFileThread()) + is_enabled_ = AccessibilityModuleInitOnFileThread(); +} + +bool AtkUtilAuraLinux::CheckPlatformAccessibilitySupportOnFileThread() { + GConfClient* client = gconf_client_get_default(); + if (!client) { + LOG(ERROR) << "gconf_client_get_default failed"; + return false; + } + + GError* error = nullptr; + bool is_enabled = gconf_client_get_bool(client, + kGnomeAccessibilityEnabledKey, + &error); + + g_object_unref(client); + + if (error) { + VLOG(1) << "gconf_client_get_bool failed"; + g_error_free(error); + return false; + } + + return is_enabled; +} + +void AtkUtilAuraLinux::FinishAccessibilityInitOnUIThread() { + if (!is_enabled_) { + VLOG(1) << "Will not enable ATK accessibility support."; + return; + } + + DCHECK(g_accessibility_module_init); + g_accessibility_module_init(); +} + +#else + +void AtkUtilAuraLinux::CheckIfAccessibilityIsEnabledOnFileThread() { +} + +void AtkUtilAuraLinux::FinishAccessibilityInitOnUIThread() { +} + +#endif // defined(USE_GCONF) + } // namespace ui
diff --git a/ui/accessibility/platform/atk_util_auralinux.h b/ui/accessibility/platform/atk_util_auralinux.h index a5bc75d..8342a129 100644 --- a/ui/accessibility/platform/atk_util_auralinux.h +++ b/ui/accessibility/platform/atk_util_auralinux.h
@@ -29,6 +29,14 @@ private: friend struct base::DefaultSingletonTraits<AtkUtilAuraLinux>; + + void CheckIfAccessibilityIsEnabledOnFileThread(); + bool CheckPlatformAccessibilitySupportOnFileThread(); + void FinishAccessibilityInitOnUIThread(); + +#if defined(USE_GCONF) + bool is_enabled_; +#endif }; } // namespace ui
diff --git a/ui/arc/notification/arc_notification_item.cc b/ui/arc/notification/arc_notification_item.cc index e13e455..f80d0308 100644 --- a/ui/arc/notification/arc_notification_item.cc +++ b/ui/arc/notification/arc_notification_item.cc
@@ -110,11 +110,11 @@ switch (data.type) { case ArcNotificationType::BASIC: - type = message_center::NOTIFICATION_TYPE_SIMPLE; + type = message_center::NOTIFICATION_TYPE_BASE_FORMAT; break; case ArcNotificationType::IMAGE: // TODO(yoshiki): Implement this types. - type = message_center::NOTIFICATION_TYPE_SIMPLE; + type = message_center::NOTIFICATION_TYPE_BASE_FORMAT; LOG(ERROR) << "Unsupported notification type: image"; break; case ArcNotificationType::PROGRESS:
diff --git a/ui/gfx/blit_unittest.cc b/ui/gfx/blit_unittest.cc index e6245916..12c6c401 100644 --- a/ui/gfx/blit_unittest.cc +++ b/ui/gfx/blit_unittest.cc
@@ -21,7 +21,7 @@ // 0x00000000 0x01010101 // 0x12121212 0xFFFFFFFF template <int w, int h> -void SetToCanvas(skia::PlatformCanvas* canvas, uint8_t values[h][w]) { +void SetToCanvas(SkCanvas* canvas, uint8_t values[h][w]) { ASSERT_EQ(w, canvas->imageInfo().width()); ASSERT_EQ(h, canvas->imageInfo().height()); @@ -44,7 +44,7 @@ // values, where each value has been duplicated into each channel of the given // bitmap (see SetToCanvas above). template <int w, int h> -void VerifyCanvasValues(skia::PlatformCanvas* canvas, uint8_t values[h][w]) { +void VerifyCanvasValues(SkCanvas* canvas, uint8_t values[h][w]) { SkBitmap bitmap = skia::ReadPixels(canvas); SkAutoLockPixels lock(bitmap); ASSERT_EQ(w, bitmap.width());
diff --git a/ui/gfx/canvas.h b/ui/gfx/canvas.h index 311cf38..dd30d54 100644 --- a/ui/gfx/canvas.h +++ b/ui/gfx/canvas.h
@@ -409,7 +409,7 @@ const Rect& display_rect, int flags); - skia::PlatformCanvas* platform_canvas() { return owned_canvas_.get(); } + SkCanvas* platform_canvas() { return owned_canvas_.get(); } SkCanvas* sk_canvas() { return canvas_; } float image_scale() const { return image_scale_; } @@ -439,7 +439,7 @@ // Canvas::Scale() does not affect |image_scale_|. float image_scale_; - skia::RefPtr<skia::PlatformCanvas> owned_canvas_; + skia::RefPtr<SkCanvas> owned_canvas_; SkCanvas* canvas_; DISALLOW_COPY_AND_ASSIGN(Canvas);
diff --git a/ui/gfx/canvas_paint_mac.mm b/ui/gfx/canvas_paint_mac.mm index cc1c6a4..cc926d2 100644 --- a/ui/gfx/canvas_paint_mac.mm +++ b/ui/gfx/canvas_paint_mac.mm
@@ -60,7 +60,7 @@ gfx::Size size(NSWidth(rectangle_), NSHeight(rectangle_)); RecreateBackingCanvas(size, scale, opaque); - skia::PlatformCanvas* canvas = platform_canvas(); + SkCanvas* canvas = sk_canvas(); canvas->clear(SkColorSetARGB(0, 0, 0, 0)); // Need to translate so that the dirty region appears at the origin of the
diff --git a/ui/gl/gl_unittests_apk.isolate b/ui/gl/gl_unittests_apk.isolate index 1032ef6..03c9847 100644 --- a/ui/gl/gl_unittests_apk.isolate +++ b/ui/gl/gl_unittests_apk.isolate
@@ -8,6 +8,7 @@ 'variables': { 'command': [ '<(PRODUCT_DIR)/bin/run_gl_unittests', + '--logcat-output-dir', '${ISOLATED_OUTDIR}/logcats', ], 'files': [ '<(PRODUCT_DIR)/bin/run_gl_unittests',
diff --git a/ui/surface/transport_dib_posix.cc b/ui/surface/transport_dib_posix.cc index be1a373..aada735 100644 --- a/ui/surface/transport_dib_posix.cc +++ b/ui/surface/transport_dib_posix.cc
@@ -57,8 +57,7 @@ return base::SharedMemory::IsHandleValid(dib); } -skia::PlatformCanvas* TransportDIB::GetPlatformCanvas(int w, int h, - bool opaque) { +SkCanvas* TransportDIB::GetPlatformCanvas(int w, int h, bool opaque) { if ((!memory() && !Map()) || !VerifyCanvasSize(w, h)) return NULL; return skia::CreatePlatformCanvas(w, h, opaque,
diff --git a/ui/surface/transport_dib_win.cc b/ui/surface/transport_dib_win.cc index 82eabf87..f002f55 100644 --- a/ui/surface/transport_dib_win.cc +++ b/ui/surface/transport_dib_win.cc
@@ -58,7 +58,7 @@ return dib.IsValid(); } -skia::PlatformCanvas* TransportDIB::GetPlatformCanvas(int w, int h, +SkCanvas* TransportDIB::GetPlatformCanvas(int w, int h, bool opaque) { // This DIB already mapped the file into this process, but PlatformCanvas // will map it again. @@ -67,7 +67,7 @@ // We can't check the canvas size before mapping, but it's safe because // Windows will fail to map the section if the dimensions of the canvas // are too large. - skia::PlatformCanvas* canvas = skia::CreatePlatformCanvas( + SkCanvas* canvas = skia::CreatePlatformCanvas( w, h, opaque, shared_memory_.handle().GetHandle(), skia::RETURN_NULL_ON_FAILURE);
diff --git a/ui/views/cocoa/bridged_native_widget.mm b/ui/views/cocoa/bridged_native_widget.mm index 193a5c7..6a4971bb 100644 --- a/ui/views/cocoa/bridged_native_widget.mm +++ b/ui/views/cocoa/bridged_native_widget.mm
@@ -293,11 +293,7 @@ } BridgedNativeWidget::~BridgedNativeWidget() { - RemoveOrDestroyChildren(); - DCHECK(child_windows_.empty()); - SetFocusManager(NULL); - SetRootView(NULL); - DestroyCompositor(); + bool close_window = false; if ([window_ delegate]) { // If the delegate is still set on a modal dialog, it means it was not // closed via [NSApplication endSheet:]. This is probably OK if the widget @@ -308,12 +304,31 @@ // So ban it. Modal dialogs should be closed via Widget::Close(). DCHECK(!native_widget_mac_->IsWindowModalSheet()); - // If the delegate is still set, it means OnWindowWillClose has not been - // called and the window is still open. Calling -[NSWindow close] will - // synchronously call OnWindowWillClose and notify NativeWidgetMac. + // If the delegate is still set, it means OnWindowWillClose() has not been + // called and the window is still open. Usually, -[NSWindow close] would + // synchronously call OnWindowWillClose() which removes the delegate and + // notifies NativeWidgetMac, which then calls this with a nil delegate. + // For other teardown flows (e.g. Widget::WIDGET_OWNS_NATIVE_WIDGET or + // Widget::CloseNow()) the delegate must first be cleared to avoid AppKit + // calling back into the bridge. This means OnWindowWillClose() needs to be + // invoked manually, which is done below. + // Note that if the window has children it can't be closed until the + // children are gone, but removing child windows calls into AppKit for the + // parent window, so the delegate must be cleared first. + [window_ setDelegate:nil]; + close_window = true; + } + + RemoveOrDestroyChildren(); + DCHECK(child_windows_.empty()); + SetFocusManager(nullptr); + SetRootView(nullptr); + DestroyCompositor(); + + if (close_window) { + OnWindowWillClose(); [window_ close]; } - DCHECK(![window_ delegate]); } void BridgedNativeWidget::Init(base::scoped_nsobject<NSWindow> window,
diff --git a/ui/views/cocoa/bridged_native_widget_unittest.mm b/ui/views/cocoa/bridged_native_widget_unittest.mm index d289af5..5d428c0 100644 --- a/ui/views/cocoa/bridged_native_widget_unittest.mm +++ b/ui/views/cocoa/bridged_native_widget_unittest.mm
@@ -430,22 +430,22 @@ // Test getting complete string using text input protocol. TEST_F(BridgedNativeWidgetTest, TextInput_GetCompleteString) { - const std::string kTestString = "foo bar baz"; - InstallTextField(kTestString); + const std::string test_string = "foo bar baz"; + InstallTextField(test_string); - NSRange range = NSMakeRange(0, kTestString.size()); + NSRange range = NSMakeRange(0, test_string.size()); NSRange actual_range; NSAttributedString* text = [ns_view_ attributedSubstringForProposedRange:range actualRange:&actual_range]; - EXPECT_EQ(kTestString, SysNSStringToUTF8([text string])); + EXPECT_EQ(test_string, SysNSStringToUTF8([text string])); EXPECT_EQ_RANGE(range, actual_range); } // Test getting middle substring using text input protocol. TEST_F(BridgedNativeWidgetTest, TextInput_GetMiddleSubstring) { - const std::string kTestString = "foo bar baz"; - InstallTextField(kTestString); + const std::string test_string = "foo bar baz"; + InstallTextField(test_string); NSRange range = NSMakeRange(4, 3); NSRange actual_range; @@ -458,8 +458,8 @@ // Test getting ending substring using text input protocol. TEST_F(BridgedNativeWidgetTest, TextInput_GetEndingSubstring) { - const std::string kTestString = "foo bar baz"; - InstallTextField(kTestString); + const std::string test_string = "foo bar baz"; + InstallTextField(test_string); NSRange range = NSMakeRange(8, 100); NSRange actual_range; @@ -473,8 +473,8 @@ // Test getting empty substring using text input protocol. TEST_F(BridgedNativeWidgetTest, TextInput_GetEmptySubstring) { - const std::string kTestString = "foo bar baz"; - InstallTextField(kTestString); + const std::string test_string = "foo bar baz"; + InstallTextField(test_string); NSRange range = EmptyRange(); NSRange actual_range; @@ -487,21 +487,21 @@ // Test inserting text using text input protocol. TEST_F(BridgedNativeWidgetTest, TextInput_InsertText) { - const std::string kTestString = "foo"; - InstallTextField(kTestString); + const std::string test_string = "foo"; + InstallTextField(test_string); - [ns_view_ insertText:SysUTF8ToNSString(kTestString) + [ns_view_ insertText:SysUTF8ToNSString(test_string) replacementRange:EmptyRange()]; - gfx::Range range(0, kTestString.size()); + gfx::Range range(0, test_string.size()); base::string16 text; EXPECT_TRUE([ns_view_ textInputClient]->GetTextFromRange(range, &text)); - EXPECT_EQ(ASCIIToUTF16(kTestString), text); + EXPECT_EQ(ASCIIToUTF16(test_string), text); } // Test replacing text using text input protocol. TEST_F(BridgedNativeWidgetTest, TextInput_ReplaceText) { - const std::string kTestString = "foo bar"; - InstallTextField(kTestString); + const std::string test_string = "foo bar"; + InstallTextField(test_string); [ns_view_ insertText:@"baz" replacementRange:NSMakeRange(4, 3)]; EXPECT_EQ("foo baz", GetText()); @@ -509,8 +509,8 @@ // Test IME composition using text input protocol. TEST_F(BridgedNativeWidgetTest, TextInput_Compose) { - const std::string kTestString = "foo "; - InstallTextField(kTestString); + const std::string test_string = "foo "; + InstallTextField(test_string); EXPECT_FALSE([ns_view_ hasMarkedText]); EXPECT_EQ_RANGE(EmptyRange(), [ns_view_ markedRange]); @@ -522,9 +522,9 @@ selectedRange:NSMakeRange(0, 2) replacementRange:EmptyRange()]; EXPECT_TRUE([ns_view_ hasMarkedText]); - EXPECT_EQ_RANGE(NSMakeRange(kTestString.size(), compositionLength), + EXPECT_EQ_RANGE(NSMakeRange(test_string.size(), compositionLength), [ns_view_ markedRange]); - EXPECT_EQ_RANGE(NSMakeRange(kTestString.size(), 2), [ns_view_ selectedRange]); + EXPECT_EQ_RANGE(NSMakeRange(test_string.size(), 2), [ns_view_ selectedRange]); // Confirm composition. [ns_view_ unmarkText]; @@ -653,16 +653,16 @@ InstallTextField(""); ui::TextInputClient* client = [ns_view_ textInputClient]; - const base::string16 kTestString = base::ASCIIToUTF16("test_str"); + const base::string16 test_string = base::ASCIIToUTF16("test_str"); const size_t kTextLength = 8; - SetCompositionText(client, kTestString, 1, nullptr); + SetCompositionText(client, test_string, 1, nullptr); // Query bounds for the whole composition string. NSRange query_range = NSMakeRange(0, kTextLength); NSRange actual_range; NSRect rect = [ns_view_ firstRectForCharacterRange:query_range actualRange:&actual_range]; - EXPECT_EQ(GetExpectedBoundsForRange(client, kTestString, query_range), + EXPECT_EQ(GetExpectedBoundsForRange(client, test_string, query_range), gfx::ScreenRectFromNSRect(rect)); EXPECT_EQ_RANGE(query_range, actual_range); @@ -670,7 +670,7 @@ query_range = NSMakeRange(1, 4); rect = [ns_view_ firstRectForCharacterRange:query_range actualRange:&actual_range]; - EXPECT_EQ(GetExpectedBoundsForRange(client, kTestString, query_range), + EXPECT_EQ(GetExpectedBoundsForRange(client, test_string, query_range), gfx::ScreenRectFromNSRect(rect)); EXPECT_EQ_RANGE(query_range, actual_range); }
diff --git a/ui/views/cocoa/native_widget_mac_nswindow.mm b/ui/views/cocoa/native_widget_mac_nswindow.mm index 678e4d5..4acbd94 100644 --- a/ui/views/cocoa/native_widget_mac_nswindow.mm +++ b/ui/views/cocoa/native_widget_mac_nswindow.mm
@@ -5,6 +5,7 @@ #import "ui/views/cocoa/native_widget_mac_nswindow.h" #include "base/mac/foundation_util.h" +#import "ui/views/cocoa/bridged_native_widget.h" #import "ui/base/cocoa/user_interface_item_command_handler.h" #import "ui/views/cocoa/views_nswindow_delegate.h" #include "ui/views/controls/menu/menu_controller.h" @@ -83,9 +84,17 @@ if (![self delegate]) return NO; - // Dialogs shouldn't take large shadows away from their parent window. + // Dialogs and bubbles shouldn't take large shadows away from their parent. views::Widget* widget = [self viewsWidget]; - return widget->CanActivate() && !widget->IsDialogBox(); + return widget->CanActivate() && + !views::NativeWidgetMac::GetBridgeForNativeWindow(self)->parent(); +} + +// Lets the traffic light buttons on the parent window keep their active state. +- (BOOL)_sharesParentKeyState { + // Follow -canBecomeMainWindow unless the window provides its own buttons. + return ([self styleMask] & NSClosableWindowMask) == 0 && + ![self canBecomeMainWindow]; } // Override sendEvent to allow key events to be forwarded to a toolkit-views
diff --git a/ui/views/controls/button/image_button.cc b/ui/views/controls/button/image_button.cc index e9d4f36c..fdaa275 100644 --- a/ui/views/controls/button/image_button.cc +++ b/ui/views/controls/button/image_button.cc
@@ -47,9 +47,11 @@ return images_[state]; } -void ImageButton::SetImage(ButtonState state, const gfx::ImageSkia* image) { - images_[state] = image ? *image : gfx::ImageSkia(); +void ImageButton::SetImage(ButtonState for_state, const gfx::ImageSkia* image) { + images_[for_state] = image ? *image : gfx::ImageSkia(); PreferredSizeChanged(); + if (state() == for_state) + SchedulePaint(); } void ImageButton::SetBackground(SkColor color,
diff --git a/ui/views/mus/window_manager_connection.h b/ui/views/mus/window_manager_connection.h index d7b9e82..308e7ab0 100644 --- a/ui/views/mus/window_manager_connection.h +++ b/ui/views/mus/window_manager_connection.h
@@ -40,7 +40,7 @@ mus::Window* NewWindow(const std::map<std::string, std::vector<uint8_t>>& properties); - mus::mojom::WindowManager* window_manager() { + mus::mojom::WindowManagerDeprecated* window_manager() { return window_manager_.get(); } @@ -59,7 +59,7 @@ internal::NativeWidgetDelegate* delegate); mojo::ApplicationImpl* app_; - mus::mojom::WindowManagerPtr window_manager_; + mus::mojom::WindowManagerDeprecatedPtr window_manager_; scoped_ptr<ScreenMus> screen_; scoped_ptr<mus::WindowTreeConnection> window_tree_connection_;
diff --git a/ui/views/widget/native_widget_mac_interactive_uitest.mm b/ui/views/widget/native_widget_mac_interactive_uitest.mm index 8f192662..88d51e238 100644 --- a/ui/views/widget/native_widget_mac_interactive_uitest.mm +++ b/ui/views/widget/native_widget_mac_interactive_uitest.mm
@@ -6,6 +6,7 @@ #import <Cocoa/Cocoa.h> +#import "base/mac/mac_util.h" #import "base/mac/scoped_nsobject.h" #include "base/macros.h" #import "ui/base/test/windowed_nsnotification_observer.h" @@ -133,6 +134,83 @@ widget->CloseNow(); } +namespace { + +// Show |widget| and wait for it to become the key window. +void ShowKeyWindow(Widget* widget) { + base::scoped_nsobject<WindowedNSNotificationObserver> waiter( + [[WindowedNSNotificationObserver alloc] + initForNotification:NSWindowDidBecomeKeyNotification + object:widget->GetNativeWindow()]); + widget->Show(); + EXPECT_TRUE([waiter wait]); + EXPECT_TRUE([widget->GetNativeWindow() isKeyWindow]); +} + +NSData* ViewAsTIFF(NSView* view) { + NSBitmapImageRep* bitmap = + [view bitmapImageRepForCachingDisplayInRect:[view bounds]]; + [view cacheDisplayInRect:[view bounds] toBitmapImageRep:bitmap]; + return [bitmap TIFFRepresentation]; +} + +} // namespace + +// Test that parent windows keep their traffic lights enabled when showing +// dialogs. +TEST_F(NativeWidgetMacInteractiveUITest, ParentWindowTrafficLights) { + // Snow leopard doesn't have -[NSWindow _sharesParentKeyState]. + if (base::mac::IsOSSnowLeopard()) + return; + + Widget* parent_widget = CreateTopLevelPlatformWidget(); + parent_widget->SetBounds(gfx::Rect(100, 100, 100, 100)); + ShowKeyWindow(parent_widget); + + NSWindow* parent = parent_widget->GetNativeWindow(); + EXPECT_TRUE([parent isMainWindow]); + + NSButton* button = [parent standardWindowButton:NSWindowCloseButton]; + EXPECT_TRUE(button); + NSData* active_button_image = ViewAsTIFF(button); + EXPECT_TRUE(active_button_image); + + // Create an activatable frameless child. Frameless so that it doesn't have + // traffic lights of its own, and activatable so that it can take key status. + Widget* child_widget = new Widget; + Widget::InitParams params(Widget::InitParams::TYPE_WINDOW_FRAMELESS); + params.native_widget = new NativeWidgetMac(child_widget); + params.bounds = gfx::Rect(130, 130, 100, 100); + params.parent = parent_widget->GetNativeView(); + child_widget->Init(params); + ShowKeyWindow(child_widget); + + // Ensure the button instance is still valid. + EXPECT_EQ(button, [parent standardWindowButton:NSWindowCloseButton]); + + // Parent window should still be main, and have its traffic lights active. + EXPECT_TRUE([parent isMainWindow]); + EXPECT_FALSE([parent isKeyWindow]); + + // Enabled status doesn't actually change, but check anyway. + EXPECT_TRUE([button isEnabled]); + NSData* button_image_with_child = ViewAsTIFF(button); + EXPECT_TRUE([active_button_image isEqualToData:button_image_with_child]); + + // Verify that activating some other random window does change the button. + Widget* other_widget = CreateTopLevelPlatformWidget(); + other_widget->SetBounds(gfx::Rect(200, 200, 100, 100)); + ShowKeyWindow(other_widget); + EXPECT_FALSE([parent isMainWindow]); + EXPECT_FALSE([parent isKeyWindow]); + EXPECT_TRUE([button isEnabled]); + NSData* inactive_button_image = ViewAsTIFF(button); + EXPECT_FALSE([active_button_image isEqualToData:inactive_button_image]); + + other_widget->CloseNow(); + parent_widget->CloseNow(); +} + INSTANTIATE_TEST_CASE_P(NativeWidgetMacInteractiveUITestInstance, NativeWidgetMacInteractiveUITest, ::testing::Bool());
diff --git a/ui/views/widget/native_widget_mac_unittest.mm b/ui/views/widget/native_widget_mac_unittest.mm index b8d29dde..cb9046f1 100644 --- a/ui/views/widget/native_widget_mac_unittest.mm +++ b/ui/views/widget/native_widget_mac_unittest.mm
@@ -22,6 +22,7 @@ #import "ui/events/test/cocoa_test_event_utils.h" #include "ui/events/test/event_generator.h" #import "ui/gfx/mac/coordinate_conversion.h" +#include "ui/views/bubble/bubble_delegate.h" #import "ui/views/cocoa/bridged_native_widget.h" #import "ui/views/cocoa/native_widget_mac_nswindow.h" #include "ui/views/controls/button/label_button.h" @@ -918,6 +919,94 @@ parent_widget->CloseNow(); } +// Attaches a child window to |parent| that checks its parent's delegate is +// cleared when the child is destroyed. This assumes the child is destroyed via +// destruction of its parent. +class ParentCloseMonitor : public WidgetObserver { + public: + explicit ParentCloseMonitor(Widget* parent) { + Widget* child = new Widget(); + child->AddObserver(this); + Widget::InitParams init_params(Widget::InitParams::TYPE_WINDOW_FRAMELESS); + init_params.parent = parent->GetNativeView(); + init_params.bounds = gfx::Rect(100, 100, 100, 100); + init_params.native_widget = new NativeWidgetCapture(child); + child->Init(init_params); + child->Show(); + + // NSWindow parent/child relationship should be established on Show() and + // the parent should have a delegate. Retain the parent since it can't be + // retrieved from the child while it is being destroyed. + parent_nswindow_.reset([[child->GetNativeWindow() parentWindow] retain]); + EXPECT_TRUE(parent_nswindow_); + EXPECT_TRUE([parent_nswindow_ delegate]); + } + + ~ParentCloseMonitor() override { + EXPECT_TRUE(child_closed_); // Otherwise the observer wasn't removed. + } + + void OnWidgetDestroying(Widget* child) override { + // Upon a parent-triggered close, the NSWindow relationship will already be + // removed. The parent should still be open (children are always closed + // first), but not have a delegate (since it is being torn down). + EXPECT_FALSE([child->GetNativeWindow() parentWindow]); + EXPECT_TRUE([parent_nswindow_ isVisible]); + EXPECT_FALSE([parent_nswindow_ delegate]); + + EXPECT_FALSE(child_closed_); + child->RemoveObserver(this); + child_closed_ = true; + } + + bool child_closed() const { return child_closed_; } + + private: + base::scoped_nsobject<NSWindow> parent_nswindow_; + bool child_closed_ = false; + + DISALLOW_COPY_AND_ASSIGN(ParentCloseMonitor); +}; + +// Ensures when a parent window is destroyed, and triggers its child windows to +// be closed, that the child windows (via AppKit) do not attempt to call back +// into the parent, whilst it's in the process of being destroyed. +TEST_F(NativeWidgetMacTest, NoParentDelegateDuringTeardown) { + // First test "normal" windows and AppKit close. + { + Widget* parent = CreateTopLevelPlatformWidget(); + parent->SetBounds(gfx::Rect(100, 100, 300, 200)); + parent->Show(); + ParentCloseMonitor monitor(parent); + [parent->GetNativeWindow() close]; + EXPECT_TRUE(monitor.child_closed()); + } + + // Test the Widget::CloseNow() flow. + { + Widget* parent = CreateTopLevelPlatformWidget(); + parent->SetBounds(gfx::Rect(100, 100, 300, 200)); + parent->Show(); + ParentCloseMonitor monitor(parent); + parent->CloseNow(); + EXPECT_TRUE(monitor.child_closed()); + } + + // Test the WIDGET_OWNS_NATIVE_WIDGET flow. + { + scoped_ptr<Widget> parent(new Widget); + Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_WINDOW); + params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; + params.bounds = gfx::Rect(100, 100, 300, 200); + parent->Init(params); + parent->Show(); + + ParentCloseMonitor monitor(parent.get()); + parent.reset(); + EXPECT_TRUE(monitor.child_closed()); + } +} + // Tests Cocoa properties that should be given to particular widget types. TEST_F(NativeWidgetMacTest, NativeProperties) { // Create a regular widget (TYPE_WINDOW). @@ -938,6 +1027,20 @@ // Dialogs shouldn't take main status away from their parent. EXPECT_FALSE([dialog_widget->GetNativeWindow() canBecomeMainWindow]); + // Create a bubble widget with a parent: also shouldn't get main. + BubbleDelegateView* bubble_view = new BubbleDelegateView(); + bubble_view->set_parent_window(regular_widget->GetNativeView()); + Widget* bubble_widget = BubbleDelegateView::CreateBubble(bubble_view); + EXPECT_TRUE([bubble_widget->GetNativeWindow() canBecomeKeyWindow]); + EXPECT_FALSE([bubble_widget->GetNativeWindow() canBecomeMainWindow]); + + // But a bubble without a parent should still be able to become main. + Widget* toplevel_bubble_widget = + BubbleDelegateView::CreateBubble(new BubbleDelegateView()); + EXPECT_TRUE([toplevel_bubble_widget->GetNativeWindow() canBecomeKeyWindow]); + EXPECT_TRUE([toplevel_bubble_widget->GetNativeWindow() canBecomeMainWindow]); + + toplevel_bubble_widget->CloseNow(); regular_widget->CloseNow(); }
diff --git a/ui/views/widget/widget.cc b/ui/views/widget/widget.cc index 895b5e1f9..88a68da 100644 --- a/ui/views/widget/widget.cc +++ b/ui/views/widget/widget.cc
@@ -129,7 +129,6 @@ show_state(ui::SHOW_STATE_DEFAULT), parent(nullptr), native_widget(nullptr), - native_theme(nullptr), desktop_window_tree_host(nullptr), layer_type(ui::LAYER_TEXTURED), context(nullptr), @@ -145,7 +144,6 @@ Widget::Widget() : native_widget_(nullptr), - native_theme_(nullptr), widget_delegate_(nullptr), non_client_view_(nullptr), dragged_view_(nullptr), @@ -346,7 +344,6 @@ internal::NativeWidgetPrivate::IsMouseButtonDown(); } native_widget_->InitNativeWidget(params); - native_theme_ = params.native_theme; if (RequiresNonClientView(params.type)) { non_client_view_ = new NonClientView; non_client_view_->SetFrameView(CreateNonClientFrameView()); @@ -751,7 +748,7 @@ } const ui::NativeTheme* Widget::GetNativeTheme() const { - return native_theme_? native_theme_ : native_widget_->GetNativeTheme(); + return native_widget_->GetNativeTheme(); } FocusManager* Widget::GetFocusManager() {
diff --git a/ui/views/widget/widget.h b/ui/views/widget/widget.h index 54c6d29..11778fd 100644 --- a/ui/views/widget/widget.h +++ b/ui/views/widget/widget.h
@@ -241,8 +241,6 @@ // When set, this value is used as the Widget's NativeWidget implementation. // The Widget will not construct a default one. Default is NULL. NativeWidget* native_widget; - // If provided, sets the native theme for this widget. - ui::NativeTheme* native_theme; // 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 @@ -564,7 +562,7 @@ return const_cast<ui::NativeTheme*>( const_cast<const Widget*>(this)->GetNativeTheme()); } - const ui::NativeTheme* GetNativeTheme() const; + virtual const ui::NativeTheme* GetNativeTheme() const; // Returns the FocusManager for this widget. // Note that all widgets in a widget hierarchy share the same focus manager. @@ -865,10 +863,6 @@ internal::NativeWidgetPrivate* native_widget_; - // If non-null, the native theme for this widget. Otherwise the native theme - // comes from |native_widget_|. - ui::NativeTheme* native_theme_; - base::ObserverList<WidgetObserver> observers_; base::ObserverList<WidgetRemovalsObserver> removals_observers_;